【问题标题】:python, numpy: Setting the values for an entire 2D plane of a 3D arraypython,numpy:为 3D 数组的整个 2D 平面设置值
【发布时间】:2016-05-10 15:29:32
【问题描述】:

我想将多个图像的像素亮度值存储在一个 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 方法返回像素亮度值的二维数组。代码如下:

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)

所以我的数组的尺寸已经无缘无故地“旋转”了。

【问题讨论】:

  • 在您执行此操作之前,imagPix 中有什么内容?
  • 抱歉,这是一个 3D 零数组。我将使用适当的代码更新帖子。
  • 它的前两个尺寸是否与您的图像尺寸相同?并且:当您尝试这样做时,实际出了什么问题? (你收到错误消息吗?什么也没发生?数据损坏?愤怒的猴子从你的电脑屏幕上飞出来攻击你?)
  • 是的,前两个维度和图片一样。哦,是的,抱歉,我已更新代码以包含错误消息。
  • 哦,我想这是因为 imag.getdata() 返回每个像素的 RGB 值,因此是 3D 数组而不是 2D 数组。

标签: python arrays numpy


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回答并为您抢了风头而道歉!当你写你的答案时,我在想我可以平均三个 RGB 值,然后使用它们。我重写了我的代码以利用 np.mean() 来平均多维数据集的 z 维度中的值。现在我遇到了在计算平均值时我的数组维度被神秘改变的问题。我会更新我的帖子,以便您看到。
猜你喜欢
  • 2019-09-28
  • 2018-06-02
  • 1970-01-01
  • 2021-04-22
  • 2016-11-20
  • 2015-12-26
  • 1970-01-01
  • 2021-12-29
  • 2016-06-01
相关资源
最近更新 更多