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

时间:2019-07-09 12:53:59

标签: python opencv image-processing colors computer-vision

我已经以RGB和HSV格式生成了我的图像的散点图,并且正在使用inRange()来限制从单色图上注视单色的阈值。

要获取确切的RGB和HSV值,我正在使用paint.net的颜色选择器获取RGB值,然后使用RGB to HSV converter获取HSV值。

enter image description here

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

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)

enter image description here

尽管以上是RGB分割,但我认为在HSV中可能会得到改善。为什么我的HSV范围没有输出?

1 个答案:

答案 0 :(得分:4)

cvtColor的文档中所述。当它是CV_8U时,H值通常从0到360,它将被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更好?