如何将(1080,1920,3)图像转为(1080,1920,1)并适配PIL?
问题解决:单通道图像数组转PIL图像的异常处理
核心问题原因
PIL的Image.fromarray不支持形状为(H, W, 1)的单通道数组格式。在PIL的设计逻辑里,单通道灰度图像对应的numpy数组是2D结构(H, W),而3D数组(H, W, C)仅用于多通道图像(如RGB的C=3、RGBA的C=4)。你传入的(1080, 1920, 1)数组会被PIL误判,要么直接抛出类型错误,要么解析异常导致size返回总像素数而非宽高元组。
解决方案
方案1:直接用2D单通道数组创建PIL图像(推荐)
这是最贴合PIL设计的方式,完全满足你获取(1920, 1080)尺寸的需求:
import cv2 import os import numpy as np from PIL import Image for fr in fr_lst: frame = cv2.imread(os.path.join(frame_root, fr)) # 转换为RGB格式 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) r, g, b = cv2.split(frame) # 直接用2D的r数组创建PIL图像,无需扩展维度 frame_img = Image.fromarray(r) print(frame_img.size) # 输出 (1920, 1080),符合预期 # 若后续处理需要(1080, 1920, 1)的数组,再单独扩展维度 r_expanded = np.expand_dims(r, axis=2)
方案2:强制将3D单通道数组转为PIL可识别格式
如果必须基于(H, W, 1)的数组创建图像,可以先压缩多余维度再处理:
# 基于你原有代码修改 r = np.expand_dims(r, axis=2) # 压缩最后一个维度,回到2D数组格式 r_squeezed = np.squeeze(r, axis=2) frame_img = Image.fromarray(r_squeezed)
关于size异常的解释
当你用(1080, 1920, 1)数组创建PIL图像时,PIL无法识别这个非标准格式,会错误地将整个数组视为一维序列,所以size返回的是总像素数1080*1920=2073600,而非正常的宽高元组。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

