Python Imaging Libraryの使い方 〜The Image Module

Python Imaging Libraryの関数を使いながらのメモです。
テスト用のモジュールTestPIL.pyを作成し、同じディレクトリに全て同じサイズの適当なRGB画像"test.bmp","test2.bmp","mask.bmp"を用意して実行してみました。以下使えそうな関数をひたすらピックアップ&リストアップ。関数の書き方は、変数名:型、関数名(引数名:引数型):返却値型という表記を使うことにします。

モジュールのインポート

from PIL import Image

Imageクラスのメンバ変数

format:string

画像ファイルのフォーマット

mode:string

階調。"1":2値画像,"L":グレースケール,"RGB","CMYK"など

size:turple (width, height)

画像サイズ

pallete:palette

画像モードが"P"のときはImagePaletteクラスのインスタンス.それ以外の場合はデータは入っていない。

info:dictionary

画像に関する情報
画像フォーマットや階調を関数の引数に指定する場合も基本的には文字列で扱います。

from PIL import Image
im = Image.open("test.bmp")
print im.format
print im.size
print im.mode
print im.info


BMP
(300, 300)
RGB
{'compression': 0}

関数

基本処理

new(mode:string,size:turple,color:turple):Image

新しい画像を作る。sizeはタプル型、colorはモノクロの場合int,RGBなどマルチバンドのときはタプル型

Image.new("RGB", (100,100)).show()            #黒
Image.new("RGB", (100,100), (255,0,0)).show() #赤
open(path:string):Image

画像を開く

im = Image.open("test.bmp")
im.show()

画像合成

blend(im1:Image,im2:Image,alpha:float):Image

画像をα値指定で合成する。計算式はim1*(1.0-α)+im2*α. 入力画像は同じサイズ&階調でないといけない。

im = Image.open("test.bmp")
im2 = Image.open("test2.bmp")
Image.blend(im,im2, 0.5).show()
composite(im1:Image,im2:Image,mask:Image):Image

2つの入力画像に対してマスク画像をα値とした補間画像を生成する。入力画像は同じサイズでないといけない

im = Image.open("test.bmp")
im2 = Image.open("test2.bmp")
im3 = Image.open("mask.bmp") 
mask = im3.convert("1")
Image.composite(im,im2,mask).show()

メソッド

基本処理

show()

画像を表示する

save(path:string,format:string)

画像を保存する

im = Image.open("test.bmp")
im.save("test_copied.jpg", "JPEG")
copy():Image

画像を複製する

im.copy().show()
crop(box:4-turple):Image

指定した矩形領域を切り取る

box= (50, 50, 100, 100)
im.crop(box).show()
paste(im:Image,box:turple)

切り取った領域を貼り付ける

pixelへのアクセス

load:pix

(ver1.1.6以降のみ)2次元配列の構造をしているpixクラスのインスタンスを返却
pix[x,y]で各要素にアクセスできる

pix = im.load()
for i in range(200):
    for j in range(200):
        pix[i, j] = i/3+j/4

getpixel,putpixelメソッドを利用することもできますが、loadを利用する方が効率が良いらしい。

画像の情報取得

getbands(): tuple (string,string,...,)

階調に関する情報を取得する

getbbox():4-turple (int,int,int,int)

画素値が0でない部分の境界矩形領域を取得する

getextrema():2-turple(min:int,max:int)

画素の最小、最大値を取得する.モノクロ画像でしか利用できない??

histogram():list

ヒストグラムを取得する

print im.getbands()
print im.getbbox()
print im.getextrema()
print im.histogram()


('R', 'G', 'B')
(0, 0, 300, 300)
( (0, 255), (0, 255), (0, 250) )
[1612, 1144, 707, 446, 130, 120, 114, 108, 95,...略... 10, 9, 6, 9, 3, 2, 0, 5, 1, 4, 0, 0, 0, 0, 0]

階調に関する操作

split(im:Image):turple (r:Image,g:Image,b:Image)

各バンドの画像に分割する。RGB画像ならR,G,Bそれぞれのモノクロ画像のタプルを返す。

r,g,b = im.split()
r.show()
g.show()
b.show()
convert(mode:string):Image

画像の階調を変換する

im.convert("1").show()#2値画像
im.convert("L").show()#グレースケール

画像の変形

rotate(angle:int):Image

指定した角度(°)だけ回転させる

transpose(method:int?):Image

指定した方法で画像を回転する

im.rotate(30).show()
im.transpose(Image.FLIP_LEFT_RIGHT).show() #左右反転
im.transpose(Image.FLIP_TOP_BOTTOM).show() #上下反転
im.transpose(Image.ROTATE_90).show() #90°回転
im.transpose(Image.ROTATE_180).show()#180°回転
im.transpose(Image.ROTATE_270).show()#270°回転
resize(size:2-turple):Image

画像のサイズを変更する

im.resize((100,100)).show()
tostring :string

画像データから文字列を含んだRGBデータへの変換

fromstring(mode:string, size:turple, data:string):Image

文字列データから画像への変換

str = im.resize((5,5)).tostring()

ライブラリから提供されている関数がかなり豊富で、それなりに面倒な画像処理のコードを数行程度で書くことができます。ちょっとしたスクリプトならこれらの関数を組み合わせるとすぐに書けそうですね。pythonGUIを作成する方法について勉強すれば画像処理ソフトを簡単に作ることができるかもしれません。