1602 字
8 分钟
为什么加入噪声反而更平滑?理解量化与抖动

天空、暗部和柔和灯光本应连续变化,输出到有限位深后却可能出现一圈圈色带。这不是压缩格式独有的问题,而是量化误差变得有结构:一大片相近输入被迫使用同一个码值,相邻码值的边界便清楚可见。

抖动的做法看似反直觉:在量化前加入经过设计的微小扰动。逐像素结果更“乱”,但误差不再集中为长条边界;在一定观看距离下,空间平均重新接近原本的连续明暗。

位深决定可表示的码值数量#

对归一化输入 x[0,1]x\in[0,1]bb bit 均匀量化可写成:

Qb(x)=round(x(2b1))2b1Q_b(x)=\frac{\operatorname{round}(x(2^b-1))}{2^b-1}

量化误差为 e=Qb(x)xe=Q_b(x)-x,其绝对值在理想舍入下不超过半个量化步长。

位深降低,连续渐变会变成台阶

量化把许多输入值映射到同一个输出码字;相邻区域足够大时,人眼会看到 banding。

位深4 bit
可用码值16
量化步长0.0667
观察素材

实拍模式对 RGB 三通道分别量化,天空的大面积缓变最容易暴露条带。浏览器仍会经过自身颜色管理,因此它不是屏幕测量工具。

8 bit 每通道有 256 个码值,10 bit 有 1024 个,12 bit 有 4096 个。但“位深更高”不自动保证看不到条带:若前序 Gamma、Tone Mapping 或颜色变换已经在低精度中反复舍入,后面写入 10 bit 容器也不能恢复丢失层级。

为什么加一点扰动有帮助#

不抖动时,量化误差与输入强相关:整个区间被统一推向同一个码值。若在量化前加入约一个量化步长范围内的扰动,某些像素向上取整,另一些向下取整。局部平均可以表达两个码值之间的亮度。

抖动把结构化误差换成细颗粒

输出仍只有 4 个灰度码值,但不同空间分布会让局部平均亮度接近原渐变。

物理码值4
平均绝对误差0.107
误差外观周期纹理
量化方法

抖动不会增加输出码值,也不会降低逐像素数值误差;它改善的是误差的空间分布与感知结果。

随机抖动能打散条带,但会呈现噪点;有序抖动把阈值安排成周期图案,计算便宜且稳定,却可能暴露规则纹理;误差扩散根据前面像素的量化结果调整后续像素,通常视觉上更细腻,但顺序依赖强、成本更高。

抖动增加的是空间表达能力,不是文件中每个像素的位深。放大到单像素观察,它仍只有原来的有限码值。

Ordered Dithering 与 Bayer 阈值矩阵#

有序抖动使用周期阈值矩阵。一个经典 4×44\times4 Bayer 矩阵是:

[0821012414631119157135]\begin{bmatrix} 0&8&2&10\\ 12&4&14&6\\ 3&11&1&9\\ 15&7&13&5 \end{bmatrix}

每个位置把矩阵值归一化为阈值。目标灰度升高时,阈值较低的位置先点亮,于是一个 4×44\times4 单元能用点亮面积表达中间灰度。

Bayer 阈值矩阵:规则地决定谁先点亮

4×4 阈值按递归次序铺开,让一个局部块用黑白像素的面积比例表达中间灰度。

目标灰度0.46
白色像素28/64
周期4×4

Bayer 抖动矩阵是阈值排列;传感器 Bayer CFA 是 R/G/B 彩色滤光片阵列。两者同名源于 Bryce Bayer,但用途和数据含义完全不同。

这里必须区分两个同名概念:Bayer 抖动矩阵不是传感器 Bayer CFA。前者是量化阈值的空间排序;后者是图像传感器表面的 R/G/B 彩色滤光片阵列,需要 Debayer 重建颜色。它们解决的问题、输入数据和处理阶段都不同。

Floyd–Steinberg 误差扩散#

误差扩散先量化当前像素,再把残差传给尚未处理的邻居。Floyd–Steinberg 的经典权重为:

7/163/165/161/16\begin{array}{ccc} &*&7/16\\ 3/16&5/16&1/16 \end{array}

星号是当前像素。权重和为 1,使当前残差在理想无裁剪条件下继续传播。

误差扩散把当前误差交给未来像素

Floyd–Steinberg 按 7/16、3/16、5/16、1/16 分配量化残差,以局部密度表达灰度。

输出位深1 bit
平均绝对误差0.322
扫描方向
扫描方式

误差扩散具有顺序依赖,难以完全并行;蛇形扫描能减弱固定方向纹理,但不保证消除所有虫纹与边界偏差。

单向扫描容易形成方向性纹理,蛇形扫描让奇偶行反向,通常能减弱方向偏置。边界处缺少邻居时,需要重新分配或接受误差损失;中间缓冲必须保留浮点或足够精度的定点残差,不能每传一步就再次粗量化。

随机不等于每次渲染都调用 random#

实时管线通常使用可复现的蓝噪声纹理、哈希或固定随机表。确定性有三个好处:输出可测试,视频帧间不会无规则闪烁,SSR 与客户端渲染也不会因随机状态不一致。

对白噪声而言,能量在频域较均匀,低频颗粒仍可能可见;蓝噪声把更多能量推向高频,在人眼不敏感或显示系统会平均掉的尺度上更自然。它不等于 RGB 蓝色噪点,“蓝”描述的是功率谱分布。

在什么域里抖动#

若目标是最终显示码值,应在最后一次降低位深之前加入抖动,而且幅度以目标量化步长为基准。过早添加,后续降噪、缩放或压缩可能把它抹掉或重新组织;过晚添加,则无法修复之前已形成的 banding。

在线性光和 Gamma 编码域使用相同数值幅度,视觉强度并不相同。显示输出通常需要考虑传递函数,让不同亮度区域的抖动在感知上更均匀。彩色图像还需权衡通道独立噪声导致的彩点,可在亮度与色度域分别设计。

与压缩、缩放和视频的关系#

JPEG、视频编码器和色度抽样可能把细颗粒平滑掉,甚至把规则图案变成块状结构。抖动应在完整输出链路上评估,而不是只看未压缩中间图。

缩小时,抖动纹理会被重采样低通;放大时,最近邻会把噪点变成方块。若最终尺寸确定,最好在最终分辨率附近设计输出抖动。

视频还要处理时间维度。每帧固定图案稳定但可能显得“贴在屏幕上”,完全独立随机则会闪烁;时空蓝噪声试图在空间细腻度和时间稳定性之间取得平衡。

验证清单#

  • 全黑、全白和端点附近是否越界;
  • 码值数量是否严格符合目标位深;
  • 灰阶 ramp 是否仍有大面积 banding;
  • 局部窗口的平均值是否接近原始亮度;
  • 平坦区噪声幅度与频谱是否符合设计;
  • Ordered 图案的周期是否在目标观看距离可见;
  • 误差扩散的边界、扫描方向和缓冲精度是否正确;
  • RGB 中性灰是否被抖成彩色颗粒;
  • 缩放、色度抽样和压缩后抖动是否仍有效;
  • 静态截图与视频播放是否分别出现固定纹理或闪烁。

抖动没有消灭量化误差,而是重新安排它。少量、可控、高频的空间变化,常比低频且规则的色带更容易被视觉系统接受。位深决定硬件能写下多少码值,抖动决定这些码值如何在空间中合作表达中间层次。

为什么加入噪声反而更平滑?理解量化与抖动
https://cloudsir.top/posts/how-dithering-reduces-banding/
作者
CloudSir
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0
紫边从哪里来?从通道位移理解 CAC 色差校正
缩放为什么会模糊或出现锯齿?理解图像重采样