我有一个大的RGB图像作为numpy数组,我想设置所有像素,其中R = 0,G = 0,B = 0到R = 255,G = 0,B = 0。 什么是最快的方式? 我试过了:
for pix in result:
if np.all(np.logical_and(pix[0]==pix[1],pix[2]==0,pix[2]==pix[1])):
pix [0] = 255
但是这样我没有一个像素。有一种类似的方式,它不是迭代索引?
答案 0 :(得分:3)
所以这是一个矢量化解决方案。你的图像基本上是一个w乘3(颜色)数组。所以我们可以利用不易掌握但功能非常强大的广播规则。
所以基本上我们将整个数组与你想要的值的3向量进行比较。由于广播规则,Numpy会将每个像素与该三个向量进行比较并告诉您它是否匹配(因此在这种特定情况下,如果红色,绿色和蓝色匹配)。因此,您将得到一个布尔数组的trues和与图像大小相同的falses。
现在我们只想找到所有三种颜色匹配的像素。为此我们使用“all”方法,如果数组的所有值都为true,则为true。如果我们将它应用于某个轴 - 在这种情况下是颜色轴 - 我们得到一个w由h数组,即所有颜色匹配的地方都是真的。
现在我们可以将这个2D布尔掩码应用到我们原来的w乘以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]
答案 1 :(得分:1)
由于所有值都是正数或空值,因此一种简单有效的方法是:
img[img.sum(axis=2)==0,0]=255
img.sum(axis=2)==0
选择两个第一维中的好像素,0
第三维中的红色管道。