ライブラリ: PIL

追記 20180316: この記事は Python 2 を対象としています。 Python 3 の場合は PIL からフォークされた Pillow を利用してください。

Python の「 PIL 」というライブラリについてご紹介します。

from PIL import Image

「 PIL 」は画像データを扱うため機能をひとまとめにしたライブラリです。名前の「 PIL 」は「 Python Imaging Library 」の省略形です。

bmp 、 tiff 、 gif 、 jpg 、 png といったメジャーな画像フォーマットでの読み書きにはひととおり対応しており、機能が非常に豊富なので、「 Python で画像処理といえば PIL 」といった位置づけになっているようです。

以下、基本的な使い方をざっくりと見ていきます。

画像の読み込み

from PIL import Image

image = Image.open('lenna.png')
print image.__class__
# PIL.PngImagePlugin.PngImageFile と表示される

Image.open() で画像データを読み込むことができます。戻り値は PngImageFile クラス等のインスタンスなので、その後はそのインスタンスに対して処理を行っていきます。

画像の表示

image.show()

show() メソッドで対象の画像を表示することができます。具体的には、 OS でその画像フォーマットに関連づけられているソフトが起動します。

画像の保存

image.save('lenna_changed.png')

save() メソッドにファイル名を渡して実行すれば、指定された名前で画像ファイルとして保存することができます。

画像のメタ情報へのアクセス

print image.filename  # lenna.png などと表示
print image.format, image.size, image.mode
# PNG (220, 220) RGBA などと表示

ファイル名(ある場合のみ)や画像フォーマット、サイズやカラーモードなどのメタ情報は、各種アトリビュートの中に入っています。 image.mode は「 L 」「 RGB 」「 CMYK 」などの値を取り、 L ならグレースケール、 RGB なら RGB 、 CMYK なら CMYK といった「カラーモード」を意味します。

for k, v in image.info.items():
    print k, v
# たとえば以下のとおり表示
# aspect (72, 72)
# gamma 0.45455

画素のアスペクト比、ガンマ値などの情報はアトリビュート info の中に辞書形式で入っています。

画素データへのアクセス

画素データにアクセスするには、大きく2通りの方法があります。ひとつは getdata() メソッド、もうひとつは getpixel() メソッドです。

px = image.getdata()
print px[3]  # (227, 138, 125, 255) などと表示

getdata() を使うと、すべての画素データを1列にまとめて取得することができます。 getdata() とは逆にデータを書き込む方は putdata() メソッドです。

image.getpixel((x, y))

getpixel() を使うと、 1 画素単位で情報を取得することができます。逆に値をセットしたい場合は putpixel() メソッドが利用できます。

画像の新規作成

image = Image.new("RGB", (100, 100))
image.show()  # まっさらの画像が表示される

new() メソッドにカラーモードとサイズを渡せば、画像を新規作成することができます。

画像の統計値へのアクセス

from PIL import ImageStat

stat = ImageStat.Stat(image)
print 'pixel num:', stat.count
print 'pixel sum:', stat.sum
print 'pixel mean:', stat.mean
print 'pixel variance:', stat.var
print 'pixel stddev:', stat.stddev
# それぞれ RGBA の統計値がタプルに収められて返される

ImageStat.Stat というクラスを使うと、画素の統計情報をまとめて取得することができます。 count は画素の総数、 sum は合計、 mean は平均、 varstddev は分散や標準偏差をそれぞれ格納しています。

以上です。

この他にも、回転、拡大縮小、切り取り、明るさ・コントラストの調整といったことができます。文字や図形の書き込み、ふたつの画像の重ね合わせといった少し凝った処理なんかもメソッドひとつでできたりするので、基本的な使い方をひととおり覚えておくと便利です。

インストール

pipが入っていれば次のコマンドでインストールできます。

pip install PIL

追記 20180316: Python 3 の場合は PIL は無いので代わりに次のコマンドで Pillow をインストールします。

pip install Pillow

参考

追記 2018316: Pillow の公式サイトとリポジトリは次のとおりです。