OpenCV実験python3 HSVとは

OpenCV実験シリーズです。

今回はたとえばとあるセルの領域が大体何色なのか判別したい、という要件がありまして、それをどうやって素人がそれなりにOpenCV-python3で判別できるのかをいけるところまでやってみた記録です。

普段画像処理などやっていないIT屋さんにすれば画像の色といえばRGBかと思いますが、実際OpenCVで試してみるとHSV空間に変換したほうが、判別はしやすそう、ということがわかりましたので試してみます。

そもそもHSVとは?

基本的なことは権威のあるサイトにお任せです。

HSV色空間 – Wikipedia

鳥取大学サイト

まあBGRを何かの変換機にかけると色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Lightness・Brightness)の3つの要素に変換される、ということでしょうか。

環状のHSV色空間 はpintaでもでてきますね。実際にpinta触ってみるとよくわかると思います。下図はpintaの色指定の画面です。

pinta_hsv

・Hueは円環の部分ですね。右端の切れ目から反時計周りにPintaの値設定ですと、0から360まで値をとります。(OpenCVでは0から179までの値をとるようです。)赤い領域が切れ目になっているので、赤っぽい色をHueでとる場合はhue値の小さいもの(たとえばhue=10のあたり)と大きいものの(たとえばhue=350)2つエリアを拾う必要がありますね。

・Saturationは三角形の白から赤エリアの領域ですね(Pinta値0から100。OpenCVは0から255) 。赤エリアと書いていますが、Hueの値によって色がちがってきます。 値が小さいと白っぽい感じでしょうか?。

・Valueは同じく三角形の黒から赤エリアの領域です (Pinta値0から100。 OpenCVは0から255 ) 。 赤エリアと書いていますが、Hueの値によって色がちがってきます。 値が小さいと黒っぽい感じでしょうか?。

私の作ったちょっとしたツールではHue要素を見るだけで十分いろいろな色が判別できましたがどうなのでしょうか。

ためしにSaturationとValueをPinta設定値でそれぞれ100で固定して、Hueが Pinta設定値 で10(hue10.jpg)と350(hue350.jpg)の画像を作ってみてOpenCVでHue値を取ってみました。

pythonコードは超シンプルにすると以下のようでしょうか。

#HSV.py
import cv2

infile='hue10.jpg'
img = cv2.imread(infile)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hue1=hsv[0][0][0]
print(hue1)

で入力ファイルをそれぞれの画像ファイルに設定して実行すると出力は

#infile='hue10.jpg'のとき
5

#infile='hue350.jpg'のとき
175

と計算から予想される値

#infile='hue10.jpg'のとき
179*10/360=4.97 

#infile='hue350.jpg'のとき
179*350/360=174.03

と大体一致することが確認できました。