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

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函数做两处调整即可解决问题:

  1. 调用decode_image时指定channels=3,强制所有图像读取为3通道RGB格式,忽略Alpha通道;
  2. 转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:30:03