画像を編集するには、人間の感覚に近い 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)
薄曇りの写真も、水色〜青の彩度を中心に上げることで、空の青さが強調され、配色豊かになる。連続関数の数式を用いたため、色相が異なる部分とも自然に接続する。
コメント