我想将几个图像的像素亮度值存储在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)
所以我的阵列的尺寸已被'旋转',没有明显的原因。
答案 0 :(得分:1)
您实际上是在尝试将三维数组分配给二维切片。会发生什么:
imag.getdata()
返回一系列像素值。那些像素值实际上是(R,G,B)元组。list(imag.getdata())
是一个元组列表。pixData
内的操作后getPixelValues
是元组列表的列表。您需要做的事情取决于您实际想要发生的事情。就目前而言,您的imagPix
数组显然是一个三维的二维(灰度)图像堆栈。因此,您可以以适当的方式将三维图像转换为二维。 (仅仅拉出一片它就足够了,或者你可能想要对颜色平面或其他东西进行某种加权平均。)
或者,也许您实际上希望imagPix
成为三维图像的四维堆栈。
或者也许创建这些图像的任何过程都应该创建明确的灰度图像,而getPixelValues
根本不应该将它们转换为RGB。