PythonのPillowでカラー画像からモノクロ画像などへの変換は convert関数を用います。
カラー画像からモノクロ画像への変換は以下のように行います。
from PIL import Image
img_rgb = Image.open("Parrots.bmp")
img_rgb.show()
# グレースケール("L")へ変換
img_gray = img_rgb.convert("L")
img_gray.show()
# モノクロ("1")へ変換
img_mono = img_rgb.convert("1")
img_mono.show()
実行結果
Pillowでは、”モノクロ”と言っても、0~255までの256諧調の輝度値を持ったグレースケール(“L”)と、黒(0)と白(1)の2諧調のモノクロ(“1”)とがあります。
上図の左側がグレースケール(“L”)で、右側がモノクロ(“1”)です。
モノクロ(“1”)の画像は一般にディザ(dither)と呼ばれる処理で、新聞の写真のように1色のインクしか無い印刷で使われます。このディザの処理にもいくつか手法があり、Pillowでは誤差拡散法という処理になっています。(参考書籍:ディジタル画像処理)
ただし、このモノクロ(“1”)は、画像処理的には、あまり出番が無いので、私は特に断りの無い限り、グレースケール画像の事を「モノクロ画像」と呼んでいます。
今回は、カラー画像(“RGB”)からグレースケール画像(“L”)へ変換しましたが、convert関数の引数の部分を変えることで、他の色空間への変換も可能です。
どのような色空間へ変換できるか?は以下のページを参照ください。
このconvert関数はOpenCVでいうところの cvtColor関数に相当しますが、個人的に興味があったのが、色相のように0~360°の値を持つ色空間は、どのように変換されるのか?ということ。
OpenCVでは、0~360°を8bitのデータに収まるように、0~180へ変換する COLOR_BGR2HSV と0~255へ変換する COLOR_BGR2HSV_FULL の2種類があります。
そこで、Pillowではどのように変換されるのか?確認してみました。
評価プログラム
from PIL import Image
img_rgb = Image.new("RGB", (3, 1))
# R, G, Bの値を設定
img_rgb.putpixel((0,0), (255, 0, 0))
img_rgb.putpixel((1,0), (0, 255, 0))
img_rgb.putpixel((2,0), (0, 0, 255))
# RGB -> HSV
img_hsv = img_rgb.convert("HSV")
# 各画素の値を取得
print("(0, 0)", img_hsv.getpixel((0, 0)))
print("(1, 0)", img_hsv.getpixel((1, 0)))
print("(2, 0)", img_hsv.getpixel((2, 0)))
実行結果
この結果から、0°は0へ、120°は85へ、240°は170へ変換されていることから、0~360°の角度は0~255へ変換されていることが分かります。
Pillowで行われる色相の角度の変換は、OpenCVの COLOR_BGR2HSV_FULL 相当で変換されている!という事でした。
コメント