gpt4 book ai didi

python ,numpy : Setting the values for an entire 2D plane of a 3D array

转载 作者:太空宇宙 更新时间:2023-11-03 16:36:45 24 4
gpt4 key购买 nike

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

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

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

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

其中宽度和高度是图像的尺寸,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)

因此,我的数组的尺寸已“旋转”,没有明显的原因。

最佳答案

您实际上是在尝试将 3 维数组分配给 2 维切片。发生的情况是:

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

您需要对此做什么取决于您实际想要发生的情况。就目前情况而言,您的 imagPix 数组显然旨在成为 2 维(灰度)图像的 3 维堆栈。因此,您可以通过某种适当的方式将 3 维图像转换为 2 维图像。 (可能只需要拉出其中的一片就足够了,或者您可能想要对颜色平面进行某种加权平均,或者其他什么。)

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

或者也许创建这些图像的任何进程都应该创建显式灰度图像,并且 getPixelValues 根本不应该将它们转换为 RGB。

关于 python ,numpy : Setting the values for an entire 2D plane of a 3D array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com