numpy.resize 尽管图像矩阵乘积等于图像总大小仍抛出 valueError

numpy.resize throws valueError despite image matrix product equaling the total image size

我正在尝试将灰度图像调整为 numpy 数组,如下所示:

return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)

并出现此错误:

ValueError: cannot reshape array of size 1909760 into shape (1024,1865,3)

我读到图像列和行 (1024 x 1865) 的乘积应该等于被重塑的数组的大小 - (1909760),它确实如此。我还在具有三个通道的图像上尝试了相同的代码并且它有效。

如果您为图像使用 PIL 模块,您可以尝试在获取数据之前将其转换为 RGB。这样的事情应该有效:

image = image.convert("RGB")
return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)

这是可行的,因为当您从灰度转换为 RGB 时,PIL 会自动将每个像素设置为具有三个值,即 R、G 和 B。

不要 使用.getdata()。那是没有意义的,也是浪费精力。将会发生的是 python 整数列表被构造为中间值。直接转换为 numpy 数组 效率更高。

就用这个:

# image = Image.open(...)
image_array = np.array(image)

其次您需要处理从灰​​度到 RGB 的转换,这似乎是您想要的。您的 PIL 图像似乎是灰度图像,但您想要一个具有三个通道(第三维大小为 3)的 numpy 数组。可以使用PIL转换,也可以使用OpenCV。

PIL:image = image.convert("RGB") 在转换为 numpy 之前(感谢 Timmy Diehl,我不经常使用 PIL)

OpenCV:image_array = cv.cvtColor(image_array, cv.COLOR_GRAY2BGR) 转换为 numpy

还要注意颜色通道的顺序。 PIL 更喜欢 RGB。 OpenCV 更喜欢 BGR。您需要什么取决于您将如何处理 numpy 数组。