Pillowの基本トピック
Pillowの概要
Pillow
(PIL; Python Imaging Library)はPython
で画像処理(image processing)を行うにあたって用いられるライブラリです。
インストールと基本コードの実行
Pillow
は下記を実行することでPyPIから入手かつインストールが可能です。
$ pip install pillow
たとえば下記を実行することによって、NumPy
形式の配列をPillow
の形式に変換することができます。
import numpy as np
from PIL import Image
img_1 = np.zeros([100, 100])
img_2 = Image.fromarray(img_1)
print(type(img_1))
print(img_1.shape)
print(type(img_2))
・実行結果
<class 'numpy.ndarray'>
(100, 100)
<class 'PIL.Image.Image'>
上記の実行結果より、PIL.Image.fromarray
を用いることによってNumPy
形式の配列をPillow
の形式に変換できることが確認できます。
サンプル画像のロード
Pillow
を用いてサンプル画像のロードを行う場合、下記のようにPIL.Image.open
を用いれば良いです。
import numpy as np
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
img_np = np.array(img)
print(type(img))
print(img.info.items())
print(type(img_np))
・実行結果
<class 'PIL.Image.Image'>
dict_items([('jfif', 257), ('jfif_version', (1, 1)), ('jfif_unit', 0), ('jfif_density', (1, 1))])
<class 'numpy.ndarray'>
Pillowを用いたData Augmentationの実装
以下、Pillow
を用いたDeepLearningにおけるデータ拡張(Data Augmentation)の実装について確認します。
回転
Pillow
を用いた回転は下記のように実装することができます。
import numpy as np
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = img.rotate(25)
dst_2 = img.rotate(25, expand=True)
dst_3 = img.transpose(Image.FLIP_LEFT_RIGHT)
dst_1.save("./png/rotate1.jpg", "JPEG")
dst_2.save("./png/rotate2.jpg", "JPEG")
dst_3.save("./png/rotate3.jpg", "JPEG")
Shear
\begin{align}
\left(\begin{array}{c} x' \\ y' \\ 1 \end{array} \right) &= A \left(\begin{array}{c} x \\ y \\ 1 \end{array} \right) \\
A = \left(\begin{array}{ccc} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{array} \right) &= \left(\begin{array}{ccc} 1 & \tan{\theta_x} & 0 \\ \tan{\theta_y} & 1 & 0 \\ 0 & 0 & 1 \end{array} \right)
\end{align}
Shearは上記の数式で表されるAffine変換を用いて下記のように実装されます。
import numpy as np
import PIL
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = img.transform(img.size, PIL.Image.AFFINE, (1, 0.1, 0, 0, 1, 0))
dst_2 = img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, 0.1, 1, 0))
dst_3 = img.transform(img.size, PIL.Image.AFFINE, (1, -0.1, 0, 0, 1, 0))
dst_1.save("./png/shear1.jpg", "JPEG")
dst_2.save("./png/shear2.jpg", "JPEG")
dst_3.save("./png/shear3.jpg", "JPEG")
img.transform
の引数には数式の$a$〜$f$を(a, b, c, d, e, f)
のようなタプルの形式で与えることは抑えておくと良いと思います。
Sharpness
画像のシャープネス(sharpness)は画像の輪郭を強調する処理です。基本的には微分フィルタを用いたエッジ検出と同様の処理であると理解しておけば良いと思います。Pillow
では下記のような処理によってシャープネス処理を行うことができます。
import numpy as np
import PIL.ImageEnhance
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageEnhance.Sharpness(img).enhance(5)
dst_2 = PIL.ImageEnhance.Sharpness(img).enhance(20)
dst_3 = PIL.ImageEnhance.Sharpness(img).enhance(-2)
dst_1.save("./png/sharpness1.jpg", "JPEG")
dst_2.save("./png/sharpness2.jpg", "JPEG")
dst_3.save("./png/sharpness3.jpg", "JPEG")
コントラスト(Contrast)
import numpy as np
import PIL.ImageEnhance
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageEnhance.Contrast(img).enhance(2)
dst_2 = PIL.ImageEnhance.Contrast(img).enhance(10)
dst_3 = PIL.ImageEnhance.Contrast(img).enhance(-1)
dst_1.save("./png/contrast1.jpg", "JPEG")
dst_2.save("./png/contrast2.jpg", "JPEG")
dst_3.save("./png/contrast3.jpg", "JPEG")
Color
import numpy as np
import PIL.ImageEnhance
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageEnhance.Color(img).enhance(5)
dst_2 = PIL.ImageEnhance.Color(img).enhance(20)
dst_3 = PIL.ImageEnhance.Color(img).enhance(-1)
dst_1.save("./png/color1.jpg", "JPEG")
dst_2.save("./png/color2.jpg", "JPEG")
dst_3.save("./png/color3.jpg", "JPEG")
明るさ(Brightness)
import numpy as np
import PIL.ImageEnhance
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageEnhance.Brightness(img).enhance(1.5)
dst_2 = PIL.ImageEnhance.Brightness(img).enhance(5)
dst_3 = PIL.ImageEnhance.Brightness(img).enhance(0.5)
dst_1.save("./png/brightness1.jpg", "JPEG")
dst_2.save("./png/brightness2.jpg", "JPEG")
dst_3.save("./png/brightness3.jpg", "JPEG")
Posterize
import numpy as np
import PIL.ImageEnhance
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageOps.posterize(img, 2)
dst_2 = PIL.ImageOps.posterize(img, 5)
dst_3 = PIL.ImageOps.posterize(img, 1)
dst_1.save("./png/posterize1.jpg", "JPEG")
dst_2.save("./png/posterize2.jpg", "JPEG")
dst_3.save("./png/posterize3.jpg", "JPEG")
Solarize
import numpy as np
import PIL.ImageOps
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageOps.solarize(img, 256 - 50)
dst_2 = PIL.ImageOps.solarize(img, 256 - 200)
dst_3 = PIL.ImageOps.solarize(img, 256 - 0)
dst_1.save("./png/solarize1.jpg", "JPEG")
dst_2.save("./png/solarize2.jpg", "JPEG")
dst_3.save("./png/solarize3.jpg", "JPEG")
AutoContrast
import numpy as np
import PIL.ImageOps
from PIL import Image
img = Image.open("./data/2007_000256.jpg")
dst_1 = PIL.ImageOps.autocontrast(img)
dst_1.save("./png/autocontrast1.jpg", "JPEG")