如何将OpenCV图像与颜色进行比较

时间:2018-08-20 22:35:54

标签: python numpy opencv image-processing

问题相对简单。

我有一张图像,我知道该图像的背景色。鉴于我要创建图像的前景遮罩。

我尝试过:

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方法的帮助下,是否存在进行这种比较的正确方法?

1 个答案:

答案 0 :(得分:2)

我不知道任何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的)方式来实现此目的...