Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

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で関連付けされているアプリで画像を表示

f:id:rare_Remrin:20170520162837p:plain
 

変換

# グレースケールに変換
gray_img = img.convert("L")
gray_img.show()

f:id:rare_Remrin:20170520162928j:plain
 

保存

パス、ファイル名、形式を指定して保存

gray_img.save( "img/gray.jpg", quality=90 )

 

サムネイル化(縮小)

resize()は戻り値として新しい画像オブジェクトを返す。拡大もできる。
img.thumnail()で元の画像オブジェクトそのものを縮小。
元画像をまた使うならばcopy()してからサムネイル化。

img.thumbnail( (160, 120) )
img.show()

f:id:rare_Remrin:20170520164011p:plain
 

回転、反転

・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()

 
f:id:rare_Remrin:20170520171255p:plain
 

色の取り出し、変換

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()

ブドウ?紫イモ?
f:id:rare_Remrin:20170520175127p:plain
 
カラフルすぎるソフトクリームだと気持ち悪いので折り紙画像を準備して 
f:id:rare_Remrin:20170520174623p:plain

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()

 
f:id:rare_Remrin:20170520174903p:plain 
 

ヒストグラムの表示

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)

f:id:rare_Remrin:20170520184532p:plain