OpenCV で HSV 色空間を編集する

画像を編集するには、人間の感覚に近い HSV 色空間(色相/彩度/明るさ の3成分で表現される色空間)で数値を編集するのが良い。OpenCV では、cv2.cvtColor(元画像,cv2.COLOR_BGR2HSV)) で HSV に変換できる。HSV から元の BGR に戻すには、cv2.cvtColor(HSV画像,cv2.COLOR_HSV2BGR) とすれば良い。

今回は、特定の色相 h 周辺の彩度 s を強くするコードを書いた。中心の色相を引数 hmean に、周辺の広がり具合を引数 vari に格納し、画像を編集した。

import cv2
import sys
import numpy as np

# 画像を加工する                                                                                                          
def mkimg(img):
    img2 = hsvtune(img,120.,2000.)
    return img2

# hsv操作                                                                                                                 
def hsvtune(img,hmean=120.,vari=2000.):
    h,s,v = np.float32(cv2.split(cv2.cvtColor(img,cv2.COLOR_BGR2HSV)))  # 色空間をBGRからHSVに変換                        
    s =	s + s * (1./((h - hmean)**2/vari + 1.))
    hsv = ct(cv2.merge((h,s,v)))
    return cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)

# 値を0-255にclipして、typeをuint8にする                                                                                  
def ct(img):
    return np.clip(img,0,255).astype(np.uint8)

file_name = sys.argv[1]
img = cv2.imread(file_name)
img2 = mkimg(img)

cv2.imwrite(file_name.replace(".",".out."),img2)
元画像:千葉公園の荒木山
彩度強調画像:hmean = 120.(水色〜青) , vari = 2000.

薄曇りの写真も、水色〜青の彩度を中心に上げることで、空の青さが強調され、配色豊かになる。連続関数の数式を用いたため、色相が異なる部分とも自然に接続する。

元画像:オオガハスの花
彩度強調画像:hmean = 120.(水色〜青) , vari = 2000.

コメント

タイトルとURLをコピーしました