关于以下 cv2.inRange(...) 调用:
mask = cv2.inRange(quantized_img, color, color)
'quantized_img' 和 'color' 参数必须严格采用 HSV 格式,还是可以使用 RGB 图像和 RGB“颜色”? RGB 似乎对我有用,但我能找到的所有示例都是基于 HSV 的。所以我很关心正确的用法。 谢谢!
最佳答案
一般来说,使用您喜欢的任何颜色空间。 RGB/BGR 很好,HSV 很好,完全组成的东西(使用 cv.transform
)也很好。
inRange
跨越一个“立方体”。
想一想。想象一个带有 R、G、B 轴或 H、S、V 轴的 3D 图。在 RGB 空间中,立方体的面与这些 RGB 轴对齐。在 HSV 空间中,立方体的面与那些轴对齐。
现在,跨越 RGB 空间的立方体在转换到 HSV 空间时,不与 HSV 空间中的轴对齐。事实上,它甚至不再是立方体,而可能是某种圆环体或圆锥体的一部分或其他东西。反过来也是一样。
如果您感兴趣的值区域,无论您选择什么空间,都是平坦甚至棒状(而不是大部分球形云),您必须跨越的立方体可能与您感兴趣的值区域对齐得非常糟糕,并且必须包含许多您不感兴趣的值。
因此您进入另一个颜色空间,您感兴趣的值与该空间中的轴稍微对齐。那么由 inRange 跨越的立方体更符合您的目的。
想象一下 RGB 空间中的一根“棍子”从黑角到白角。它表示没有饱和度的“颜色”(因为颜色位于立方体的其他六个角)。尝试在该区域上跨越一个立方体。不太合身。
然而,在 HSV 空间中,这是微不足道的。通常它被可视化为一个圆柱体/倒锥体,虽然......在中心跨越一个薄圆柱体:任何色调(角度),任何值(高度),具有非常低的饱和度(靠近中心轴)。如果您将 HSV 视为一个立方体,您将跨越一堵薄墙。这一切都非常合适。
https://stackoverflow.com/questions/69004124/