画像ファイルのRとBを入れ替えるpythonのスクリプトを書いた

ある事情により、画像ファイルのRとBを入れ替える必要が出てきた。

調べてみると、pythonのpillowというパッケージを使うことで実現できるらしい。

Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方 - Librabuch

Pythonの画像処理ライブラリPillow(PIL)の使い方 | note.nkmk.me

pillowのメソッドには、「ネガポジ反転」が含まれている。

これは0~255で表される各ピクセルのRGBの値を、255から引いた値(255の補数)に変換するという処理である。

例えば、あるピクセルのRGBの値がそれぞれ(0, 100, 200)だった場合、ネガポジ反転によってそのピクセルは(255, 155, 55)に変換される。

私が実現したいのはこの処理ではなく、(0, 100, 200)を(200, 100, 0)にする、というものだ。

このRGBの入れ替えはサポートされていないようだ*1

もっとも、複雑な処理は不要だった。試行錯誤した結果、

f:id:armik:20180921131516j:plain

この画像が(モデルはフリー素材アイドルの河村友歌さん)

f:id:armik:20180921131620p:plain

こうなった。

アバターのような青い肌に目が行くが、頭のリボンや背景の風船の色も変わっている。

ファンの方に怒られそうだが、これもアリな気がする。

スクリプトはこちら(numpyとpillowが必要)

from PIL import Image
import numpy as np

#オリジナルのファイル名(拡張子除く)
filename = 'Yuka'

#オリジナルがpngの場合
#im = Image.open(filename+'.png').convert('RGBA')

#オリジナルがjpgの場合
im = Image.open(filename+'.jpg')

#オリジナル画像の幅と高さ
width, height = im.size
      
#オリジナル画像と同じサイズのImageオブジェクトを作成
new_im = Image.new('RGBA', (width, height), (0,0,0,0))

im_pixels = []
for y in range(height):
    for x in range(width):
        # getpixel((x,y))で左からx番目,上からy番目のピクセルの色を取得し、img_pixelsに追加する
        im_pixels.append(im.getpixel((x,y)))

# あとで計算しやすいようにnumpyのarrayに変換しておく
im_pixels = np.array(im_pixels)        

for y in range(height):
    for x in range(width):
        temp = x+y*width
            
        # pngの場合(透過あり)
#        new_im.putpixel((x, y), (im_pixels[temp][2], im_pixels[temp][1],
#                        im_pixels[temp][0], im_pixels[temp][3]))
        
        # jpgの場合
        new_im.putpixel((x, y), (im_pixels[temp][1], im_pixels[temp][0],
                        im_pixels[temp][2]))

#作成した画像を出力
new_im.save(filename+'_reverse.png', quality=100)

元画像を読み込み、RGBを入れ替えて出力するだけである。

入出力のインターフェースは適当であるため、やりやすいように変更してもらいたい。

元画像がpngの場合、変換後のImageオブジェクトを'RGBA'として生成するとよい。

そうしなければ元画像の透過を反映させることができないためだ。

当然ながら、RとGの入れ替えなどもできる。

f:id:armik:20180921134755p:plain

ゲルにしか見えない。

*1:pillowのドキュメントを精査していないため本当にそうかは不明

『脳の右側で描け ワークブック』 Lesson 6

右脳モードに入るための練習が続く。

Lesson6は「上下逆さまのデッサン」である。

上下を反対にした絵を模写することで、より対象を客観的に眺めることができるらしい。

f:id:armik:20180913092656p:plain
パブロ・ピカソ 「イーゴリ・ストラヴィンスキーの肖像」より
1枚目は30分ほどかかった。

f:id:armik:20180913092704p:plain
「馬(作者不詳)」

こちらは比較的単純だったため、15分ほどで終わった。

確かに完成した絵をさかさまにして見ると、そこそこのできばえに見えてくる。

『脳の右側で描け ワークブック』 Lesson 4, 5

すぐ終わる2つのレッスンだった。それぞれ5分ほどで終わった。

Lesson4は「ウォーミングアップと自由な絵」

f:id:armik:20180906201754p:plain

画家によって線を入れるスピードが異なるらしい。

上2つが速い人の、下2つが遅い人の例である。

自分に合ったスピードを見つけることが重要だそうだ。

スピードが遅いほど、引く線の本数が少ないことがわかる。

私は完全に速い方である。遅い人は少ない本数でよく描けるなと感じる。

書き損じたと思ったら引き直すのだろうか。

Lesson5は「『花瓶と顔』を描く」

f:id:armik:20180906201748p:plain

脳を「右脳モード」にするための訓練らしい。

初めに描いた左側と逆になるように右側を描いていくのだが、途中でどちらに線を引けばいいのか混乱する。

普段使わない脳の部位を使っている気がしてくる。

決定版 脳の右側で描けワークブック

決定版 脳の右側で描けワークブック