2013年7月8日月曜日

PILで画像にエフェクトをかける

どうもお久しぶりです
ブログ書くの辛い
3ヶ月ぶりくらいの記事です

GIMPで画像にエフェクトをかけようと思ったけどどうすればいいのかわからなかったのでPython標準のPIL(Python Image Liblary)を使って見ました
ちなみにPython2.7.3使ってます

というのも、とあるフォロワーさんがアイコンを変えたのですが、なーんかアクセントが足りないなぁ…ということで勝手に試して見ました
(本人には許可をとっています) @keito_27

今回は対話インターフェースでやってみます

ちなみに速度とか全く考えてません
GPGPUって何それ美味しいの?

まずは元画像と完成品から

この写真が
こうなります












まずはライブラリのインポートから
Python 2.7.3 (default, Apr 10 2013, 05:46:21)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image
>>> Image.VERSION
'1.1.7'

で、srcに元画像をロードします
>>> src = Image.load('source.jpg')
この時点で
>>> src.save('test.jpg')
でそのまま保存できます(つまりただのコピペ)

次に、画像のサイズを取得します
>>> (width, height) = src.size
Image.sizeには(width,height)のタプルが入っています
(未だタプルなれないんだよなぁ…)

で、元画像を編集しますが、なんか色々あるとめんどくさいのでコピーを作成します
>>> dst = src.copy()

さて本題のエフェクトをかける作業に入っていきます

まずは画像をグレースケールに変換しました
グレースケールに変換するにはR,G,Bの三値の平均をそれぞれに割り当てればいいので
>>> for x in xrange(width):
...     for y in xrange(height):
...         c = src.getpixel
...         a = (c[0]+c[1]+c[2])/3
...         dst.putpixel((x,y),(a,a,a))

これでdstがグレースケールになってると思うので一旦出力してみます
>>> dst.save('dest.jpg')
はい













つぎに、メガネ部分を赤くしてみます
赤くする場所の条件としては、
「そのピクセルのR-Gが64以上かつR-Bも64以上」
であるときに
「そのピクセルのRはそのままで、GとBをその二つの平均値にする」
処理を書いていきます
(今回、この処理を全体に加えると唇の一部にもかかってしまったので二行目をheight/2にして上半分にのみ処理されるようにしてます)
>>> for x in xrange(width):
...     for y in xrange(height/2):
...         c = src.getpixel
...         if (c[0] - c[1]) >= 64 and (c[0] - c[2]) >= 64:
...             a = (c[1]+c[2])
...             dst.putpixel((x,y),(c[0],a,a))
はい

これで完成です

ツッコミ歓迎です

おつかれさまでした

0 件のコメント:

コメントを投稿