pyplot.imshow与PIL.Image.show显示差异及预测图显示异常问题
问题原因与解决方案
核心问题是PIL调用前未对模型输出的预测张量做值域归一化,导致数值截断显示异常:
- 你使用的生成模型输出的
gen_image张量值域为[-1, 1],你在matplotlib的代码中提前执行了(gen_image + 1) / 2.0操作,将值域拉伸到了[0, 1],符合pyplot.imshow对浮点型图像输入的要求,因此显示正常。 - PIL相关代码中直接使用原始值域的
gen_image_convert乘255,负数部分在转换为np.uint8时会被强制截断为0,整体色阶完全偏移,因此显示异常。
修正后的PIL代码
import numpy as np from PIL import Image # 先执行和matplotlib一致的归一化操作,把值域拉到[0,1] gen_image = (gen_image + 1) / 2.0 gen_image_convert = gen_image[0] # 再乘255转换为无符号8位整数 image = Image.fromarray((gen_image_convert * 255).astype(np.uint8)).convert('RGB') image.show()
如果修改后仍存在显示问题,可以额外检查张量的通道顺序:PyTorch等框架输出的张量默认是(通道数, 高度, 宽度)的CHW顺序,而PIL要求输入是(高度, 宽度, 通道数)的HWC顺序,如果是通道顺序问题,可在转换前添加维度交换操作:
# 适配CHW转HWC的场景 gen_image_convert = np.transpose(gen_image_convert, (1, 2, 0))
内容的提问来源于stack exchange,提问作者Zirveda
相关产品推荐
相关产品推荐

