画像処理ライブラリPillowのImage.convertにより画像の色空間が変更できる。RGB色空間からHSV色空間、またその逆の変換について説明する。
Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。
from PIL import Image
また例に用いる元画像 'pond.jpg' は以下(フリー写真素材ぱくたそより)
1. RGB→HSV、HSV→RGB変換
RGB色空間はR(赤)、G(緑)、B(青)の3チャンネルからなり各チャンネルは256値をとる。一方HSV色空間はH(Hue:色相)、S(Satulation:彩度)、V(Value:明度)の3チャンネルからなり各チャンネルは256値をとる。
色空間の変換にはImage.convertメソッドを用い、引数に変換後のモード(色空間)を指定する。
HSV色空間への変換
Image.convert('HSV')
RGB色空間への変換
Image.convert('RGB')
2. HSV色空間のチャンネル操作
RGB色空間では、画像の色合いを変えずに彩度や明度を調整するのは難しいため、HSV色空間に変換しHを変えずにSやVを調整することで画像の鮮やかさや明るさの調整ができる。
調整法のひとつとしてガンマカーブによる調整がある。ガンマカーブは規格化された入力xと出力yが以下式の関係となるもの。
彩度Sに適用する場合のガンマカーブは以下式となる。
γ=0.5、γ=1、γ=2の場合のカーブ形状。γ<1では変換後に値が上がり、γ>1では変換後に値が下がる補正がされる。なおかつ画素値0は変換後も0、画素値255は変換後も255となるため、返還後も画素値の範囲は0~255で維持され飽和が生じない。
画像をHSV変換し、S(彩度)にγ=0.5の変換をかける例。画像が鮮やかになる。HSV色空間では出力ができないため調整後に再びRGB色空間に変換している。
from PIL import Image im = Image.open('pond.jpg') width, height = im.size im_hsv = im.convert('HSV') gamma = 0.5 for y in range(height): for x in range(width): h, s, v = im_hsv.getpixel((x, y)) im_hsv.putpixel((x, y), (h, int((s/255)**(gamma)*255), v)) im_rgb = im_hsv.convert('RGB') im_rgb.save('pond_s05.jpg')
実行結果
画像をHSV変換し、V(明度)にγ=0.5の変換をかける例。画像が明るくなり暗い部分が良く見えるようになる。
from PIL import Image im = Image.open('pond.jpg') width, height = im.size im_hsv = im.convert('HSV') gamma = 0.5 for y in range(height): for x in range(width): h, s, v = im_hsv.getpixel((x, y)) im_hsv.putpixel((x, y), (h, s, int((v/255)**(gamma)*255))) im_rgb = im_hsv.convert('RGB') im_rgb.save('pond_v05.jpg')
実行結果
3. リファレンス
Pillow (PIL Fork) > The Image Class > Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)
Pillow (PIL Fork) > Concepts > modes
0 件のコメント:
コメントを投稿