画像の彩度、明度を変える
opencvのimreadで読み込んだ画像はBGR(青緑赤)の3チャンネルからなるndarrayなので、これを色空間変換により色相(Hue)、彩度(Saturation)、明度(Value)からなるHSV色空間に変換し、彩度と明度を調整します。
関連記事
ルックアップテーブルによる画像コントラストの補正
特定の色を別の色に変換する(赤い服を緑の服に変える)
PillowのImageEnhanceで画像の鮮やかさを変える
PillowのImageEnhanceで画像のブライトネス(明るさ)を変える
ルックアップテーブルで画像の彩度、明度を調整する(画像を明るく鮮やかにする)
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- cv2.cvtColor() : 画像の色空間変換
- cv2.threshold() : 画像の二値化
- np.where() : 条件を満たすndarrayの要素の置換
- cv2.imwrite() : 画像を保存する
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名'rose.jpg'でjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
rose.jpg
コード
彩度Sを0.7倍にした場合
import cv2 # OpenCVのインポート img = cv2.imread('rose.jpg') # 画像の読み出し img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換 s_magnification = 0.7 # 彩度(Saturation)の倍率 v_magnification = 1 # 明度(Value)の倍率 img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_magnification # 彩度の計算 img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_magnification # 明度の計算 img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換 cv2.imwrite('rose_contrast.jpg',img_bgr) # 画像の保存
実行結果
コード
彩度Sを0.5倍にした場合
import cv2 # OpenCVのインポート img = cv2.imread('rose.jpg') # 画像の読み出し img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換 s_magnification = 0.5 # 彩度(Saturation)の倍率 v_magnification = 1 # 明度(Value)の倍率 img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_magnification # 彩度の計算 img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_magnification # 明度の計算 img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換 cv2.imwrite('rose_contrast.jpg',img_bgr) # 画像の保存
実行結果
コード
明度Vを0.7倍にした場合
import cv2 # OpenCVのインポート img = cv2.imread('rose.jpg') # 画像の読み出し img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換 s_magnification = 1 # 彩度(Saturation)の倍率 v_magnification = 0.7 # 明度(Value)の倍率 img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_magnification # 彩度の計算 img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_magnification # 明度の計算 img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換 cv2.imwrite('rose_contrast.jpg',img_bgr) # 画像の保存
実行結果
コード
明度Vを0.5倍にした場合
import cv2 # OpenCVのインポート img = cv2.imread('rose.jpg') # 画像の読み出し img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 色空間をBGRからHSVに変換 s_magnification = 1 # 彩度(Saturation)の倍率 v_magnification = 0.5 # 明度(Value)の倍率 img_hsv[:,:,(1)] = img_hsv[:,:,(1)]*s_magnification # 彩度の計算 img_hsv[:,:,(2)] = img_hsv[:,:,(2)]*v_magnification # 明度の計算 img_bgr = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) # 色空間をHSVからBGRに変換 cv2.imwrite('rose_contrast.jpg',img_bgr) # 画像の保存
実行結果
以下のサイトを参考にさせていただきました
OpenCV-Python Tutorials >> 色空間の変換
Wikipedia >> HSV色空間
Pythonの文法メモ > 【OpenCV】cvtColorによるBGRからグレースケール, HSVへの色空間変換