iPython上でPillowを使ってみる（その3）


## Pillowの作業フロー（その3）
1. Image.open で画像を読み込む
2. 画像をグレースケールに変換する
3. 画像をゴニョゴニョする
4. Image.save で編集した画像を保存する

```py3:
%pylab inline
from PIL import Image,ImageDraw,ImageFont
img = Image.open('work-image/lena.jpg')
pl_img = np.array(img) ; plt.imshow( pl_img ) # 表示
```
![lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/cd6e9cbd-3b6e-e171-79b9-1c8a6f954414.jpeg)

```py3:
# グレースケールに変換
gray_img = img.convert("L")

# 意図した表示にならない
pl_img = np.array(gray_img) ; plt.imshow( pl_img ) # 表示

# ファイルの情報表示
print('size    : ', gray_img.size)
print('format  : ', gray_img.format) 
print('mode    : ', gray_img.mode) 
print('palette : ', gray_img.palette) 
print('info    : ', gray_img.info) 

# こうしなければならんらしい
import matplotlib.cm as cm
plt.imshow(pl_img, cmap = cm.Greys_r)
```

![gray_lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/c0afc712-cc21-b73f-dc62-3894a96ae9ba.jpeg)

さて、今回はフィルタ処理です
### 組み込みフィルタ
はじめは組み込みフィルタから

```py3:
from PIL import ImageFilter, ImageOps
```

```py3:
# ぼかし
pl_img = np.array(gray_img.filter(ImageFilter.BLUR)); plt.imshow(pl_img, cmap = cm.Greys_r)
```
![blur-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/c0794e9a-4ed2-8c4e-f8e5-5fa9aac6c8c3.png)

```py3:
# 輪郭抽出
pl_img = np.array(gray_img.filter(ImageFilter.CONTOUR)); plt.imshow(pl_img, cmap = cm.Greys_r)
```

![contour-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/26b6a0a9-4914-8d95-0e56-3d99c2f1240d.png)


```py3:
# エンボス加工
pl_img = np.array(filter_img = gray_img.filter(ImageFilter.EMBOSS)); plt.imshow(pl_img, cmap = cm.Greys_r)
```
![emboss-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/06c336d4-7d1f-7f8b-b9f0-909542c41a1f.png)

```py3:
# 最小値フィルタ
pl_img = np.array(gray_img.filter(ImageFilter.MinFilter(5))); plt.imshow(pl_img, cmap = cm.Greys_r)
```

![minf-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/0dcf2a49-551c-92b1-eed0-d5869bf6ff5c.png)

### 自前のフィルタ
理論的なことは後で書く（本当に書くのか？）

```py3:
# 縦方向のエッジを検出
flist =  [1,   1,  1,
          0,   0,  0,
         -1,  -1, -1]

flt = ImageFilter.Kernel((3, 3), flist, scale=1)
filter_img = gray_img.filter(flt)

pl_img = np.array(filter_img) ; plt.imshow(pl_img, cmap = cm.Greys_r)
```

![filter01-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/e63c1766-2c8f-ab98-7279-cf97303a3391.png)

```py3:
# 横方向のエッジを検出
flist =  [1,   0, -1,
          1,   0, -1,
          1,   0, -1]
flt = ImageFilter.Kernel((3, 3), flist, scale=1)
filter_img = gray_img.filter(flt)

pl_img = np.array(filter_img) ; plt.imshow(pl_img, cmap = cm.Greys_r)
```
![filter02-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/21200ae3-9ac2-3559-16b0-ecb6876ef6ee.png)

```py3:
# 4傍近接ラプラシアン
flist = [0,  1, 0,
         1, -4, 1,
         0,  1, 0]
flt = ImageFilter.Kernel((3, 3), flist, scale=1)
filter_img = gray_img.filter(flt)

pl_img = np.array(filter_img) ; plt.imshow(pl_img, cmap = cm.Greys_r)
```
![filter03-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/22ca8f05-859c-e8ba-9c4f-10b8f3a319dd.png)

```py3:
# 8傍近接ラプラシアン
flist = [1,  1, 1,
         1, -8, 1,
         1,  1, 1]
flt = ImageFilter.Kernel((3, 3), flist, scale=1)
filter_img = gray_img.filter(flt)

pl_img = np.array(filter_img) ; plt.imshow(pl_img, cmap = cm.Greys_r)

filter_img.save('work-image/filter05-lena.png') 
```
![filter04-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/3f393a3e-ec60-c7bb-0859-320e8eb7011c.png)

```py3:
# 8傍近接ラプラシアンの利用例
flist = [0.4,  0.4, 0.4,
         0.4, -2.2, 0.4,
         0.4,  0.4, 0.4]
flt = ImageFilter.Kernel((3, 3), flist, scale=1)
filter_img = gray_img.filter(flt)

pl_img = np.array(filter_img) ; plt.imshow(pl_img, cmap = cm.Greys_r)
```
![filter05-lena.png](https://qiita-image-store.s3.amazonaws.com/0/26107/d6ebedbf-d35c-a0b5-bf79-52130363fde8.png)


↓nbviewerにノートブックをあげてみました（こっちがメイン）
[nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow03.ipynb](http://nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow03.ipynb "nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow03.ipynb")

↓作業環境については、こちら
[Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita](http://qiita.com/suto3/items/ab506c238d4b58cdfd88 "Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita")

[iPython上でPillowを使ってみる（その1） - Qiita](http://qiita.com/suto3/items/2232c7e6885f5d97bfec "iPython上でPillowを使ってみる（その1） - Qiita")

[iPython上でPillowを使ってみる（その2） - Qiita](http://qiita.com/suto3/items/4ac51a91b28fc5092eaf "iPython上でPillowを使ってみる（その2） - Qiita")