画像ファイルの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。
もっとも、複雑な処理は不要だった。試行錯誤した結果、
この画像が(モデルはフリー素材アイドルの河村友歌さん)
こうなった。
アバターのような青い肌に目が行くが、頭のリボンや背景の風船の色も変わっている。
ファンの方に怒られそうだが、これもアリな気がする。
スクリプトはこちら(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の入れ替えなどもできる。
ゲルにしか見えない。
*1:pillowのドキュメントを精査していないため本当にそうかは不明