ライブラリ

画像処理ライブラリの使い方(Pillow)

画像処理

Pillowは「Pythonでが画像処理を行うためのライブラリ」です。

画像処理を行うライブラリといえば有名なのがOpenCVですが、PillowはOpenCVよりもシンプルに扱うことができるので、単純な画像処理をするだけであればPillowがおすすめです。

ここでは「Pillowとは?」「Pillowはどうやって使うの?」といった方へ向けて、Pillowについて解説します。

なお、Pillowはpip等でインストールしましょう。

$ pip install Pillow

Pillowのモジュール読み込み

Pillowを使うには次のようにモジュールを読み込む必要があります。

from PIL import Image, ImageFilter

PillowではなくPILなので注意が必要です。

画像の読み込み

ではここから具体的なPillowの使い方を見ていきましょう。

まずは処理する画像を読み込みます。今回はこの画像を読み込みます。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
print(type(img))
img.show()

[出力結果]

<class 'PIL.JpegImagePlugin.JpegImageFile'>

Image.open()で画像の読み込みを行い、取得したJpegImageFileのshow()で画像のプレビューが表示されます。

画像の情報取得

次に読み込んだ画像のサイズやフォーマット、色などの情報を取得します。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
print(img.format)
print(img.size)
print(img.getpixel((100, 100)))

[出力結果]

JPEG
(220, 220)
(91, 99, 162)

formatは画像のフォーマットを、sizeは画像サイズをそれぞれ取得できます。

また、getpixelはタプルを渡すことで、その座標の色情報を取得することができます。

画像の回転

画像を回転させるにはrotate()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.rotate(90)
new_img.show()

[出力結果]

rotate()の引数に90を指定することで90度回転した画像が表示されました。

なお、rotate()は回転させた画像を戻り値として渡すので、新しく変数に格納する必要があります。

白黒画像に変換

画像を白黒にする場合はconvert()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.convert('L')
new_img.show()

[出力結果]

convert()にLを指定することで白黒画像にできます。

画像を明るくする

画像を明るくするにはpoint()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.point(lambda x: x * 2.0)
new_img.show()

[出力結果]

lambda式の2.0を1以下にすることで暗くすることも可能です。

画像のリサイズ

リサイズするにはresize()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.resize((64, 64), Image.LANCZOS)
new_img.show()

[出力結果]

第一引数にサイズ、第二引数にリサイズフィルタを指定します。

リサイズフィルタはいくつか種類がありますが、LANCZOSが最も品質が優れています(その分パフォーマンスが悪い)。リサイズフィルタを指定しない場合はデフォルトでNEARESTが指定されます(品質は悪いがパフォーマンスが良い)。

画像のトリミング

トリミングしたい場合はcrop()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.crop((20, 70, 220, 160))
new_img.show()

[出力結果]

cropにタプルを渡すことで、引数にあったトリミングが可能です。

タプルの要素はそれぞれ(left, upper, right, under)に対応しています。

画像の上に画像を貼り付ける

画像の上に画像を貼り付けるにはpaste()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
new_img = img.resize((64, 64), Image.LANCZOS)
img.paste(new_img, (75, 155))
img.show()

[出力結果]

resize()を使って小さくした画像を元の画像の上に貼り付けています。

もちろん全く異なる2つの画像をopenしてpaste()することも可能です。

画像の保存

画像処理が終わったら、最後に画像を保存しましょう。

画像の保存はsave()を使います。

from PIL import Image, ImageFilter
img = Image.open('myafu.jpg')
#トリミングして暗めに、さらにグレイスケールに変更
new_img = img.crop((30, 70, 210, 160)).point(lambda x: x * 0.7).convert('L')
new_img.save('myafu_gray.jpg', quality=95)

save()の第一引数に保存したいパスを指定することで、元の画像に処理を加えた画像を保存できます。

また、quality引数は1〜100までの数値を任意に設定することで、保存される画像のクオリティを上げたり下げたりできます。

しかし、95よりも大きい値は品質が向上せずただ容量の大きいファイルができあがるだけなので、クオリティを最大にしたい場合は95を設定しましょう(デフォルトは75)。

タイトルとURLをコピーしました