【问题标题】:how to change pixel value in a numpy array如何更改numpy数组中的像素值
【发布时间】:2017-11-18 12:46:44
【问题描述】:

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

但是这样我就没有一个像素。有没有类似的方法是不迭代索引?

【问题讨论】:

  • 你图片的.shape是什么?

标签: python python-2.7 numpy


【解决方案1】:

这是一个矢量化解决方案。您的图像基本上是 w x h x 3(colors) 数组。我们可以利用不易掌握但功能强大的广播规则。

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

现在我们只想找到所有三种颜色都匹配的像素。为此,我们使用“all”方法,如果数组的所有值都为真,则该方法为真。如果我们将其应用于某个轴——在本例中为颜色轴——我们得到一个 w×h 数组,它是真的,只要所有颜色都匹配。

现在我们可以将这个 2D 布尔蒙版应用回我们原来的 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]

【讨论】:

    【解决方案2】:

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

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

    img.sum(axis=2)==0在第一维中选择好的像素,0第三维中的红色通道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2022-01-08
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多