【问题标题】:OpenCV inRange() is working for RGB but not HSV color spaceOpenCV inRange() 适用于 RGB 但不适用于 HSV 颜色空间
【发布时间】:2019-11-19 01:00:03
【问题描述】:

我以 RGB 和 HSV 格式生成了我的图像的散点图,并且正在使用 inRange() 对单一颜色进行阈值处理,以防止对图的注视。

为了获得准确的 RGB 和 HSV 值,我使用 paint.net 的颜色选择器来获取 RGB 值,然后使用RGB to HSV converter 来获取 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 范围没有输出?

【问题讨论】:

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

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


【解决方案1】:

正如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 更好?

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2012-11-02
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多