没有HSV颜色空间的情况下如何进行颜色过滤/遮罩?

时间:2019-12-05 21:05:41

标签: python opencv image-processing

我和我的团队想知道是否可以仅使用RGB值对图像执行颜色过滤。到目前为止,我们仅找到了HSV的解决方案。我们正在使用Jupyter Notebook。这是一个可重现的示例:

import cv2
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import hsv_to_rgb


test = cv2.imread('test.jpg')
test = cv2.cvtColor(test, cv2.COLOR_BGR2RGB)
plt.imshow(test) # result below

enter image description here

hsv = cv2.cvtColor(test, cv2.COLOR_RGB2HSV)

lower_orange = np.array([10, 100, 20]) # hsv color space
upper_orange = np.array([25, 255, 255]) # hsv color space
orange_mask = cv2.inRange(hsv, lower_orange, upper_orange)

res = cv2.bitwise_and(test, test, mask = orange_mask)
plt.imshow(res) # result below

enter image description here

因此,上面的代码有效,但是我们必须使用HSV颜色空间。

这是我尝试过的未进行HSV转换的代码(范围值是上面使用的原始橙色HSV到RGB的直接转换):

lower_orange_rgb = np.array([20, 14, 12]) # rgb color space
upper_orange_rgb = np.array([255, 106, 0]) # rgb color space
orange_mask_rgb = cv2.inRange(test, lower_orange_rgb, upper_orange_rgb)

res = cv2.bitwise_and(test, test, mask = orange_mask_rgb)
plt.imshow(res) # result below

enter image description here

因此,它只是空白,没有用。我们可以仅使用RGB颜色空间(不转换为HSV)执行相同的滤镜/蒙版吗?如果是这样,怎么办?感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

查看充满活力的图像时,您会看到颜色。 OpenCV和Numpy不会。他们看到一组数字。这消除了所有复杂性。

通过遍历每一行和每一列,然后将像素值保存到列表中,很容易找到图像中的所有颜色:

import cv2
import numpy as np   
img = cv2.imread('/home/stephen/Desktop/bIeGp.png')
img = cv2.resize(img, (300,300))
colors = img[100:150,100:250].copy()

# Iterate through each pixel in the colors image
colorsList = []
for x in range(colors.shape[1]):
    for y in range(colors.shape[0]):
        colorsList.append(tuple(colors[y,x]))

上面的代码创建一个列表,其中包含该图像中颜色的所有像素值:

match image

一旦您知道了这些颜色,就可以遍历图像中的每个像素,并查看颜色列表中是否包含该颜色:

for y in range(img.shape[0]):
    for x in range(img.shape[1]):
        #print(tuple(img[y,x]))
        if colorsList.count(tuple(img[y,x])) > 0:
            img[y,x] = 1,1,1
        else: img[y,x] = 123,123,123
    cv2.imshow('img', img)
    cv2.waitKey(1)

输出:

output

答案 1 :(得分:0)

@Miki指出了我的愚蠢错误。谢谢。感谢大家的评论和帮助。我现在得到一个很好的口罩,尽管它与HSV口罩并不相同。我必须确保掩码较低范围的每个R,G和B值都应小于掩码较高范围的相应R,G或B值。我想HSV到RGB的转换并不像看起来那样简单。仍然对此感到困惑,因为我认为这是线性转换(不过,这可能是我使用的在线转换器的一个错误)。