这是一个矢量化的解决方案。您的图像基本上是一个 w x h x 3(颜色)数组。我们可以利用那些不容易掌握但非常强大的广播规则。
基本上,我们将整个数组与具有您要查找的值的 3 个向量进行比较。由于广播规则,Numpy 会将每个像素与这三个向量进行比较,并告诉您它是否匹配(因此在这种特定情况下,红色、绿色和蓝色是否匹配)。您最终将得到一个与图像大小相同的 true 和 false 布尔数组。
现在我们只想找到所有三种颜色都匹配的像素。为此,我们使用“all”方法,如果数组的所有值都为 true,则该方法为 true。如果我们将其应用于某个轴(在本例中为颜色轴),无论所有颜色都匹配,我们都会得到一个 true 的 w x h 数组。
现在我们可以将此 2D 布尔掩码应用回原始的 w x h x 3 数组,并获取与我们的颜色匹配的像素。我们现在可以重新分配它们——再次通过广播。
这是示例代码
import numpy as np
#create a 2x2x3 image with ones
img = np.ones( (2,2,3) )
#make the off diagonal pixels into zeros
img[0,1] = [0,0,0]
img[1,0] = [0,0,0]
#find the only zeros pixels with the mask
#(of course any other color combination would work just as well)
#... and apply "all" along the color axis
mask = (img == [0.,0.,0.]).all(axis=2)
#apply the mask to overwrite the pixels
img[ mask ] = [255,0,0]