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

使用Pillow将Numpy数组转JPG/BMP时生成异常图像的问题

解决PEER-Hub ImageNet数组转图像颜色错乱问题

你遇到的颜色乱码、轮廓模糊问题,核心原因是数组的数值范围没做正确的反归一化,直接转uint8会把大部分有效像素值压缩成接近0的数值,导致颜色异常。另外也可能存在通道顺序不匹配的问题。

解决步骤:

  • 先确认你的numpy数组数值范围:
    打印单张图片的极值:

    print(data[i].min(), data[i].max())
    

    ImageNet常见的预处理后范围是[0,1]或者[-1,1],这两种都不能直接转uint8。

  • 根据范围做反归一化:

    • 如果是[0,1]范围:先乘以255再转uint8
      im_array = (data[i] * 255).astype(np.uint8)
      
    • 如果是[-1,1]范围:先还原到[0,1]再转
      im_array = ((data[i] + 1) * 127.5).astype(np.uint8)
      
  • 检查通道顺序:
    有些数据集的数组是BGR通道顺序,但Pillow默认需要RGB;还有部分数据是通道在前的CHW格式(比如(3, H, W)),而Pillow需要通道在后的HWC格式((H, W, 3))。如果反归一化后还是颜色不对,就调整通道:

    # 把CHW格式转成HWC格式
    im_array = np.transpose(im_array, (1, 2, 0))
    # 如果是BGR转RGB
    im_array = im_array[..., ::-1]
    

修正后的完整代码示例:

import numpy as np
from PIL import Image

for i in range(len(data)-1220):
    # 先处理数值范围,根据实际情况选择对应公式
    im_array = (data[i] * 255).astype(np.uint8)
    # 调整通道格式(如果需要)
    if im_array.shape[0] in [3, 1]:
        im_array = np.transpose(im_array, (1, 2, 0))
    # 若为BGR则转RGB,不需要可注释
    # im_array = im_array[..., ::-1]
    im = Image.fromarray(im_array)
    fname = '%05d_p%s.jpg' % (i, y[i])
    path = "/mnt/c/Windows/System32/repos/thesis_raw_data/task5/photos/"
    im.save(f"{path}{fname}")

建议先拿单张图测试,确认颜色正常后再批量处理。

内容的提问来源于stack exchange,提问作者John Lawrence Abarquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:25:10