使用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再转uint8im_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
相关产品推荐
相关产品推荐

