天空、暗部和柔和灯光本应连续变化,输出到有限位深后却可能出现一圈圈色带。这不是压缩格式独有的问题,而是量化误差变得有结构:一大片相近输入被迫使用同一个码值,相邻码值的边界便清楚可见。
抖动的做法看似反直觉:在量化前加入经过设计的微小扰动。逐像素结果更“乱”,但误差不再集中为长条边界;在一定观看距离下,空间平均重新接近原本的连续明暗。
位深决定可表示的码值数量
对归一化输入 , bit 均匀量化可写成:
量化误差为 ,其绝对值在理想舍入下不超过半个量化步长。
位深降低,连续渐变会变成台阶
量化把许多输入值映射到同一个输出码字;相邻区域足够大时,人眼会看到 banding。
实拍模式对 RGB 三通道分别量化,天空的大面积缓变最容易暴露条带。浏览器仍会经过自身颜色管理,因此它不是屏幕测量工具。
8 bit 每通道有 256 个码值,10 bit 有 1024 个,12 bit 有 4096 个。但“位深更高”不自动保证看不到条带:若前序 Gamma、Tone Mapping 或颜色变换已经在低精度中反复舍入,后面写入 10 bit 容器也不能恢复丢失层级。
为什么加一点扰动有帮助
不抖动时,量化误差与输入强相关:整个区间被统一推向同一个码值。若在量化前加入约一个量化步长范围内的扰动,某些像素向上取整,另一些向下取整。局部平均可以表达两个码值之间的亮度。
抖动把结构化误差换成细颗粒
输出仍只有 4 个灰度码值,但不同空间分布会让局部平均亮度接近原渐变。
抖动不会增加输出码值,也不会降低逐像素数值误差;它改善的是误差的空间分布与感知结果。
随机抖动能打散条带,但会呈现噪点;有序抖动把阈值安排成周期图案,计算便宜且稳定,却可能暴露规则纹理;误差扩散根据前面像素的量化结果调整后续像素,通常视觉上更细腻,但顺序依赖强、成本更高。
抖动增加的是空间表达能力,不是文件中每个像素的位深。放大到单像素观察,它仍只有原来的有限码值。
Ordered Dithering 与 Bayer 阈值矩阵
有序抖动使用周期阈值矩阵。一个经典 Bayer 矩阵是:
每个位置把矩阵值归一化为阈值。目标灰度升高时,阈值较低的位置先点亮,于是一个 单元能用点亮面积表达中间灰度。
Bayer 阈值矩阵:规则地决定谁先点亮
4×4 阈值按递归次序铺开,让一个局部块用黑白像素的面积比例表达中间灰度。
Bayer 抖动矩阵是阈值排列;传感器 Bayer CFA 是 R/G/B 彩色滤光片阵列。两者同名源于 Bryce Bayer,但用途和数据含义完全不同。
这里必须区分两个同名概念:Bayer 抖动矩阵不是传感器 Bayer CFA。前者是量化阈值的空间排序;后者是图像传感器表面的 R/G/B 彩色滤光片阵列,需要 Debayer 重建颜色。它们解决的问题、输入数据和处理阶段都不同。
Floyd–Steinberg 误差扩散
误差扩散先量化当前像素,再把残差传给尚未处理的邻居。Floyd–Steinberg 的经典权重为:
星号是当前像素。权重和为 1,使当前残差在理想无裁剪条件下继续传播。
误差扩散把当前误差交给未来像素
Floyd–Steinberg 按 7/16、3/16、5/16、1/16 分配量化残差,以局部密度表达灰度。
误差扩散具有顺序依赖,难以完全并行;蛇形扫描能减弱固定方向纹理,但不保证消除所有虫纹与边界偏差。
单向扫描容易形成方向性纹理,蛇形扫描让奇偶行反向,通常能减弱方向偏置。边界处缺少邻居时,需要重新分配或接受误差损失;中间缓冲必须保留浮点或足够精度的定点残差,不能每传一步就再次粗量化。
随机不等于每次渲染都调用 random
实时管线通常使用可复现的蓝噪声纹理、哈希或固定随机表。确定性有三个好处:输出可测试,视频帧间不会无规则闪烁,SSR 与客户端渲染也不会因随机状态不一致。
对白噪声而言,能量在频域较均匀,低频颗粒仍可能可见;蓝噪声把更多能量推向高频,在人眼不敏感或显示系统会平均掉的尺度上更自然。它不等于 RGB 蓝色噪点,“蓝”描述的是功率谱分布。
在什么域里抖动
若目标是最终显示码值,应在最后一次降低位深之前加入抖动,而且幅度以目标量化步长为基准。过早添加,后续降噪、缩放或压缩可能把它抹掉或重新组织;过晚添加,则无法修复之前已形成的 banding。
在线性光和 Gamma 编码域使用相同数值幅度,视觉强度并不相同。显示输出通常需要考虑传递函数,让不同亮度区域的抖动在感知上更均匀。彩色图像还需权衡通道独立噪声导致的彩点,可在亮度与色度域分别设计。
与压缩、缩放和视频的关系
JPEG、视频编码器和色度抽样可能把细颗粒平滑掉,甚至把规则图案变成块状结构。抖动应在完整输出链路上评估,而不是只看未压缩中间图。
缩小时,抖动纹理会被重采样低通;放大时,最近邻会把噪点变成方块。若最终尺寸确定,最好在最终分辨率附近设计输出抖动。
视频还要处理时间维度。每帧固定图案稳定但可能显得“贴在屏幕上”,完全独立随机则会闪烁;时空蓝噪声试图在空间细腻度和时间稳定性之间取得平衡。
验证清单
- 全黑、全白和端点附近是否越界;
- 码值数量是否严格符合目标位深;
- 灰阶 ramp 是否仍有大面积 banding;
- 局部窗口的平均值是否接近原始亮度;
- 平坦区噪声幅度与频谱是否符合设计;
- Ordered 图案的周期是否在目标观看距离可见;
- 误差扩散的边界、扫描方向和缓冲精度是否正确;
- RGB 中性灰是否被抖成彩色颗粒;
- 缩放、色度抽样和压缩后抖动是否仍有效;
- 静态截图与视频播放是否分别出现固定纹理或闪烁。
抖动没有消灭量化误差,而是重新安排它。少量、可控、高频的空间变化,常比低频且规则的色带更容易被视觉系统接受。位深决定硬件能写下多少码值,抖动决定这些码值如何在空间中合作表达中间层次。