读取(520,696)图像时形状异常,如何获取目标形状并转换?
解决方法:获取(520, 696)形状的图像数组
Hey there! Let's break down why you're getting that extra dimension and how to fix it:
为什么你的数组形状是(1, 520, 696, 4)?
- 第一个维度
1:因为你把np.array(Image.open(...))又包裹了一层[],相当于手动加了一个batch维度(用来表示一批图像的维度)。 - 最后一个维度
4:说明你读取的图像是RGBA格式(包含红、绿、蓝、透明度四个通道),而不是单通道的灰度图。
快速修复方案
方案1:读取时直接转为灰度图
这是最直接的方式,用PIL的convert('L')把图像转为单通道灰度图:
from PIL import Image import numpy as np # 读取图像并转为灰度模式 img = Image.open(folder_path + folders + '/images/' + image).convert('L') array = np.array(img, np.int32) print(array.shape) # 输出:(520, 696)
之后你再用toimage(array)就不会报错了,因为二维数组刚好符合灰度图像的模式要求。
方案2:处理已读取的RGBA数组
如果已经得到了(1, 520, 696, 4)的数组,也可以一步步修正:
# 先去掉多余的batch维度 array = array.squeeze() # 形状变为(520, 696, 4) # 方法A:用PIL转灰度 gray_img = Image.fromarray(array.astype(np.uint8)).convert('L') gray_array = np.array(gray_img, np.int32) # 方法B:手动计算灰度(用标准的灰度转换公式) gray_array = np.round(0.299 * array[..., 0] + 0.587 * array[..., 1] + 0.114 * array[..., 2]).astype(np.int32) print(gray_array.shape) # 输出:(520, 696)
为什么之前toimage报错?
toimage对输入数组的形状有严格要求:
- 二维数组:对应单通道灰度图
- 三维数组(最后一维为3):对应RGB彩色图
- 三维数组(最后一维为4):对应RGBA图
你的数组多了一个额外的batch维度(第一个1),所以它无法识别合适的图像模式,就抛出了那个错误。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

