cv2.inRange()函数的正确色彩空间

3

关于下面的cv2.inRange(...)调用:

mask = cv2.inRange(quantized_img, color, color)

“quantized_img”和“color”参数必须严格使用HSV格式吗?还是RGB格式的图像和RGB颜色也可以使用?在我的实验中,RGB格式似乎可行,但是我找到的所有示例都是基于HSV格式的。所以我担心如何正确使用这些参数。 谢谢!


2
只要你能找到颜色的低和高范围,并且图像与颜色空间相同,你可以使用任何颜色空间。因此,在OpenCV中使用BGR是可以的。 - undefined
2个回答

5
一般来说,您可以使用任何颜色空间。RGB/BGR 是可以的,HSV 也是可以的,使用 cv.transform 完全自己定义的颜色空间也行。 inRange 跨越一个“立方体”。
想象一下,在 R、G、B 轴或者 H、S、V 轴上有一个三维图,以 RGB 空间为例,该立方体的面与 RGB 轴对齐。在 HSV 空间中,该立方体的面与 H、S、V 轴对齐。现在,一个在 RGB 空间内跨越的立方体,当转换到 HSV 空间时,不会与 HSV 空间内的轴对齐。实际上,它可能不再是一个立方体,而可能是一个圆环面或者锥形截面之类的形状。同样,反之亦然。
如果你感兴趣的数值区域(无论选择哪种颜色空间)是“平坦的”甚至是“条形的”(而不是基本呈球形分布),那么你必须跨越的立方体可能与你感兴趣的数值区域非常不适配,并且必须包括许多你不感兴趣的值。
所以你可以转到另一个颜色空间,使你感兴趣的数值在该空间中与轴有更好的对齐。然后,inRange 跨越的立方体将更适合你的目的。
以 RGB 空间中从黑色角到白色角的“条形”为例。它表示没有饱和度的“颜色”(因为“颜色”在该立方体的其他六个角落里)。试着跨越一个立方体覆盖这个区域。效果不佳。
但是,在 HSV 空间中,这很容易。通常将其可视化为圆柱体/倒置圆锥体...在中心跨越一个细长的圆柱体:任何色调(角度),任何明度(高度),具有非常低的饱和度(靠近中心轴线)。如果您将 HSV 视为立方体,则会跨越一堵薄墙。所有这些都非常适配。
参考:RGB 立方体 HSV 圆锥体

谢谢!我在信号处理中问了一个关于使用HSV进行物体检测的类似问题。这帮助我很多地理解了HSV空间。请问我可以在哪里找到HSV空间的数学基础呢? - undefined
另外,“立方体的面与RGB轴对齐。在HSV空间中,立方体的面与那些轴对齐。”这句话是什么意思? - undefined

2
@Christoph Rackwitz所提供的解释是完全正确的。我只想补充一些我观察到的技巧。
  • 对于颜色分割,HSV和Lab颜色空间是最好的选择。
  • 将BGR颜色空间作为最后一个选项。
  • 不要盲目地开始在HSV或Lab颜色分割中查找颜色范围。也要寻找其他方法。
  • 其他方法包括:
    • 将HSV和Lab的每个颜色通道单独可视化为灰度图像。你可能会看到一些模式。
    • 在我的案例中有帮助的一件事是,我对图像的“色调”和“饱和度”通道进行了Otsu阈值处理,然后对它们的输出执行了按位或操作。最终图像没有任何错误,我得到了我需要的一切。在输入图像上尝试并观察这样的模式。这非常有帮助。

谢谢。你能否请参考一篇文章/数学基础,解释为什么"HSV和Lab颜色空间是最适合进行颜色分割的。”?你也能否提供更多关于图像分割中颜色阈值的资料? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接