登录
首页 >  文章 >  python教程

PIL fromarray 创建单通道图方法

时间:2026-04-21 15:54:59 469浏览 收藏

PIL 的 `Image.fromarray()` 无法直接处理形状为 `(H, W, 1)` 的三维单通道 NumPy 数组,看似是数据类型错误,实则是维度结构不被识别所致;正确做法是先通过 `squeeze()` 或索引(如 `arr[:, :, 0]`)将其降维为二维 `(H, W)`,PIL 即可自动识别为灰度图像('L' 模式)并成功创建;该技巧在 OpenCV 与 PIL 混合使用(如提取通道或转灰度)时尤为关键,既能避免报错,又能确保尺寸、模式和语义的准确统一。

如何正确使用 PIL 的 fromarray 创建单通道图像

PIL 的 Image.fromarray() 不支持形状为 (H, W, 1) 的三维单通道数组,仅接受二维灰度数组 (H, W) 或标准三通道 (H, W, 3);需通过降维或显式指定模式解决。

如何正确使用 PIL 的 `Image.fromarray()` 创建单通道图像?PIL 的 `Image.fromarray()` 不支持形状为 `(H, W, 1)` 的三维单通道数组,仅接受二维灰度数组 `(H, W)` 或标准三通道 `(H, W, 3)`;需通过降维或显式指定模式解决。

在使用 PIL 处理 OpenCV 加载的图像时,一个常见误区是:试图将形状为 (H, W, 1) 的 NumPy 数组(例如单通道红/绿/蓝分量)直接传入 Image.fromarray(),结果抛出 TypeError: Cannot handle this data type: (1, 1, 1), |u1。该错误并非数据类型问题(如 uint8 是完全支持的),而是 PIL 不识别 (H, W, 1) 这一维度结构——它将 (1080, 1920, 1) 误判为“1×1×1”的非法标量形状,而非合法的单通道图像。

✅ 正确做法是移除冗余的通道维度,使数组变为二维:

import cv2
import numpy as np
from PIL import Image

for fr in fr_lst:
    frame = cv2.imread(os.path.join(frame_root, fr))  # shape: (H, W, 3), BGR
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # to RGB

    # ✅ 正确:取单通道并 squeeze 掉第3维 → 得到 (H, W)
    r = frame_rgb[:, :, 0]  # 或用 cv2.split(frame_rgb)[0]
    assert r.ndim == 2 and r.shape == (1080, 1920)  # e.g.

    pil_img = Image.fromarray(r)  # ✅ 成功!mode='L' (grayscale)
    print(pil_img.size)  # → (1920, 1080),符合 PIL 坐标约定(width, height)

⚠️ 注意事项:

  • Image.fromarray() 对二维数组自动推断为 'L' 模式(8-bit grayscale),对三维 (H, W, 3) 推断为 'RGB';但 (H, W, 1) 无对应模式,故报错。
  • 若你必须保留 (H, W, 1) 形状(如适配某些深度学习 pipeline),可先转 PIL 再转回带 channel 维度的 NumPy:
    pil_img = Image.fromarray(r)  # r is (H, W)
    r_3d = np.expand_dims(np.array(pil_img), axis=2)  # → (H, W, 1), dtype=uint8
  • 更推荐语义清晰的灰度转换(而非简单取 R 通道):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # shape (H, W)
    pil_gray = Image.fromarray(gray)  # ✅ robust & perceptually accurate

? 总结:PIL 图像尺寸 pil_img.size 恒为 (width, height),与 NumPy 数组的 (height, width) 索引顺序相反;只要输入 fromarray() 的是合法二维数组,尺寸和模式均会自动正确解析——无需手动 expand_dims,更不应传递 (H, W, 1)。

今天关于《PIL fromarray 创建单通道图方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>