Pillow(PIL)

【Python/Pillow(PIL)】カラー,モノクロ,HSVなどの変換

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()

実行結果

Python Pillow カラー モノクロ 変換

Pillowでは、”モノクロ”と言っても、0~255までの256諧調の輝度値を持ったグレースケール(“L”)と、黒(0)と白(1)の2諧調のモノクロ(“1”)とがあります。
上図の左側がグレースケール(“L”)で、右側がモノクロ(“1”)です。

モノクロ(“1”)の画像は一般にディザ(dither)と呼ばれる処理で、新聞の写真のように1色のインクしか無い印刷で使われます。このディザの処理にもいくつか手法があり、Pillowでは誤差拡散法という処理になっています。(参考書籍:ディジタル画像処理)

ただし、このモノクロ(“1”)は、画像処理的には、あまり出番が無いので、私は特に断りの無い限り、グレースケール画像の事を「モノクロ画像」と呼んでいます。

今回は、カラー画像(“RGB”)からグレースケール画像(“L”)へ変換しましたが、convert関数の引数の部分を変えることで、他の色空間への変換も可能です。

どのような色空間へ変換できるか?は以下のページを参照ください。

【Python/Pillow(PIL)】画像データフォーマット(mode)
画像データにはカラー画像の24bit,32bit、モノクロ画像の8bit,16bitなどがありますが、Pillowで対応している画像データフォーマット(mode)の一覧は以下の通りです。 mode 説明 1 1-...

 

この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)))

実行結果

Python Pillow カラー モノクロ 変換

この結果から、0°は0へ、120°は85へ、240°は170へ変換されていることから、0~360°の角度は0~255へ変換されていることが分かります。

Pillowで行われる色相の角度の変換は、OpenCVの COLOR_BGR2HSV_FULL 相当で変換されている!という事でした。

コメント

タイトルとURLをコピーしました