2010年9月3日金曜日

PILを用いて画像の特定の色を別の色に変換する

Python Image Libraryを用いて色を変換。
これがやりたかった。

画像を開く
>>> img1 = Image.open("test.jpg")

RGB値のバンドを持つ画像オブジェクトに変換
>>> img1.convert("RGB")

画像のピクセルサイズを取得(タプル型)
>>> pixelSizeTuple = img1.size

新しい画像オブジェクトを用意する
ここではアルファ値を持つ、img1と同じサイズの画像を用意
>>> img2 = Image.new('RGBA', img1.size)

各ピクセルからgetpixelメソッドで色情報を取得し、特定の条件に基づいてputpixelメソッドで別の色を入れる。
ここでは、RGBの内、赤と青が220以上の値をとるピクセルを赤で塗り替える。
getpixel(ピクセル位置をタプルで指定)
putpixel(ピクセル位置をタプルで指定, RGBAをタプルで指定)
>>> for i in range(pixelSizeTuple[0]):
>>> for j in range(pixelSizeTuple[1]):
>>> r,g,b = img1.getpixel((i,j))
>>> if r > 220 and b > 220:
>>> img2.putpixel((i,j), (255,0,0,0)) # 真っ赤に!
>>> else:
>>> img2.putpixel((i,j), (r,g,b,0)) # 元の色

画像を保存
>>> img2.save("test_new.jpg")

ちなみに実行時間を計測した結果、100*100ピクセルの画像で
0.06908秒程度。わお。
別の画像では0.066095秒だった。
ちなみにMacBookProでメモリは2GB。
これだったらImageMagick出動しなくても大丈夫そう。

以下、ビフォーアフター。
元画像
生成画像


ちなみに、特定色がピンポイントである場合は、ImageMagickのconvertコマンドの方が早いかもしれない。

convert -fill '置換後の色' -opaque '置換対象の色' 変換前画像ファイル 変換後ファイル名
convert -fuzz 50% -fill '#00ff00' -opaque '#ff0000' icons.png i.png

参考:アグレッシブエンジニア: ImageMagickのconvertコマンドで特定の色を置換する
http://blog.tanarky.com/2009/08/imagemagickconvert_19.html

0 件のコメント: