サイトアイコン sciencompass

OpenCV 画像の色相、彩度、明度の変更【HSV】

OpenCV で画像の明るさや色相を変更する方法について紹介します。機械学習で画像データを学習させる際に、明るさや色相を変えたデータを用意し、データ数を拡張したいときに使えます。
(データ拡張、Data Augmentation)[1]

HSV色空間

HSV色空間モデルは色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなる色空間モデルです。
HSV色空間モデルは人間が色を知覚する方法と似ていることからデザイナーの間で広く使われています。
それぞれの値は、色相は 0 度から 359 度までの数値として、彩度と明度はそれぞれ 0 から 100 までの数値として表されます。[2]
HSV色空間モデルは下記のように円錐もしくは円柱状の構造で視覚化されます。

画像認識も人間の知覚に近いHSV色空間を使うほうが精度が上がるだろうと推測して、この記事ではHSV色空間を使った画像処理を紹介します。

OpenCVで画像の読み込み

OpenCVで画像ファイルを読み込み、保存するにはcv2.imread()とcv2.imwrite()を使います。
画像ファイルはフリー写真素材ぱくたそ様からダウンロードしました。
ファイル名’suiren.jpg’でプログラムと同じディレクトリに保存しています。

色相の変更

まずは、色相を変更してみます。


import cv2 # OpenCVのインポート

img = cv2.imread('suiren.jpg') # 画像の読み出し
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換
h_deg = 60 #色相(Hue)の回転度数
s_mag = 1 # 彩度(Saturation)の倍率
v_mag = 1 # 明度(Value)の倍率

img_hsv[:,:,(0)] = img_hsv[:,:,(0)]+h_deg # 色相の計算
img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_mag # 彩度の計算
img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_mag # 明度の計算
img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換

cv2.imwrite('suiren_hue.jpg', img_bgr) # 画像の保存

ちなみに、Hueの値と色の関係は下図のようになっています。[3]

 

彩度の変更

続いて、彩度(Saturation)を変更します。ここでは0.5倍にしてみます。


import cv2 # OpenCVのインポート

img = cv2.imread('suiren.jpg') # 画像の読み出し
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換
h_deg = 0 #色相(Hue)の回転度数
s_mag = 0.5 # 彩度(Saturation)の倍率
v_mag = 1 # 明度(Value)の倍率

img_hsv[:,:,(0)] = img_hsv[:,:,(0)]+h_deg # 色相の計算
img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_mag # 彩度の計算
img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_mag # 明度の計算
img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換

cv2.imwrite('suiren_saturation.jpg', img_bgr) # 画像の保存

明度の変更

最後に明度(Value)を変更してみます。ここでは、0.5倍にしてみます。


import cv2 # OpenCVのインポート

img = cv2.imread('suiren.jpg') # 画像の読み出し
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換
h_deg = 0 #色相(Hue)の回転度数
s_mag = 1 # 彩度(Saturation)の倍率
v_mag = 0.5 # 明度(Value)の倍率

img_hsv[:,:,(0)] = img_hsv[:,:,(0)]+h_deg # 色相の計算
img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_mag # 彩度の計算
img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_mag # 明度の計算
img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換

cv2.imwrite('suiren_value.jpg', img_bgr) # 画像の保存

補足:OpenCVでjpg形式で保存するときの画質

JPEGで保存する際に画像の品質をcv2.IMWRITE_JPEG_QUALITYで指定することができます。
0が最低で100が最高、デフォルトは95となっています。


cv2.imwrite('suiren_value.jpg', img_bgr, [cv2.IMWRITE_JPEG_QUALITY, 100]) # 画像の保存

上のように指定します。

参考文献

[1] 画像処理のデータ拡張について調査した論文
Shorten, C., Khoshgoftaar, T.M. A survey on Image Data Augmentation for Deep Learning. J Big Data 6, 60 (2019).
https://doi.org/10.1186/s40537-019-0197-0

[2]Python-OpenCVでのRGBからHSVに変換
https://data-analysis-stats.jp/python/python-opencv%E3%81%A7%E3%81%AErgb%E3%81%8B%E3%82%89hsv%E3%81%AB%E5%A4%89%E6%8F%9B/

[3]OpenCVを使ってHSV色空間の色相Hを回転させる
https://tzmi.hatenablog.com/entry/2020/01/07/230036

[4] 画像のファイル形式を変換する方法
https://sciencompass.com/machine-learning/python-img-convert

 

モバイルバージョンを終了