TensorFlow加载PNG图像出现绿偏问题的成因及解决方法问询
问题原因
- 取值范围不匹配:你将解码后的图像直接转换为
float32类型,但没有做归一化处理,此时张量数值范围仍然是[0,255]。matplotlib的imshow接口对输入有明确要求:整型数组取值范围需为[0,255],浮点型数组取值范围需为[0,1],超过1的浮点值会被直接截断为1,导致色彩渲染异常。 - 通道数不匹配:
tf.image.decode_image默认保留图像原始通道数,你加载的PNG图像大概率包含Alpha透明通道(4通道RGBA格式),你没有显式指定读取为3通道RGB,4通道的渲染逻辑和3通道不同,进一步加剧色偏。
解决方法
修改load函数做两处调整即可解决问题:
- 调用
decode_image时指定channels=3,强制所有图像读取为3通道RGB格式,忽略Alpha通道; - 转换为float32后除以255,将取值范围归一化到[0,1],匹配matplotlib的浮点输入要求。
修改后的完整代码如下:
import tensorflow as tf from matplotlib import pyplot as plt def load(im1, im2): ima1 = tf.io.read_file(im1) ima1 = tf.image.decode_image(ima1, channels=3) ima1 = tf.cast(ima1, tf.float32) / 255.0 ima2 = tf.io.read_file(im2) ima2 = tf.image.decode_image(ima2, channels=3) ima2 = tf.cast(ima2, tf.float32) / 255.0 return ima1, ima2 inp, re = load(r"RAWs/1313 (1).jpg", r"Clean/1313 (1).png") plt.figure() plt.imshow(inp) plt.figure() plt.imshow(re) plt.show()
如果上述修改后仍有色偏,说明你的PNG为索引颜色模式,TensorFlow原生解码对这类格式支持不完善,可以改用Pillow加载图像,兼容性更强:
首先安装依赖:pip install pillow
修改后的load函数如下:
import tensorflow as tf from PIL import Image import numpy as np from matplotlib import pyplot as plt def load(im1, im2): ima1 = np.array(Image.open(im1).convert('RGB')) ima1 = tf.cast(ima1, tf.float32) / 255.0 ima2 = np.array(Image.open(im2).convert('RGB')) ima2 = tf.cast(ima2, tf.float32) / 255.0 return ima1, ima2
内容的提问来源于stack exchange,提问作者Fghjkgcfxx56u
相关产品推荐
相关产品推荐

