python,numpy:设置3D数组的整个2D平面的值

时间:2016-05-10 15:29:33

标签: python arrays numpy

我想将几个图像的像素亮度值存储在3D数组中,但我不确定如何一次性设置3D“立方体”的整个“平面”的值。这是我的尝试:

imag = Image.open(imagArray[i])
imagPix[:,:,i] = self.getPixelValues(imag)

imagArray是存储在本地计算机上的图像的文件路径数组,而imagPix是像素值的3D数组。 imagPix最初定义为:

imagPix = np.zeros((width, height, lenImagArray))

其中width和height是图像的尺寸,lenImagArray是要保存在数组中的图像数(在本例中为3)。我试过使用'0:'和':'运算符的imagPix [:,:,i]行无效。

我收到的具体错误是:

ValueError: could not broadcast input array from shape (640, 480, 3) into shape (640, 480)

getPixelValues方法返回像素亮度值的2D数组。代码如下:

def getPixelValues(self, pixImg): ## pixImg is the location of the image, not the image itself
    ## open image and convert to rgb
    imag = Image.open(str(pixImg))
    imag = imag.convert('RGB')

    ## get size of image
    width, height = imag.size

    pixData = list(imag.getdata())
    pixData = [pixData[i * width:(i+1) * width] for i in xrange(height)]
    ## close image and return pixel array
    imag.close()
    return pixData

我是否必须使用for循环而不是一次性设置所有值? 提前致谢。 :)

编辑:

现在我的getdata()返回一个元组的问题已得到解决我在使用numpy.mean()时遇到了一个新问题:

pixData = np.array(imag.getdata())
pixData = [pixData[i * width:(i+1) * width] for i in xrange(height)]
pixData = np.mean(pixData, 2)

这给了我错误:

ValueError:无法将形状(480,640)的输入数组广播为形状(640,480)

所以我的阵列的尺寸已被'旋转',没有明显的原因。

1 个答案:

答案 0 :(得分:1)

您实际上是在尝试将三维数组分配给二维切片。会发生什么:

  • imag.getdata()返回一系列像素值。那些像素值实际上是(R,G,B)元组。
  • 所以list(imag.getdata())是一个元组列表。
  • 因此pixData内的操作后getPixelValues是元组列表的列表。
  • 因此,当您尝试将其分配给numpy数组切片时,它将被视为三维数组。

您需要做的事情取决于您实际想要发生的事情。就目前而言,您的imagPix数组显然是一个三维的二维(灰度)图像堆栈。因此,您可以以适当的方式将三维图像转换为二维。 (仅仅拉出一片它就足够了,或者你可能想要对颜色平面或其他东西进行某种加权平均。)

或者,也许您实际上希望imagPix成为三维图像的四维堆栈。

或者也许创建这些图像的任何过程都应该创建明确的灰度图像,而getPixelValues根本不应该将它们转换为RGB。