特定の色の物体を画像から抽出したい場合、RGBの色表現よりもHSVの方が便利な場合がある。

例えば、黄色の風船を画像から検出したいとき、同じ風船でも、陰で暗くなっている部分と、光が当たっている明るい部分では、RGBの値が異なる。

そんなことで、暗い黄色でも暗い黄色でも同じ色相なら同じ値で表現しようというのがHSVの表現方法。HSVとは、色相(H)彩度(S)、明度(V)を表している。

詳しくは、Wkipedia 参照。

OpenCV では、H は 0 から 179 の値で表現される。で、それぞれの値と色との対応関係を図示してみた。



赤は0側と180側の両方にあるので、取り扱い注意だ。

以下はこれを描いたプログラム。

import matplotlib.pyplot as plt
import numpy as np
import cv2

img = np.zeros((50 , 180, 3), dtype=np.uint8)

for i in range(180):
    img[:, i:i+1, 0] = i # H
img[:, : , 1] = 255      # S 
img[:, : , 2] = 255      # V

img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(img)
plt.xticks(range(0,180,10))
plt.yticks([])
plt.xlabel('H')
plt.savefig('hsv.jpg')
plt.show()