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データへの変換