特定の色を別の色に変換する(赤い服を緑の服に変える)
HSV色空間は色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Lightness・Brightness)の三つの成分からなる色空間で、この色相値を変更することで彩度、明度を保ったまま色を変えることができます。
opencvにおけるHSV色空間のHue値は0~179の値をとります。
赤は0付近と179付近にあるので、例えば青に変換する場合は
赤(0付近)->120足す
赤(0付近)->60引く(120足すと180以上になるので、+120-180)
となります。
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- cv2.cvtColor() : 画像の色空間変換
- numpy.copy() : ndarrayのコピーを作成
- numpy.where() : 条件を満たすndarray要素の置換
- cv2.imwrite() : 画像を保存する
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)のディレクトリにフォルダ'colorchange'を作りファイル名’santa_girl.jpg’で保存しました。
santa_girl.jpg
コード
import cv2 # OpenCVのインポート import numpy as np # numpyのインポート img = cv2.imread('colorchange/santa_girl.jpg') # 画像の読み出し hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR->HSV変換 hsv_2 = np.copy(hsv) hsv_3 = np.copy(hsv) # h>173の画素のhを-90 hsv_2[:, :, 0] = np.where(hsv[:, :, 0]>173,hsv[:, :, 0]-90,hsv[:, :, 0]) # h<5の画素のhを+90 hsv_3[:, :, 0] = np.where(hsv_2[:, :, 0]<5,hsv_2[:, :, 0]+90,hsv_2[:, :, 0]) bgr = cv2.cvtColor(hsv_3, cv2.COLOR_HSV2BGR) # HSV->BGR変換 cv2.imwrite('colorchange/colorchange.jpg',bgr) # 画像の保存
実行結果
元画像の赤い部分が緑に変換されます。
コード
import cv2 # OpenCVのインポート import numpy as np # numpyのインポート img = cv2.imread('colorchange/santa_girl.jpg') # 画像の読み出し hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR->HSV変換 hsv_2 = np.copy(hsv) hsv_3 = np.copy(hsv) # h>173の画素のhを-60 hsv_2[:, :, 0] = np.where(hsv[:, :, 0]>173,hsv[:, :, 0]-60,hsv[:, :, 0]) # h<5の画素のhを+120 hsv_3[:, :, 0] = np.where(hsv_2[:, :, 0]<5,hsv_2[:, :, 0]+120,hsv_2[:, :, 0]) bgr = cv2.cvtColor(hsv_3, cv2.COLOR_HSV2BGR) # HSV->BGR変換 cv2.imwrite('colorchange/colorchange.jpg',bgr) # 画像の保存
実行結果
元画像の赤い部分が青に変換されます。
以下のサイトを参考にさせていただきました
OpenCV-Python Tutorials >> 色空間の変換
Wikipedia >> HSV色空間
Pythonの文法メモ > 【OpenCV】cvtColorによるBGRからグレースケール, HSVへの色空間変換