Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV inRange()适用于RGB,但不适用于HSV颜色空间_Python_Opencv_Image Processing_Colors_Computer Vision - Fatal编程技术网

Python OpenCV inRange()适用于RGB,但不适用于HSV颜色空间

Python OpenCV inRange()适用于RGB,但不适用于HSV颜色空间,python,opencv,image-processing,colors,computer-vision,Python,Opencv,Image Processing,Colors,Computer Vision,我以RGB和HSV格式生成了我的图像散点图,我使用inRange()通过查看图来设置单色阈值 为了获得精确的RGB和HSV值,我使用paint.net的颜色选择器获取RGB值,然后使用an获取HSV值 像素颜色和散点图通过以下方式生成: img = cv2.imread('C:\\b_.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pixel_colors = img.reshape((np.shape(img)[0]*np.shape(

我以RGB和HSV格式生成了我的图像散点图,我使用
inRange()
通过查看图来设置单色阈值

为了获得精确的RGB和HSV值,我使用paint.net的颜色选择器获取RGB值,然后使用an获取HSV值

像素颜色和散点图通过以下方式生成:

img = cv2.imread('C:\\b_.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


pixel_colors = img.reshape((np.shape(img)[0]*np.shape(img)[1], 3))
norm = colors.Normalize(vmin=-1., vmax=1.)
norm.autoscale(pixel_colors)
pixel_colors = norm(pixel_colors).tolist()

h, s, v = cv2.split(img_hsv)
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")

axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors, marker=".")
axis.set_xlabel("Hue")
axis.set_ylabel("Saturation")
axis.set_zlabel("Value")
plt.show()
我需要从我的图像中提取黄色。如前所述,我正在使用paint.net颜色选择器获取浅黄色和深黄色的RGB值。然后使用转换器获取
inRange()
函数的HSV值

light_yellow = (60, 89, 97)    # HSV VALUES
dark_yellow = (61, 36.6, 43.9)

mask = cv2.inRange(img_hsv, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)
但是生成的结果是一个黑色图像,但是如果我直接使用浅黄色和深黄色的RGB值,并使用RGB图像,而不是HSV转换图像,分割工作正常

light_yellow = (249, 249, 125)    # RGB VALUES
dark_yellow = (111, 112, 71)

mask = cv2.inRange(img, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)


虽然上面是RGB分割,但我觉得在HSV中可能会有所改进。为什么我的HSV范围不提供输出?

如的文档中所述。当它是CV_8U时,通常从0到360的H值,它被2除以,从0到180。S和V值通常为百分比(0-100%),其范围为0-255

所以你的价值观是:

light_yellow = (60, 89, 97)    # HSV VALUES
dark_yellow = (61, 36.6, 43.9)
应该更像:

# (H/2, (S/100) * 255, (V/100) * 255) 
light_yellow = (30, 227, 247)    # HSV VALUES
dark_yellow = (31, 93, 112)
现在您又遇到了另一个问题,inRanges在低和高范围内查找值,而不是通过浅黄色和深黄色。因此,您的限制应该是:

low = (30,93,112)
high = (31, 227,247)

mask = cv2.inRange(img_hsv, low, high)

还有一件事,我会对H颜色使用更大的范围。。。30-31相当小,也许20-32更好?

HSV没有统一的定义。如果要比较颜色,应始终使用相同的软件进行转换。只是一个小小的额外建议,尝试使绘图的颜色更均匀(没有阴影),如果没有,则过滤后某些点将不可见。(像黄色的左边的灰色的)