1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pillow(PIL; Python Imaging Library)の概要とData Augmentationの実装

Last updated at Posted at 2025-01-25

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")

・実行結果
output1.jpg
output2.jpg
output3.jpg

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")

・実行結果
shear1.jpg
shear2.jpg
shear3.jpg

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")

・実行結果
sharpness1.jpg
sharpness2.jpg
sharpness3.jpg

コントラスト(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")

・実行結果
contrast1.jpg
contrast2.jpg
contrast3.jpg

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")

・実行結果
color1.jpg
color2.jpg
color3.jpg

明るさ(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")

・実行結果
brightness1.jpg
brightness2.jpg
brightness3.jpg

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")

・実行結果
posterize1.jpg
posterize2.jpg
posterize3.jpg

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")

・実行結果
solarize1.jpg
solarize2.jpg
solarize3.jpg

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")

・実行結果
autocontrast1.jpg

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?