note.nkmk.me

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

Date: 2015-08-22 / Modified: 2018-02-06 / tags: Python, Pillow, 画像処理
このエントリーをはてなブックマークに追加

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) 4.2.1 documentation

OpenCVみたいな高度な画像処理(顔認識とかオプティカルフローとか)はできないけど、リサイズ(拡大・縮小)や回転、トリミング(部分切り出し)のような単純な画像処理はバッチリ。

PillowのほうがOpenCVよりもコードがシンプルでとっつきやすいので、目的によって使い分けるのがいいと思う。

リサイズやトリミングなど個々の処理について説明した個別記事は以下から。

ここでは以下の内容について述べる。

  • インストール
  • 基本的な使い方
    • 画像読み込み、処理、保存
    • 図形描画
  • そのほかの処理例
スポンサーリンク

インストール

pipでインストール。

$ pip install Pillow

PillowとPILは共存出来ない。両方インストールしてしまった場合は、まず両方ともアンインストールしてから片方だけをインストールし直すのが良い。

何がインストールされているかわからない場合は、

$ pip list

で確認できる。アンインストールは、

$ pip uninstall <package>

なお、Python3を使っている場合、環境によってはpipではなくpip3を使わないといけないので注意。

基本的な使い方

公式リファレンスがしっかりしていて分かりやすい。

画像読み込み、処理、保存

画像ファイルを読み込み。

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)は左上。

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デフォルトのソフトで画像を表示。

new_im.show()

画像を保存。

new_im.save('data/dst/lenna_square_pillow.jpg', quality=95)

save()で保存する際は拡張子に応じて引数が異なる。詳細はImage file formatを参照。jpgの場合は引数qualityで品質を指定できる。1(最低)から95(最高)まででデフォルトは75

元画像と処理後の画像は以下の通り。

originalprocessed

図形描画

図形の描画もできる。

ImageDraw Moduleを使う。詳細は以下の記事も参照。

まずベタ画像を作成。

from PIL import Image, ImageDraw, ImageFont

im = Image.new("RGB", (512, 512), (128, 128, 128))

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)

こんな感じ。

pillow_sample

この例では最初にベタ画像を生成しているが、画像ファイルを読み込んで、その上に図形やテキスト描画することも可能。

そのほかの処理例

Pillow(PIL)を使った画像処理の例をいくつか挙げる。詳細やサンプルコードはリンク先の個別記事を参照。

画像に別の画像を貼り付け

背景画像に別の画像を貼り付ける。

矩形のほか、マスク画像を使って円形など任意の形に切り抜いて貼り付けたりもできる。

Pillow Image.paste 結果画像 円形マスク ぼかし

2枚の画像を合成

2枚の同じサイズの画像を合成する。

マスク画像を使って任意の図形に切り抜いて合成したり、グラデーション画像をマスクとして徐々に変化する画像を作成したりできる。

Python Pillow composite gradation

複数の画像を連結(結合)

複数枚の画像を縦や横に並べて連結画像を作成する。

python pillow concat tile resize

透過png画像を作成

アルファチャンネルを持つ透過png画像を作成する。

これも任意の形にマスクすることができる。

Python Pillow putalpha circle

ネガポジ反転(画素値を逆転)

ネガポジ反転した画像(画素値が逆転した画像)を生成する。

pillow invert lena

円形や正方形のサムネイル画像を作成

大きい画像からサムネイル画像を作成する。

中央を切り抜いたり、余白を付け加えて任意のサイズにしたり、円形にしたりできる。

複数の画像を一括で処理することも可能。

Pillow thumbnail max square Pillow thumbnail expand square Pillow thumbnail circle transparent

アニメーションgifを作成

jpgやpngだけでなく、アニメーションgif画像を作成することもできる。

pillow gif

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事