我和我的团队想知道是否可以仅使用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
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
因此,上面的代码有效,但是我们必须使用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
因此,它只是空白,没有用。我们可以仅使用RGB颜色空间(不转换为HSV)执行相同的滤镜/蒙版吗?如果是这样,怎么办?感谢您的任何建议!
答案 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]))
上面的代码创建一个列表,其中包含该图像中颜色的所有像素值:
一旦您知道了这些颜色,就可以遍历图像中的每个像素,并查看颜色列表中是否包含该颜色:
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)
输出:
答案 1 :(得分:0)
@Miki指出了我的愚蠢错误。谢谢。感谢大家的评论和帮助。我现在得到一个很好的口罩,尽管它与HSV口罩并不相同。我必须确保掩码较低范围的每个R,G和B值都应小于掩码较高范围的相应R,G或B值。我想HSV到RGB的转换并不像看起来那样简单。仍然对此感到困惑,因为我认为这是线性转换(不过,这可能是我使用的在线转换器的一个错误)。