The advantage of HSV is that you can select the color with lower and upper, but I had a hard time because the lower and upper for the color are unknown, so make a note.
It's like an extension of rgb, and consists of hue (Hue), saturation (Saturation / Chroma), and lightness. What makes me happy is that it is easy to specify the range of colors. The H part corresponds to the rgb part.
Hue-Color type 0-360 range Saturation-Color vividness in the range of 0-100%. Brightness-Color brightness in the range of 0-100%.
The value set in is said to change depending on the software. With opencv, I think the brightness is between 100 and 255.
See wiki https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
simulator http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
convert.py
import sys
import numpy as np
import cv2
#rgb
red = sys.argv[1]
green = sys.argv[2]
blue = sys.argv[3]
color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
hue = hsv_color[0][0][0]
print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")
print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")
python convert.py 255 255 255
I convert it like this, but this one can only be converted roughly.
hsv.py
import cv2
import numpy as np
image_hsv = None # global ;(
pixel = (20,60,80) # some stupid default
# mouse callback function
def pick_color(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
pixel = image_hsv[y,x]
#you might want to adjust the ranges(+-10, etc):
upper = np.array([pixel[0] + 10, pixel[1] + 10, pixel[2] + 40])
lower = np.array([pixel[0] - 10, pixel[1] - 10, pixel[2] - 40])
print(pixel, lower, upper)
image_mask = cv2.inRange(image_hsv,lower,upper)
cv2.imshow("mask",image_mask)
def main():
import sys
global image_hsv, pixel # so we can use it in mouse callback
image_src = cv2.imread(sys.argv[1]) # pick.py my.png
if image_src is None:
print ("the image read is None............")
return
cv2.imshow("bgr",image_src)
## NEW ##
cv2.namedWindow('hsv')
cv2.setMouseCallback('hsv', pick_color)
# now click into the hsv img , and look at values:
image_hsv = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
cv2.imshow("hsv",image_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__=='__main__':
main()
python hsv.py hoge.png
It is masked when it is started and double-clicked on the hsv screen. For example, yellow and green are very similar. Pink and red too. In this case, even though you click pink, red also reacts. In other words, you have to fine-tune the color depth and brightness. I didn't know how to do it automatically, so I played with it manually.
hsv_sample.py
import sys
import cv2
import numpy as np
import sys
import cv2
import numpy as np
#yellow
# lower = np.array([30,100,250])
# upper = np.array([40,255,255])
#pink
lower = np.array([160,50,50])
upper = np.array([180,255,255])
#yellowgreen
# lower = np.array([30,100,200])
# upper = np.array([60,255,250])
image_src = cv2.imread(sys.argv[1])
image_src = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
image_src = cv2.inRange(image_src,lower,upper)
while True:
cv2.imshow("image_src",image_src)
if cv2.waitKey(10) == 27: # ESC
break
A very primitive method, but a yellowgreen mask, which is very similar to yellow, also worked.
Because of this, it may have been possible to automate by displaying it and specifying the chot range.
python
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
How to define the “lower” and “upper” range of a color? http://answers.opencv.org/question/134248/how-to-define-the-lower-and-upper-range-of-a-color/ http://docs.opencv.org/trunk/df/d9d/tutorial_py_colorspaces.html
Recommended Posts