PILの使い方(1)
PIL(Python Imaging Library)の使い方について。
画像の読み込み
img = Image.open("filepass")
のように、ファイルを読み込む。
この時点では参照されているだけで、必要になってからデータを読み込む。
下の例では作業ディレクトリの下のdataフォルダに該当ファイルがなければ
FileNotFoundError: [Errno 2] No such file or directory: 'data/img01.png'
というエラーが出る。
from PIL import Image # 画像を読み込む img = Image.open( "data/img01.png" ) print(type(img)) # <class 'PIL.PngImagePlugin.PngImageFile'> print(img.size) # (320, 240) print(img.mode) # RGBA img.show() # Winodwsで関連付けされているアプリで画像を表示
変換
# グレースケールに変換 gray_img = img.convert("L") gray_img.show()
保存
パス、ファイル名、形式を指定して保存
gray_img.save( "img/gray.jpg", quality=90 )
サムネイル化(縮小)
resize()は戻り値として新しい画像オブジェクトを返す。拡大もできる。
img.thumnail()で元の画像オブジェクトそのものを縮小。
元画像をまた使うならばcopy()してからサムネイル化。
img.thumbnail( (160, 120) ) img.show()
回転、反転
・transpose() 上下・左右反転、90度単位の回転
・rotate() 角度指定の回転、
resampleオプションで近傍法の種類を選べる。
左右反転 | transpose(Image.FLIP_LEFT_RIGHT) |
上下反転 | transpose(Image.FLIP_TOP_BOTTOM) |
90度回転 | transpose(Image.ROTATE_90) |
180度回転 | transpose(Image.ROTATE_180) |
270度回転 | transpose(Image.ROTATE_270) |
90度回転? | transpose(Image.TRANSPOSE) |
角度指定の回転 | img.rotate(10)など |
貼り付け
paste(img_obj, box, mask)
img_obj貼り付けるイメージオブジェクト
box:2次元タプルで左上の座標、または4次元タプルで左上、右下の座標
mask:マスクの指定
img = Image.open("data/img01.png") thum = img.copy() thum.thumbnail( (160, 120) ) img.paste(thum.transpose(Image.FLIP_TOP_BOTTOM), (0, 0)) img.paste(thum.convert("L"), (0, 120)) img.paste(thum, (160, 120, 320, 240)) img.show()
色の取り出し、変換
split()でR, G, BやA(不透明度)を取り出せる。
merge()で再構成
img = Image.open("data/img01.png") r, g, b, a= img.split() # RGB形式なら r, g, b= img.split() img = Image.merge("RGBA", (r, b, g, a)) img.save("data/img01_rgba.png") img.show()
ブドウ?紫イモ?
カラフルすぎるソフトクリームだと気持ち悪いので折り紙画像を準備して
img = Image.open("data/img03.png") thum = img.copy() thum.thumbnail( (160, 120) ) r, g, b= thum.split() # R, G, Bを適当に入れ替えてみる img.paste(Image.merge("RGB", (r, g, b)), (0, 0)) img.paste(Image.merge("RGB", (g, r, b)), (160, 0)) img.paste(Image.merge("RGB", (r, b, g)), (0, 120)) img.paste(Image.merge("RGB", (b, g, r)), (160, 120)) img.show()
ヒストグラムの表示
import numpy as np import matplotlib.pyplot as plt from PIL import Image img = Image.open("data/img01.png") r, g, b, a= img.split() rh = np.array(r).flatten() gh = np.array(g).flatten() bh = np.array(b).flatten() plt.hist((rh, gh, bh), 20, color=("r", "g", "b"), rwidth=0.9)