不少人在玩Stable Diffusion的时候都遇到过同一个问题:生成的图看起来灰蒙蒙的,黑色不够黑,白色不够白,整个画面像盖了一层薄纱。即使提示词里堆满了vivid colors、high contrast这类关键词,效果依然不理想。其实这个问题大部分时候不是提示词的锅,而是出在Gamma值和VAE配置上。这篇文章就来把图片发灰的成因和解决方案一次性讲清楚。

一、图片为什么会发灰:Gamma与VAE的底层原理
先说Gamma。人眼对亮度的感知是非线性的,所以图片在存储时会做一次Gamma编码,把线性的亮度值压缩到更适合人眼感知的曲线空间。标准sRGB空间使用的解码Gamma值约为2.2。如果生成流程中编码和解码两端使用的Gamma值不一致,画面就会出现整体偏亮发灰或者偏暗发闷的情况。
再看VAE。Stable Diffusion的工作流程是先在潜空间生成图像,再由VAE(变分自编码器)把潜空间数据解码成我们看到的RGB图片。如果加载的VAE模型不匹配,或者用了质量较差的旧版VAE,解码出来的图像就会动态范围压缩,暗部提亮、亮部压暗,直方图向中间堆积,表现出来就是灰蒙蒙一片。早期一些模型的默认VAE就存在这个问题,这也是为什么后来社区专门发布了fix版本的VAE权重。
你可以用一个简单的方法自检:把生成的图导入任意看图软件看直方图。如果直方图两端有明显的空白,最左和最右都没有像素分布,基本可以断定是解码环节出了问题,而不是采样参数的事。
二、Gamma校正的具体操作方法
在AUTOMATIC1111的WebUI里,Gamma相关的调整主要靠后处理和外部工具配合。WebUI自带的选项卡里有一个Extra功能,可以对已有图片做Gamma修正。操作路径是打开Extras标签页,上传图片后在Postprocess options里勾选GFPGAN或CodeFormer之外的基础调整项,部分版本直接提供Gamma滑杆。不过更推荐的做法是先用正确的VAE从源头解决,后处理只做微调。
如果你习惯用Python脚本处理,用Pillow几行代码就能完成Gamma校正:
from PIL import Image, ImageEnhance
img = Image.open("output.png")
# 构建Gamma校正查找表,gamma小于1提亮暗部,大于1压暗
gamma = 0.85
lut = [int((i / 255) ** gamma * 255) for i in range(256)]
r, g, b = img.split()
r = r.point(lut)
g = g.point(lut)
b = b.point(lut)
result = Image.merge("RGB", (r, g, b))
# 顺带提升一点饱和度,抵消发灰感
result = ImageEnhance.Color(result).enhance(1.15)
result.save("gamma_fixed.png")
这里的gamma取0.85到0.9之间通常比较合适,具体数值要看原图发灰的程度。配合15%左右的饱和度增强,绝大多数发灰图都能救回来。需要注意的是,如果图片本身高光已经溢出,再做提亮处理会丢细节,调整前先确认直方图状态。
三、色彩曲线调整:让对比度重新立起来
色彩曲线(Curves)是比Gamma更精细的工具。Gamma是全局单一参数,而曲线允许你对暗部、中间调、亮部分别施加不同的调整力度。典型的去灰曲线是一个轻微的S形:把黑场输入点从0提到10到20左右,把白场从255压到235到245,这样直方图会被拉开,画面立刻通透。
用Python实现曲线调整可以借助numpy做插值:
import numpy as np
from PIL import Image
img = np.asarray(Image.open("output.png")).astype(np.float32) / 255.0
# 定义控制点:输入值 -> 输出值,构成S形曲线
control_points = {
0.0: 0.04, # 抬黑场,去灰雾
0.25: 0.24,
0.5: 0.52, # 中间调略提
0.75: 0.79,
1.0: 0.97 # 压白场,防过曝
}
xs = sorted(control_points.keys())
ys = [control_points[x] for x in xs]
lut = np.interp(np.linspace(0, 1, 256), xs, ys)
img = np.clip(img, 0, 1)
result = (lut[(img * 255).astype(np.uint8)] * 255).astype(np.uint8)
Image.fromarray(result).save("curves_fixed.png")
习惯用Photoshop的朋友操作更直观:打开图像后按Ctrl加M调出曲线工具,在曲线左下角锚点向上轻推一点,右上角锚点向下轻压一点,形成一个平缓的S形。Lightroom里的做法类似,调整白色色阶和黑色色阶两个滑块,把白色拉到加15到加25,黑色拉到减10到减20,效果立竿见影。
四、提示词与参数层面的预防措施
与其事后修图,不如从生成源头控制。提示词方面,可以在正向提示词末尾加入vivid colors, rich color grading, deep shadows, high dynamic range这类描述,反向提示词中加入washed out, faded colors, dull colors, low contrast, gray haze。注意这些词的权重不要加太高,保持在1.1以下,否则容易色彩溢出。
参数层面有三件事最关键。第一,确认VAE设置正确,在WebUI的Settings里把VAE指定为与底模匹配的版本,常用的vae-ft-mse-840000-ema-pruned对大多数SD 1.5系模型都有明显改善;如果使用SDXL模型,通常选择None让它用模型自带的VAE即可。第二,采样器建议选DPM++ 2M Karras或Euler a这类出图色彩扎实的组合,部分早期采样器在低步数下确实偏灰。第三,CFG Scale别设太低,低于5时画面容易发灰发虚,一般保持在7左右比较稳。
最后还有一个容易被忽略的点:高分辨率修复和放大算法的选择。有些放大模型自带轻微的模糊倾向,放大后再叠加VAE问题,发灰会被放大。建议放大时选择4x-UltraSharp这类锐利的算法,并在hires fix里适当提高denoising strength到0.4以上,让放大阶段保留足够的对比信息。
总结一下,图片发灰的核心矛盾在于解码环节的动态范围压缩,优先检查VAE,其次用Gamma和曲线做后处理补救,最后通过提示词和采样参数预防。三管齐下,基本可以告别灰蒙蒙的出图体验。
Stable Diffusion发灰Gamma校正色彩曲线调整修改时间:2026-09-15 07:48:32