如何更改numpy数组中的像素值

时间:2017-11-18 12:46:45

标签: python python-2.7 numpy

我有一个大的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

但是这样我没有一个像素。有一种类似的方式,它不是迭代索引?

2 个答案:

答案 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第三维中的红色管道。