CelebA数据集图像转int32与float32后plt.imshow显示差异原因问询
显示差异的技术原因
核心是matplotlib.pyplot.imshow对不同类型的3通道RGB输入数组的数值映射规则完全不同:
- 当输入为int32等整数类型数组时:
imshow默认遵循8位彩色图像的标准规则,判定数值合法范围为[0, 255],0对应通道最低亮度(黑色),255对应通道最高亮度(白色),直接做线性映射显示。你将归一化到[0,1]的像素值乘255后转int32,数值刚好落在0-255区间内,所以显示为正常的原图效果。 - 当输入为float32等浮点类型数组时:
imshow默认要求3通道RGB浮点输入的数值范围必须在[0, 1]之间,所有超出该范围的数值会被直接截断为边界值:小于0的截断为0,大于1的截断为1。你乘255后得到的float32数组数值范围为[0, 255],几乎所有像素值都远大于1,都会被截断为1(对应通道最高亮度),所以最终图像整体偏亮、白色占比极高,和正常效果差异极大。
修复方案
如果需要用float32类型正常显示图像,可选两种方案:
- 不做乘255操作,直接传入归一化到
[0,1]的float32数组即可:plt.imshow(x.numpy()[0]) - 保留乘255操作的同时,手动指定数值范围参数:
plt.imshow((x.numpy()*255).astype("float32")[0], vmin=0, vmax=255)
内容的提问来源于stack exchange,提问作者Wakame
相关产品推荐
相关产品推荐

