H.265 SAO
样点自适应偏移(Sample Adaptive Offset, SAO)。
如果说去块滤波(Deblocking Filter)是“外科手术”,精确地处理块边界的“缝隙”,那么SAO更像是“后期调色”,对整个区域的像素进行精细的补偿和修正,以提升整体图像质量。
1. SAO是什么,解决了什么问题?
SAO在去块滤波之后执行,它的核心思想是:通过给特定类别的像素值加上或减去一个小的偏移量(Offset),来修复因量化引入的失真。它不是一个平滑或模糊滤波器,而是一个补偿滤波器。
SAO主要针对以下几种去块滤波难以处理的失真:
- 振铃效应(Ringing Artifacts): 在图像的剧烈边缘(强纹理)附近产生的“波纹”或“重影”。
- 条带效应(Banding/Contouring): 在颜色平滑渐变的区域(如天空),由于量化过于粗糙而产生的颜色“阶梯”或“条带”。
- 均值偏移(Mean Shift): 整个编码块的平均亮度与原始块相比有轻微的整体性偏移(偏亮或偏暗)。
2. SAO的核心工作原理
SAO的原理非常巧妙且高效,可以概括为“分类与补偿”:
- 分类(Classification): 编码器(在RDO过程中)首先将一个区域内(以CTB,Coding Tree Block为单位)的所有像素按照某种规则进行分类。
- 计算偏移(Offset Calculation): 对每个类别,编码器计算出该类别中所有像素的原始值与重建值(去块滤波后)之间的平均差值。这个差值就是最优的偏移量(Offset)。
- 信令传输(Signaling): 编码器将分类的模式和每个类别的偏移量等信息写入比特流。
- 应用偏移(Offset Application): 解码器读取这些信息,将自己解码出的像素(同样经过了去块滤波)进行相同的分类,然后给每个像素加上其所属类别的偏移量,得到最终的重建像素。
这个决策是在每个CTB(通常是64x64)级别上独立进行的,因此具有高度的局部自适应性。
3. SAO的两种主要模式
SAO通过两种主要的像素分类模式来实现其功能:边沿偏移(Edge Offset, EO) 和 边带偏移(Band Offset, BO)。
3.1. 边沿偏移 (Edge Offset, EO)
- 目标: 专门用于修复边缘区域的振铃效应。
- 分类方法: 比较当前像素C与其两个相邻像素N1和N2的大小关系。这种比较沿着四个方向之一进行:0°(水平)、90°(垂直)、135°(左下对角线)、45°(右下对角线)。
ASCII图表:EO的四个方向
      135°  90°  45°
         \  |  /
          \ | /
           \|/
     180°-- C -- 0°
           /|\
          / | \
         /  |  \
       225° 270° 315°
例如,在0°方向上,N1是C的左边像素,N2是C的右边像素。
根据比较结果,像素C被分到以下5个类别中的一个:
- 类别 0: 不满足任何条件 (不应用偏移)。
- 类别 1: 局部极小值 (Valley) C < N1 && C < N2
- 类别 2: 缓坡 (Concave curve) C < N1 && C == N2或C == N1 && C < N2
- 类别 3: 陡坡 (Convex curve) C > N1 && C == N2或C == N1 && C > N2
- 类别 4: 局部极大值 (Peak) C > N1 && C > N2
工作原理: 振铃效应通常表现为在强边缘两侧出现不自然的“波谷”(undershoot)和“波峰”(overshoot)。EO模式能精确地识别出这些作为“局部极小/极大值”的像素,并为它们分别计算出一个正向或负向的偏移量来进行补偿,从而“抚平”这些波纹。编码器会为这4个类别计算并发送4个偏移量。
3.2. 边带偏移 (Band Offset, BO)
- 目标: 修复平坦或缓变区域的条带效应和整体的均值偏移。
- 分类方法: 极其简单,直接根据像素自身的亮度值进行分类。
工作流程:
- 整个像素的亮度范围(例如8-bit下是 [0, 255])被等分为32个条带(Band)。每个条带的宽度为256 / 32 = 8。- Band 0: [0, 7]
- Band 1: [8, 15]
- …
- Band 31: [248, 255]
 
- Band 0: 
- 编码器从这32个条带中选择连续的4个,并为这4个条带中的像素计算偏移量。
- 编码器将起始条带的位置和4个偏移量写入比特流。
工作原理: 条带效应的本质是,某个亮度范围内的所有像素都被量化到了同一个值,破坏了平滑的渐变。BO模式能识别出这些“受灾”最严重的亮度条带,并对它们进行统一的补偿,从而恢复渐变的连续性。例如,如果发现亮度在 [128, 135] 范围内的像素普遍偏暗,BO就可以为这个条带的所有像素都加上一个正的偏移量。
4. 编码器的决策过程 (RDO)
对于每一个CTB,编码器都会通过率失真优化(RDO)来决定使用哪种SAO模式,或者干脆不用。它会尝试以下所有可能性:
- 不使用SAO (SAO Off)
- 边沿偏移 (EO),4个方向逐一尝试
- 边带偏移 (BO)
编码器会计算每种模式的R-D Cost:
Cost=D+λ⋅R
- D: 应用该SAO模式后,CTB的失真(与原始图像相比)减少了多少。
- R: 编码该SAO模式所需的比特数(模式信息 + 偏移量值)。
最终,编码器会选择Cost最小的那个选项。如果“不使用SAO”的Cost最低(即启用SAO带来的质量提升不足以抵消其比特消耗),那么该CTB就会禁用SAO。
5. SAO信令 (Signaling)
为了降低信令开销,HEVC还支持参数合并。一个CTB可以选择不发送自己的SAO参数,而是直接复用其左边或上边CTB的SAO参数,只需在比特流中发送一个合并标志(sao_merge_left_flag或sao_merge_up_flag)即可。
总结
SAO是HEVC相比H.264在画质提升方面一个非常重要的补充工具。
- 与去块滤波互补: Deblocking处理“线”上的问题(边界),SAO处理“面”上的问题(区域)。
- 低复杂度高收益: SAO的分类和加法操作非常简单,易于硬件实现,但通常能带来可观的PSNR提升(0.1-0.5dB不等)和明显的视觉质量改善。
- 高度自适应: 以CTB为单位进行决策,使得滤波策略能紧密贴合局部图像的特征。
Deblocking Filter + SAO 构成了HEVC强大而高效的环路滤波系统,它们共同作用,将解码重建图像的质量推向了一个新的高度。