Edited at

OpenCVでHSV色空間のHueを扱う時の注意点

OpenCVで物体識別を行う際に、OpenCVのHSV色空間、特にHueの扱いではまったので、まとめておく。


まとめ


  • Hueは0から179の範囲を取る。

  • 他のアプリケーションではHueは0から360を取る場合もある。その場合は、OpenCVでデータを読み書きする時にHueを2倍するか1/2倍にする。

  • 0から179の範囲外でも動くけど混乱の元なので、0から179のレンジに収める。


OpenCVの仕様

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html?highlight=hsv


For HSV, Hue range is [0,179], Saturation range is [0,255] and Value range is [0,255]. Different softwares use different scales. So if you are comparing OpenCV values with them, you need to normalize these ranges.


以下のように書いてある。

- OpencCVの場合、HSVではHueは0から179、Saturationは0から255、Valueは0から255の範囲だよ

- 他のアプリケーションと範囲違うかもよ

- 正規化(0から179の範囲に合わせてから)して使ってね

画像処理ソフトではHueは0から360を取るケースが多いようなので、OpenCV側で2倍するか1/2倍にする。


RGB、CMYK、Hue(0-360)、Hue(Opencv)の早見表

HSVのS、Vの値を最大値とした場合の早見表(S=100 or 360、V=100 or 360で固定)

RGB 16進数表記
RGB(0-255)
CMY(0-100)
H(H=0-360)
Hue(OpenCV H=0-179)

#ff0000
(255,0,0)
(0,100,100)
0
0

#ff7f00
(255,128,0)
(0,50,100)
30
15

#ffff00
(255,255,0)
(0,0,100)
60
30

#80ff00
(128,255,0)
(50,0,100)
90
45

#00ff00
(0,255,0)
(100,0,100)
120
60

#00ff80
(0,255,128)
(100,0,50)
150
75

#00ffff
(0,255,255)
(100,0,0)
180
90

#0080ff
(0,128,255)
(100,50,0)
210
105

#0000ff
(0,0,255)
(100,100,0)
240
120

#8000ff
(128,0,255)
(50,100,0)
270
135

#ff00ff
(255,0,255)
(0,100,0)
300
150

#ff0080
(255,0,128)
(0,100,50)
330
165

#ff0000
(255,0,0)
(0,100,100)
360
n/a


Hueに範囲外の値を指定した場合

以下の図は、OpenCVでHueに0から700の値を指定した場合(横軸がHue)。

256、512のところで0(赤色)に戻っている。

これから分かるようにHueが256以上になると0に戻る。

180から255までは見た目問題なく動作するけど、256以上は想定と違う動作になる。

混乱の元になるので、OpenCVではHueは0から179で使うこと。