数值错误:维度过多:3 > 2。

4

我尝试使用scipy调整图像大小,一切似乎都很顺利,直到我尝试保存图像时。当我尝试保存图像时,会出现您在标题中看到的错误。完整的回溯信息如下所示。

import numpy as np
import scipy.misc
from PIL import Image

image_path = "img0.jpg"


def load_image(img_path):
    img = Image.open(img_path)
    img.load()
    data = np.asarray(img, dtype="int32")
    return data


def save_image(npdata, outfilename):
    img = Image.fromarray(np.asarray(np.clip(npdata, 0, 255), dtype="uint8"), "L")
    img.save(outfilename)

array_image = load_image(image_path)

array_resized_image = scipy.misc.imresize(array_image, (320, 240), interp='nearest', mode=None)

save_image(array_resized_image, "i1.jpg")

错误的完整回溯信息:

Traceback (most recent call last):
  File "D:/Python/Playground/resize image with scipy.py", line 26, in <module>
    save_image(array_resized_image, "i1.jpg")
  File "D:/Python/Playground/resize image with scipy.py", line 16, in save_image
    img = Image.fromarray(np.asarray(np.clip(npdata, 0, 255), dtype="uint8"), "L")
  File "C:\Anaconda2\lib\site-packages\PIL\Image.py", line 2154, in fromarray
    raise ValueError("Too many dimensions: %d > %d." % (ndim, ndmax))
ValueError: Too many dimensions: 3 > 2.

1
array_resized_image.shape的值是多少(执行print(array_resized_image.shape))? - Günther Jena
1
无法重现错误,请问你正在运行哪些版本? - miradulo
1
当您使用int32打开图像,然后在不进行转换的情况下将其存储为uint8时,您期望会发生什么? - Günther Jena
@ Günther Jena 数组的值为:(320L,240L,3L) - Gunnm
@ Donkey Kong 你是指scipy版本吗?我不知道它是否内置在Anaconda 2中。我运行print scipy.__version__,它返回0.16.0。 - Gunnm
@ Günther Jena,我只是按照教程操作的,说实话我不知道dtype是什么,那里没有解释。 - Gunnm
2个回答

3

在执行fromarray(...'L')之前,您需要将其转换为二维数组吗?

你可以使用scipy函数来执行此操作,或者更快的方法是通过因子乘以RGB值。就像这样:

npdata = (npdata[:,:,:3] * [0.2989, 0.5870, 0.1140]).sum(axis=2)

这将把一个彩色图像转换成灰度图像。根据我阅读的原始示例,这不是作者想要的结果? - Günther Jena
1
显然不是这样的... 然而,错误的原因是尝试在a.shape (H,W,3)上使用PIL.Image.fromarray(a,'L'),而不是s.shape (H,W),所以我想如果有人谷歌搜索“ValueError: Too many dimensions: 3 > 2”,他们可能会很高兴找到我的解释!! - paddyg

1
array_resized_image的形状为(320, 240, 3) - 三维数组,因为红、绿和蓝色分量是以这种方式存储的。您可以使用scipy.misc.imreadscipy.misc.imsave更轻松地处理文件加载和存储,因此您的示例可简化为:
import scipy.misc

image_path = "img0.jpg"

array_image = scipy.misc.imread(image_path)
array_resized_image = scipy.misc.imresize(array_image, (320, 240), interp='nearest', mode=None)
scipy.misc.imsave("i1.jpg", array_resized_image)

注意:scipy.misc图像处理函数已被弃用并移除。 - Nephanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接