Dither 抖动技术深度详解:高位宽转 8bit 消除色带
一、高位宽转低位宽出现色带(Banding)的原因
1. 量化误差本质
位宽压缩 = 量化,把连续的亮度 / 色彩区间映射到离散有限阶梯。 以你 ISP 场景举例:10bit Y 通道(0~1023,共 1024 级灰阶)压缩到 8bit(0~255,仅 256 级)
- 10bit 每 4 个连续数值会被映射到同一个 8bit 值:
0/1/2/3→0、4/5/6/7→1...... - 中间被合并的像素会丢失细微亮度差,原本平滑渐变的天空、墙面、肤色会出现一圈一圈清晰的分层条纹,就是色带 Banding。
2. 量化误差数学模型
设高位宽原始值为 X,量化低位宽输出为 (Q(X)),量化误差:

无抖动时,同一量化区间内所有像素误差完全相同,整片区域统一偏亮 / 偏暗,人眼对这种固定系统性误差极其敏感,肉眼直接看见分层条纹。
举 10bit→8bit 线性映射例子: 原始 Y:4,5,6,7 全部量化输出1 真实浮点目标值:1.0、1.25、1.5、1.75。量化误差:0、-0.25、-0.5、-0.75 整片渐变区域固定存在负偏差,均匀分层,色带明显。
3. 人眼视觉特性放大色带问题
人眼对缓慢均匀亮度变化敏感度极高,纯色渐变背景(天空、雾、墙面、肤色)是色带重灾区; 而纹理丰富区域(树叶、纹理、噪点画面)本身存在天然细节,会掩盖量化分层,看不出色带。
二、Dither 抖动核心原理:随机打散量化误差
核心思路
在高位宽像素量化之前,叠加一个低幅度、有规律 / 随机的微小噪声信号,打破同一区间像素统一的量化误差,把固定分层误差转化为人眼难以分辨的细密噪声。 公式:

- D:抖动噪声(微小幅值)
- step:量化步长(10bit→8bit 时 step=4)
无 Dither vs 有 Dither 对比
- 无抖动 同一量化区间全部像素误差一致 → 规整、连续、可见的色带条纹;
- 加微小抖动噪声 同一区间内像素叠加随机小幅偏移,有的向上量化、有的向下量化,整体平均亮度不变,但局部离散化分层边界; 人眼会将细密均匀噪声融合,感知到平滑渐变,无法分辨原本清晰的色带。
关键约束:抖动噪声幅值必须小于 1 个量化步长
10bit 转 8bit 量化步长 = 4,抖动幅值一般取 ±1、±2(不超过一个完整量化台阶);
- 噪声不能过大:否则画面出现明显颗粒噪点,损失干净画质;
- 噪声不能过小:无法打散量化误差,消除不了色带。
三、主流 Dither 分类
分类 1:随机抖动 Random Dither(最简单,部分低端 ISP 内置)
- 实现逻辑 每个像素叠加独立随机整数噪声,范围 \(-step/2,\\;+step/2\),再做量化舍入。 10→8bit step=4,噪声范围:
-2,-1,0,1,2 - 优缺点
- 优点:硬件实现极简,只需要一个线性反馈移位寄存器 LFSR 生成伪随机数;
- 缺点:纯随机噪声会让画面出现轻微雪花噪点,信噪比小幅下降;
- 适用场景:低成本摄像头、预览流,对静态画质要求不高的场景。
分类 2:有序抖动 Ordered Dither(ISP 最常用,硬件流水线友好)
也叫矩阵抖动,预定义固定 N×N 噪声模板(2x2/4x4 矩阵),按像素坐标循环复用噪声,不需要随机发生器,时序稳定、无随机雪花。 经典 2x2 抖动矩阵(幅值 0~3,适配 step=4 量化):

逐行逐像素按坐标取矩阵值叠加到原始像素,再量化。
- 优势
- 纯查表实现,硬件无延时,流水线友好,适合 RGB2YCbCr、GBCE 输出端实时插入;
- 噪声呈规律细密网格,视觉上比纯随机噪点更柔和,静态画面无闪烁;
- 劣势:极端纯色背景下,近距离细看能发现微弱网格纹理;
- 工程适配:你文档中 10bit Y 转 8bit 输出,绝大多数 ISP 在 Clip 截断前插入 2x2 有序抖动模块。
分类 3:误差扩散抖动 Error Diffusion(画质最优,硬件成本高)
代表算法:Floyd-Steinberg 不提前加噪声,量化后把当前像素的量化误差分摊扩散到相邻未处理像素。
- 原理: 像素量化产生误差 e,按比例分给右、下、右下邻域:7/16 传给右侧,3/16 传给左下,5/16 传给正下方,1/16 传给右下;
- 效果:消除色带能力最强,渐变过渡极其平滑,几乎看不到噪点;
- 短板:
- 需要行缓存存储邻域误差,占用片上 RAM;
- 串行处理,破坏 ISP 并行流水线,延时高;
- 使用场景:仅静态图片抓拍、高端工业相机,视频实时流很少使用。
四、结合 ISP 流程:Dither 插入位置(10bit→8bit 场景)
对应两份框图数据流:
10bit Y_out(RGB2YCbCr) → GBCE模块 → 量化压缩(10→8bit) → Dither → ClipU8 → 8bit输出
gamma校正的时候比如12bit转到10bit的时候,在校正的叠加取整后和实际值之间的误差做到类似去抖动的功能。
标准硬件流水线插入点
- GBCE Mode1(LUT 映射):LUT 输出本身 8bit,一般不需要抖动;
- GBCE Mode2 / GBCE Off(线性 10→8bit 压缩):移位 + 四舍五入之后、Clip 饱和截断之前插入 Dither; 流程拆解(GBCE Off 模式):
10bit(0-1023)
- 亮度缩放:
线性量化,产生量化分层误差
- 叠加小幅抖动噪声 D(±1~±2)
- ClipU8 限幅到 0~255 输出 8bit Y
为什么放在 Clip 前:叠加噪声后数值可能短暂超出 0/255 边界,由后级 Clip 统一饱和截断,不会出现数值溢出。
Cb/Cr 色度通道是否需要 Dither?
- 人眼对色度分层敏感度远低于亮度 Y;
- 多数 ISP 默认仅 Y 通道开启 Dither,Cb/Cr 关闭,节省硬件逻辑;
- 高端航拍 / 影视设备:CbCr 同样开启低幅值抖动,消除渐变色彩条纹。
五、工程权衡:Dither 的副作用与调参策略
1. 负面副作用
- 画面静态噪点提升:低光暗区本身信噪比差,开启 Dither 会让暗部颗粒感加重;
- 编码压缩效率下降:抖动引入高频细微噪声,H.264/H.265 编码码率小幅上升;
- 极纯净纯色画面出现细微网格 / 雪花。