Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

特定の色を別の色に変換する(赤い服を緑の服に変える)

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() : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、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への色空間変換

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村