Pythonの画像処理ライブラリPillow(PIL)の使い方
Pillowは、開発が停止しているPIL(Python Image Library)からフォークされた画像処理ライブラリ。
Pillow is the “friendly PIL fork” by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors.
Pillow — Pillow (PIL Fork) 6.1.0 documentation
OpenCVのようにコンピュータービジョン系の高度な画像処理(顔検出やオプティカルフローなど)はできないが、リサイズ(拡大・縮小)や回転、トリミング(部分切り出し)のような単純な処理が簡単にできる。
(好みの問題ではあるが)PillowのほうがOpenCVよりコードがシンプルでとっつきやすいので、目的によって使い分けるのがいいだろう。
ここでは以下の内容について述べる。
- インストール
- 基本的な使い方
- 画像読み込み、処理、保存
- 図形描画
- そのほかの処理例
- 画像に別の画像を貼り付け
- 2枚の画像を合成
- 複数の画像を連結(結合)
- 透過png画像を作成
- ネガポジ反転(画素値を逆転)
- 円形や正方形のサムネイル画像を作成
- アニメーションGIFを作成
リサイズやトリミングなど個々の処理について説明した個別記事は以下から。
- 関連記事: Pillowに関する記事一覧
インストール
pip
(環境によってはpip3
)でインストールできる。
$ pip install Pillow
PillowとPILは共存出来ない。両方インストールしてしまった場合は、まず両方ともアンインストールしてから片方だけをインストールし直せばよい。
何がインストールされているかわからない場合は、
$ pip list
で確認できる。アンインストールは、
$ pip uninstall <package>
基本的な使い方
公式ドキュメントがしっかりしていて分かりやすい。
画像読み込み、処理、保存
画像ファイルを読み込み。インストールするのはPillowだがインポートするパッケージの名前はPillow
ではなくPIL
なので注意。
from PIL import Image, ImageFilter
im = Image.open('data/src/lenna_square.png')
フォーマット、サイズ(幅、高さ)、モードなどのメタ情報を取得。サイズは(幅, 高さ)
。
print(im.format, im.size, im.mode)
# PNG (512, 512) RGB
RGB各色の最小値と最大値を取得。
print(im.getextrema())
# ((54, 255), (3, 248), (8, 225))
指定した座標の色を取得。座標の原点(0, 0)
は左上。(R, G, B)
のタプルが返される。
print(im.getpixel((256, 256)))
# (180, 65, 72)
画像を処理する例として、白黒変換(convert('L')
)、90度回転(rotate(90)
)、ガウシアンブラー(filter()
)を行う。
new_im = im.convert('L').rotate(90).filter(ImageFilter.GaussianBlur())
OSデフォルトのソフトで画像を表示。例えばMacの場合は「プレビュー.app」が起動し画像が表示される。
new_im.show()
画像を保存。
new_im.save('data/dst/lenna_square_pillow.jpg', quality=95)
保存されるファイルのフォーマットはsave()
の引数に指定したパスの拡張子から自動的に判定される。
save()
ではフォーマットに応じたパラメータを引数で指定できる。
例えばjpg
の場合は引数quality
で品質を指定できる。1
から100
までで、デフォルトは75
。値が大きいほうが品質が良い(その分ファイルサイズも大きい)が、以下の公式ドキュメントにあるように、95
より大きい値は推奨されていない。劣化を防ぎたい場合は可逆圧縮のpng
などで保存すればよい。
バージョン6.2
時点では0
以下の値だとデフォルト(75
)、101
以上の値だと100
として処理される模様。
quality
The image quality, on a scale from 1 (worst) to 95 (best). The default is 75. Values above 95 should be avoided; 100 disables portions of the JPEG compression algorithm, and results in large files with hardly any gain in image quality. Image file formats - JPEG — Pillow (PIL Fork) 6.2.0.dev0 documentation
フォーマットごとの詳細は公式ドキュメントを参照。
元画像と処理後の画像は以下の通り。


図形描画
図形の描画もできる。ImageDraw
モジュールを使う。
詳細は以下の記事も参照。
Image.new()
でベタ画像のImage
オブジェクトを作成。第二引数にサイズ、第三引数にRGBの各色を指定する。
from PIL import Image, ImageDraw, ImageFont
im = Image.new("RGB", (512, 512), (128, 128, 128))
Image
オブジェクトを引数に指定してDraw
オブジェクトを生成。
draw = ImageDraw.Draw(im)
直線、長方形、楕円を描画。
draw.line((0, im.height, im.width, 0), fill=(255, 0, 0), width=8)
draw.rectangle((100, 100, 200, 200), fill=(0, 255, 0))
draw.ellipse((250, 300, 450, 400), fill=(0, 0, 255))
テキストを描画。フォントを指定して使う。
font = ImageFont.truetype('/Library/Fonts/Arial Bold.ttf', 48)
draw.multiline_text((0, 0), 'Pillow sample', fill=(0, 0, 0), font=font)
上述のように、画面に表示させたい場合はshow()
、画像ファイルとして保存したい場合はsave()
を使う。いずれもDraw
オブジェクトではなくImage
オブジェクトのメソッドなので注意。
im.save('data/dst/pillow_iamge_draw.jpg', quality=95)
以下のような画像が生成される。

この例では最初にベタ画像を生成しているが、画像ファイルを読み込んで、その上に図形やテキスト描画することも可能。
そのほかの処理例
Pillow(PIL)を使った画像処理の例をいくつか挙げる。詳細やサンプルコードはリンク先の個別記事を参照。
画像に別の画像を貼り付け
背景画像に別の画像を貼り付ける。
矩形のほか、マスク画像を使って円形など任意の形に切り抜いて貼り付けたりもできる。
2枚の画像を合成
2枚の同じサイズの画像を合成する。
マスク画像を使って任意の図形に切り抜いて合成したり、グラデーション画像をマスクとして徐々に変化する画像を作成したりできる。
複数の画像を連結(結合)
複数枚の画像を縦や横に並べて連結画像を作成する。
透過png画像を作成
アルファチャンネルを持つ透過png画像を作成する。
これも任意の形にマスクすることができる。
ネガポジ反転(画素値を逆転)
ネガポジ反転した画像(画素値が逆転した画像)を生成する。
円形や正方形のサムネイル画像を作成
大きい画像からサムネイル画像を作成する。
中央を切り抜いたり、余白を付け加えて任意のサイズにしたり、円形にしたりできる。
複数の画像を一括で処理することも可能。
アニメーションGIFを作成
JPGやPNGだけでなく、アニメーションGIF画像を作成することもできる。