You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:12:55