求助:DALL-E生成图片缩放后饱和度严重降低如何解决
问题:使用BSRGAN+VQGAN放大图片后出现严重褪色(饱和度偏低)
我是机器学习图像生成与处理领域的新手,尝试用参考文章中的「Generate 1K Image」模块放大DALL-E生成的图片,但处理后原图出现严重褪色(饱和度偏低)问题。推测原因是原代码输入为其他模型的张量,而我将图片直接转换为张量输入,转换过程可能存在问题。
我的代码:
#@title Generate 1K Image from google.colab import files from io import BytesIO from PIL import Image from matplotlib import pyplot as plt import numpy as np from torchvision import transforms as T import IPython import os.path import cv2 import torch # 补充缺失的torch导入 uploaded = files.upload() texture_amount = 0.05 #@param {type:"slider", min:0, max:0.15, step:0.001} texture_size = 3 #@param {type:"slider", min:1, max:9, step:2} enhance_details = True #@param {type:"boolean"} device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 补充device定义 img = Image.open(BytesIO(uploaded['knight.png'])) plt.imshow(img) plt.show() transform = T.Compose([ T.ToTensor() ]) tensorImage = transform(img) selected_img = tensorImage.cuda() selected_img = selected_img.type(torch.cuda.FloatTensor) selected_img = selected_img.add(1).div(2)[None, :] with torch.no_grad(): torch.cuda.empty_cache() resized = bsrgan_model(selected_img) torch.cuda.empty_cache() noise = torch.normal(0, texture_amount, size=[resized.shape[0], 1, resized.shape[2], resized.shape[3]]).to(device) noise = noise.repeat(1, 3, 1, 1) noise_blurred = T.GaussianBlur(kernel_size=texture_size, sigma=1)(noise) noise_blurred = noise*0.25 + noise_blurred*0.75 resized = (resized+noise_blurred) final_image = resized.to(device) if enhance_details: with torch.no_grad(): torch.cuda.empty_cache() z, *_ = vqgan_model.encode(final_image * 2 - 1) final_image = vqgan_model.decode(z)[0].add(1).div(2).clamp(min=0, max=1) torch.cuda.empty_cache() final_image = final_image.clamp(min=0, max=1) else: final_image = final_image[0].clamp(min=0, max=1) img = T.ToPILImage()(final_image) img.save("output_1k.png") IPython.display.Image("output_1k.png")
对比图:
- 原图:DALL-E生成的骑士原图
- 处理后图片:褪色后的输出图
解决思路
1. 核心问题定位
褪色的直接原因是张量归一化逻辑错误:
T.ToTensor()会将PIL图片的像素值从[0,255]转换为[0.0,1.0]的标准张量- 你后续执行的
selected_img.add(1).div(2),会把[0,1]区间的张量压缩到[0.5,1.0],相当于强制提升所有像素的亮度,直接稀释色彩饱和度,导致褪色
2. 关键代码修正
将错误的张量转换部分:
selected_img = tensorImage.cuda() selected_img = selected_img.type(torch.cuda.FloatTensor) selected_img = selected_img.add(1).div(2)[None, :]
替换为:
# 直接添加batch维度,保持[0,1]的原始像素区间 selected_img = tensorImage[None, :].to(device).type(torch.cuda.FloatTensor)
3. 额外修复点
- 补充
import torch和device变量定义,原代码缺失这两个关键依赖,会导致运行报错 - 确保VQGAN的输入归一化正确:
final_image * 2 - 1将[0,1]张量转换为模型要求的[-1,1]区间,这部分逻辑是正确的
4. 后续优化建议
如果修正后仍有轻微褪色,可以尝试:
- 降低
texture_amount参数(比如调到0.02),减少噪声对色彩的冲淡 - 检查BSRGAN模型的输入要求,部分超分辨率模型需要特定的像素区间输入
内容的提问来源于stack exchange,提问作者David R
相关产品推荐
相关产品推荐

