如何检查RGB颜色列表中的所有项目是否在没有循环的图像中?

2024-09-19 23:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个RGB值列表,如下所示:

rgbL = [[20 45 40] [30 45 60] .... [70 50 100]]

然后,我有一个图像说,img = cv.imread("location")

现在,如果图像RGB值在我的RGB值列表(rgbL)中,我想将图像的所有RGB值更改为(255,0,0)

我可以通过以下代码完成此操作:

for rgb in rgbL :

    k = list(filter(None, rgb[1:-1].split(" ")))
    r = int(k[0])
    g = int(k[1])
    b = int(k[2])

    img[np.all(img == (r, g, b), axis=-1)] = (255,0,0)  

但是上面的代码太长,因为我的“rgbL”列表太长

有没有一种方法可以不用循环就可以做到这一点?以numpyish的方式实现它的最佳方式是什么


Tags: 代码in图像列表imgfor方式location
2条回答

上述算法是O(rgbL的长度*图像的大小)

我们可以把它降到O(rgbL的长度+图像的大小)

set_rgbl = set(rgbL)
height = img.shape[0]
width = img.shape[1]
BLUE_COLOR = (255, 0, 0)

for h in range(0, height):
    for w in range(0, width):
        if list(img[h, w]) in set_rgbl:
            img[h, w] = BLUE_COLOR

这里发生的是我们创建了一组rgbL值。插入集是恒定时间操作。对于查找,同样适用。因此,当我们对图像中的每个像素值进行迭代时,我们花费了O(1)时间。这将提高我们的时间复杂性

希望有帮助

rgbLimg转换为numpy数组。一种不用循环的方法:

sh = img.shape
img = img.reshape(-1, 3)
img[np.where(((rgbL[:,None,:]-img)==0).all(axis=2))[1]]=np.array([255,0,0])
img = img.reshape(sh)

这将获取图像与rgbL每行的差异,并检查要使用np.where替换的RGB中的all零差异

样本img和输出:

img:
[[ 20  45  40]
 [ 30  45  60]
 [  0   1   2]
 [ 70  50 100]
 [  4   5   6]]
rgbL:
[[ 20  45  40]
 [ 30  45  60]
 [ 70  50 100]]
Output:
[[255   0   0]
 [255   0   0]
 [  0   1   2]
 [255   0   0]
 [  4   5   6]]

更新:每个OP关于将字符串dict键转换为numpy数组的评论:

rgbL = np.array([list(map(int,[s.strip() for s in key.strip('[').strip(']').strip(' ').split(' ') if s.strip()])) for key in rgb_dict.keys()])

相关问题 更多 >