【问题标题】:How to compare OpenCV image with color如何将 OpenCV 图像与颜色进行比较
【发布时间】:2018-08-22 04:33:59
【问题描述】:

问题比较简单。

我有一张图片,并且我知道图片的背景颜色。鉴于我想创建图像的前景蒙版。

我试过这个:

background_color = np.array([255, 255, 255], dtype=np.uint8)

foreground = image != background_color

我期望的是一个布尔矩阵,其形状为 HxWx1,颜色匹配时为 True,颜色不匹配时为 False。

但是此操作不是比较颜色,而是比较所有三个颜色分量,我得到 HxWx3 大小的矩阵,其中颜色分量匹配时为 True,不匹配时为 False。

我用 for 循环创建了一个临时解决方案:

foreground = np.zeros(shape=(height, width, 1), dtype=np.bool)
    for y in range(height):
        for x in range(width):
            if not np.array_equal(image[y, x], background_color):
                foreground[y, x] = True

但是,当然,这工作缓慢。我的问题如下:在 numpy 或 OpenCV 方法的帮助下,是否有合适的方法进行此类比较?

【问题讨论】:

标签: python numpy opencv image-processing


【解决方案1】:

我不知道任何 numpy 函数,但您可以链接 np.any() 调用:

foreground = np.any(image != background_color, axis=-1)

foreground 的形状将等于image.shape[:-1]。如果你想要额外的维度,你可以使用:

foreground = np.any(image != background_color, axis=-1)[..., np.newaxis]

我觉得可能存在更好(更像 numpy)的方式来做到这一点......

【讨论】:

  • 谢谢你,@Berriel。您可能想到的是 np.any() 而不是 np.all()?使用您的解决方案,此操作只需 6 毫秒,而不是像以前一样的 1720 毫秒。这非常适合我。
  • @Ruslan 如果你使用np.any(),即使只有一个通道相等,掩码也会是True。如果你需要你的掩码是True,前提是所有通道的值都相等,那么np.all()是要走的路。
  • 如果你有 image == background_color,那将是 true,但这里我们正在做 image != background_color,如果任何组件不匹配,结果必须为 False。
  • @Ruslan 哦,我在本地示例中尝试了==,但忘记了您的示例实际上是!= :) 抱歉。
猜你喜欢
  • 2021-04-15
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多