PIL图像转numpy数组reshape时触发ValueError的解决方案
报错原因
报错核心是数组维度不匹配:
- 你加载的是RGB三通道彩色图像,resize后尺寸为100*100像素,每个像素对应R、G、B3个数值,总元素量为
100 * 100 * 3 = 30000,和报错提示的数组大小完全一致。 - 原代码中reshape仅指定了(100,100)两个维度,总容量仅为10000,无法容纳30000个元素,因此触发值错误。
- 额外隐患:PIL对象的
size属性返回格式为(宽度, 高度),但matplotlib识别的图像数组维度顺序是(高度, 宽度, 通道数),如果直接用size[0], size[1]作为reshape参数,即使凑对维度数,宽高顺序也会颠倒,最终显示的图像会被转置。 - 原代码的Windows路径未加原始字符串标记,字符串中的反斜杠可能被识别为转义字符,存在路径解析失败的风险。
修复方案
推荐直接将PIL图像对象传入numpy.array,不需要手动调用getdata()和计算reshape参数,该方法会自动识别图像通道数、匹配正确的维度顺序,兼容灰度图、RGB图、RGBA带透明通道图等所有格式,出错概率最低:
import numpy as np from PIL import Image import matplotlib.pyplot as plt # 路径前加r标记为原始字符串,避免反斜杠转义问题 img_path = r"F:\Pictures\Reza's WLP\wallpaper\sample.png" img = Image.open(img_path) img_2 = img.resize((100, 100)) img_array = np.array(img_2) # 自动生成维度正确的数组 plt.imshow(img_array) plt.show()
如果一定要用getdata()方法手动reshape,需要补全通道维度,同时调换宽高顺序:
# 针对当前RGB三通道图的reshape写法:高为size[1],宽为size[0],最后补通道数3 img_array = np.array(img_2.getdata()).reshape(img_2.size[1], img_2.size[0], 3)
这种写法需要提前判断图像通道数,如果是RGBA四通道图需要把最后一个参数改成4,灵活度低不推荐使用。
内容的提问来源于stack exchange,提问作者reza mohamadnia
相关产品推荐
相关产品推荐

