【加工例11選】Pythonで画像を一括処理できるPillowの使い方

【加工例11選】Pythonで画像を一括処理できるPillowの使い方

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

いちいち編集ソフトを開いて画像処理するのが面倒

大量の画像を一括して処理したい

といったお悩みはありませんか?

ちょっとしたサイズ変更やトリミングでも、画像処理って時間がかかりますよね。そこで今回は一瞬で画像処理できるPythonライブラリ「Pillow」の使い方を解説します。

エンジニアの方はもちろん、非エンジニアでもわかるようにPillowのインストールから実現できる画像処理を一つひとつ紹介するので、ぜひ参考にしてください。

Pillowのインストール

PillowはPythonライブラリの一つです。ライブラリとは、よく使う機能(今回は画像処理)をプログラムの形にまとめて再利用可能にしたもの。Pythonにはライブラリ(パッケージ)を管理するパッケージ管理ツールpipが用意されているので、pipを使って下記のようにPillowをインストールします。

pip install Pillow

Pillowの基本的な使い方

Pillowはさまざまな画像処理ができますが、まずは基本的な画像の読み込み、表示、保存をマスターしましょう。すべては画像の読み込みに始まり、保存に終わります。

下記のサンプル画像を使うので、試したい方はこちらからダウンロードしてください。

サンプル画像

画像の読み込み、情報取得、表示

画像の読み込みはImageモジュールのopenメソッドに画像ファイルのパスを指定します。読み込んだ画像からフォーマットやサイズ、モードを取得できます。また、showメソッドで画像を表示できます。

from PIL import Image

img = Image.open('xpath/to/your/img.png')

# 画像のフォーマット、サイズ、モードを取得
print(img.format, img.size, img.mode)

# 実行結果
JPEG, (512, 512), RGB

# 画像表示
img.show()

画像の保存

処理した画像を保存するにはImageオブジェクトのsaveメソッドを使います。引数に指定したファイル名から画像フォーマット(pngやjpgなど)を自動的に判定して保存します。第二引数に明示的にフォーマットを指定することも可能です。

from PIL import Image

img = Image.open('path/to/your/img.png')

# 何らかの画像処理

new_img.save('path/to/your/new_img.png')

# 上記と同様の保存処理
# new_img.save('path/to/your/new_img', 'PNG')

Pillowの画像処理11選

画像の読み込みと保存を理解したところで、さっそく画像処理に移りましょう。Pillowでできる処理はたくさんあるので、よく使うであろう処理に絞って解説します。

リサイズ

リサイズはImageオブジェクトのresizeメソッドを使います。リサイズした画像を見てわかるように縦横比を無視するので、比率を保ちたい場合は次のサムネイルを使いましょう。

new_img = img.resize((300, 200))

サムネイル

画像の縦横比を維持したままリサイズするにはImageオブジェクトのthumbnailメソッドを使います。resizeメソッドと異なり、一度実行したら元画像に反映されてしまう破壊的なメソッドなので、Image.copyメソッドなどで画像をコピーしておくとよいでしょう。

new_img = img.copy()
new_img.thumbnail((300, 200))

回転

画像の回転はImageオブジェクトのrotateメソッドを使います。いくつか引数を設定できますが、単純な回転であれば回転角度を指定します。

img = Image.open('lena.jpg')
new_img = img.rotate(45)

反転

画像の反転はImageオブジェクトのtransposeメソッドを使います。左右反転、上下反転、回転にも対応しています。

# 左右反転はImage.FLIP_LEFT_RIGHTを指定
img = Image.open('lena.jpg')
new_img = img.transpose(Image.FLIP_LEFT_RIGHT)

# 上下反転はImage.FLIP_TOP_BOTTOMを指定
img = Image.open('lena.jpg')
new_img = img.transpose(Image.FLIP_TOP_BOTTOM)
左右反転処理後の画像

トリミング

画像の一部を切り取るトリミングはImageオブジェクトのcropメソッドを使います。切り取る画像の左上と右下のX座標とY座標をタプルで指定します。

img = Image.open('lena.jpg')
box = (170, 170, 400, 400)
new_img = img.crop(box)

グレイスケール/白黒処理

画像をグレイスケールにするにはImageオブジェクトのconvertメソッドに引数としてLを指定します。

img = Image.open('lena.jpg')
new_img = img.convert('L')

コントラスト調節

画像のコントラストを調節するにはImageオブジェクトのpointメソッドがオススメです。画像のピクセル値を一括して変換できます。

img = Image.open('lena.jpg')

# 画像のピクセル値をすべて1.5倍に変換
new_img = img.point(lambda x: x * 1.5)

モザイク

モザイク処理専用のメソッドは用意されていませんが、画像の縮小を利用して簡易的なモザイク処理を施すことができます。本来の画像よりサイズを小さくすると差分の色情報が失われ、画像が劣化します。これを利用すると、モザイクっぽくなります。

img = Image.open('lena.jpg')

# 64 × 64に縮小してから元のサイズに戻す
new_img = img.resize((64, 64)).resize((512, 512))

ぼかし(ガウス)

ぼかし処理はImageオブジェクトのfilterメソッドを使います。引数にはImageFilterオブジェクトのGaussianBlurを指定。ぼかしの強度も指定できます。

from PIL import Image, ImageFilter

img = Image.open('lena.jpg')
new_img = img.filter(ImageFilter.GaussianBlur(4))

文字合成

Pillowを使えば画像に文字を合成することもできます。ImageDrawオブジェクトのDrawメソッドに画像を指定し、オブジェクトを取得。ImageDraw.textメソッドに描画を開始する座標、描画する文字、フォントを指定して描画します。フォントはImageFontオブジェクトを使い、フォント名とフォントサイズを指定します。

from PIL import Image, ImageDraw, ImageFont

img = Image.open('lena.jpg')

draw = ImageDraw.Draw(img)
font = ImageFont.truetype('arial.ttf', 32)

draw.text((0, 0), 'Hello, world!!', font=font)

図形描画

Pillowでは、線や長方形、楕円といった図形も描画できます。線の描画では、線の開始点と終了点を示すX座標とY座標、線の色、線の幅などを指定できます。

img = Image.open('lena.jpg')
draw = ImageDraw.Draw(img)

xy = [(0, 0), (512, 0), (0, 512), (512, 512)]
draw.line(xy, fill=(0, 0, 255), width=10)

長方形はrectangleメソッドに左上と右下の座標を指定することで描画できます。fillで長方形の色はもちろん、outlineで線の色、widthで線の幅も指定できます。

draw.rectangle(
    [(0, 0), (256, 256)], 
    fill=(0, 0, 255), 
    outline=(0, 255, 0), 
    width=10
)

楕円はellipseメソッドを使います。長方形同様、楕円の色や線の色、線の幅を指定できます。

draw.ellipse(
    [(0, 0), (256, 256)], 
    fill=(0, 0, 255), 
    outline=(0, 255, 0), 
    width=10
)

まとめ

画像処理ライブラリ「Pillow」の使い方を解説しました。リサイズや回転、トリミングといった基本操作から文字や図形の合成まで簡単に処理できましたね。

処理する画像が数枚であれば、手作業でもやってやれないことはないですが、枚数が増えてくるとそうはいきません。大量の画像を一括して処理したいときはぜひPillowを使った自動化を検討してみてください。