2017-11-18 44 views
2

我有一个很大的RGB图像作为numpy数组,我想设置所有像素具有R = 0,G = 0,B = 0到R = 255,G = 0 ,B = 0。 什么是最快的方式? 我想:如何改变numpy数组中的像素值

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

什么是你的形象'.shape'? – gboffi

回答

3

所以这里是一个矢量化的解决方案。你的图像基本上是由3个(颜色)阵列组成的h。所以我们可以利用不易掌握但非常强大的广播规则。

因此,基本上我们将整个数组与一个3向量与您正在查找的值进行比较。由于广播规则,Numpy会将每个像素与这三个向量进行比较,并告诉您它是否匹配(因此在这种特定情况下,如果红色,绿色和蓝色匹配)。所以你最终会得到一个与图像大小相同的布尔数组和真值。

现在我们只想找到所有三种颜色匹配的像素。为此,我们使用“all”方法,如果数组的所有值都为true,则这是真的。如果我们将它应用到某个轴 - 在这种情况下是颜色轴 - 我们可以通过h数组得到一个w数组,无论所有颜色匹配。

现在我们可以将这个二维布尔模板应用到我们原来的w中,由h乘以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] 
+0

谢谢,非常明确的答案 – leoScomme

1

由于所有值都是正的或零,一个简单而有效的方法是:

img[img.sum(axis=2)==0,0]=255 

img.sum(axis=2)==0在两个第一尺寸选择好像素,0的第三条红色运河。