RGB画像の特定の色を抜き出すときは、RGBからHSVに変換してinRange関数を使ってマスク画像を生成する方法が一般的だと思うんだけど、その時の色の範囲について備忘録としてまとめます。
ちなみに全然ドキュメントに書いてある。
S(Saturation,彩度)とV(Value,明度)は0~255
H(Hue,色相)はお絵描きソフト(PhotoShop,ClipStadio)では0~100か0~360に設定されているが、openCVの内部的には0~255の値を持つらしい。しかし入力には0~180を期待していて、181階調から256階調に内部で変換している。
なんで0から180なんだろう...0~360でも良くない?
ご存知の方いたら後学のために理由を教えていただけると幸いです。
サンプルコード
import numpy as np
import cv2
# 緑色の検出
def detect_green(hsv):
hsv_min = np.array([50, 100, 100])
hsv_max = np.array([65, 255, 255])
msk = cv2.inRange(hsv, hsv_min, hsv_max)
# マスク画像の確認
cv2.imwrite('sample_msk.png', msk)
# cv2.imshow('green', msk)
# cv2.waitKey(0)
# cv2.destroyWindow('green')
# 白い領域(検出したい色)があるかどうか
if len(msk[msk.nonzero()]) >= 1:
return True
else:
return False
# 全然こっちでいい
# return True if len(msk[msk.nozero()]) >= 1 else False
rgb = cv2.imread('sample.png')
hsv = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV)
if detect_green(hsv):
print('detect')
else:
print('can\'t detect')