【问题标题】:Correct colorspace for cv2.inRange() function修正 cv2.inRange() 函数的色彩空间
【发布时间】:2021-08-31 19:07:03
【问题描述】:

关于以下 cv2.inRange(...) 调用:

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

'quantized_img' 和 'color' 参数必须严格在 HSV 中,还是可以有 RGB 图像和 RGB 'color'? RGB 似乎对我有用,但我能找到的所有示例都是基于 HSV 的。所以我担心正确的用法。 谢谢!

【问题讨论】:

  • 你可以使用任何颜色空间,只要你能找出颜色的上下限,颜色和图像在同一个颜色空间。所以 BGR 在 OpenCV 中很好。

标签: python opencv hsv color-conversion


【解决方案1】:

一般来说,使用您喜欢的任何色彩空间。 RGB/BGR 很好,HSV 很好,完全编造的东西(cv.transform)也很好。

inRange 跨越一个“立方体”。

考虑一下。想象一个带有 R、G、B 轴或 H、S、V 轴的 3D 图。在 RGB 空间中,立方体的面与这些 RGB 轴对齐。在 HSV 空间中,立方体的面与 那些 轴对齐。

现在,跨越 RGB 空间的立方体在转换为 HSV 空间时,与 HSV 空间中的轴对齐。事实上,它甚至不再是一个立方体,而可能是某种圆环或圆锥的一部分或其他东西。反过来也是一样。

如果您感兴趣的值区域,在您选择的任何空间中,是平坦甚至棒状(而不是大部分球形云),您必须跨越的立方体可能与您感兴趣的值区域对齐非常糟糕,并且必须包含很多您感兴趣的值。

因此,您进入另一个颜色空间,您感兴趣的值与该空间中的轴对齐得更好。那么由 inRange 跨越的立方体更适合您的目的。

想象一下 RGB 空间中的一根“棒”从黑角到白角。它代表没有饱和度的“颜色”(因为 colors 位于立方体的其他六个角中)。尝试在该区域上跨越一个立方体。不合适。

然而,在 HSV 空间中,它是微不足道的。通常它被可视化为一个圆柱体/倒锥体......在中心跨越一个薄圆柱体:任何色调(角度),任何值(高度),具有非常低的饱和度(靠近中心轴)。如果你把 HSV 当作一个立方体,你会跨过一堵薄壁。这一切都非常适合。

【讨论】:

    【解决方案2】:

    @Christoph Rackwitz 给出的解释是完全正确的。我只想补充一些我观察到的提示。

    • HSV 和 Lab 颜色空间是颜色分割的最佳选择。
    • 保留 BGR 色彩空间可能是最后的选择。
    • 不要盲目地开始在 HSV 或 Lab 颜色分割中为您的颜色寻找范围。也可以寻找其他方法。
    • 其他方法包括:
      • 将 HSV 和 Lab 的每个颜色通道分别可视化为灰度图像。您可能只会在那里看到一些模式。
      • 对我的情况有帮助的一件事是我对图像的“色调”和“饱和度”通道进行了 Otsu 的阈值处理,然后对它们的输出执行了按位或运算。最终图像包含我需要的一切,没有任何错误。对您的输入图像进行一次尝试以观察此类模式。这很有帮助。

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 2018-08-19
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多