2022年4月23日土曜日

【Pillow】RGB色空間とHSV色空間の変換(convert)

 画像処理ライブラリ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

使用バージョン:Python 3.8.12 / Pillow 9.0.0

0 件のコメント:

コメントを投稿