样本自适应偏移的关键功能是衰减振铃效应,当使用较大的变换大小时,振铃效应更可能出现。SAO通过首先使用所选分类器将区域中的样本分类为多个类别并根据其类别向每个样本添加特定偏移量来减少样本失真。在比特流中用信号通知每个区域的分类器索引和偏移。
HEVC使用两种SAO类型:边界偏移(Edge Offset, EO)和边带偏移(Band Offset, BO)。在EO中,样本的分类基于其邻域,即当前样本与其相邻样本之间的比较。在BO中,分类基于样本值。
边界偏移 Edge Offset
图1显示了吉布斯现象,可用于解释图像和视频编码中振铃效应的出现。横轴表示沿一维线的采样位置,纵轴表示采样值。虚线曲线表示原始样本,而实线曲线表示当由于变换系数的量化而丢弃信号中的最高频率时的重构样本。

局部峰、凸边/角、凹边/角和局部谷用实心圆标记,从图中可以观察到,通过对局部峰值和凸角应用负偏移,对凹角和凹谷应用正偏移,可以减少失真。
EO使用四种单向模式进行样本分类:水平、垂直、135°对角线和45°对角线,如图2所示,其中标签“c”表示当前样本,标签“a”和“b”表示两个相邻样本。这四个样本模式形成四个EO类别。每个启用EO的CTB只能选择一个EO类。基于率失真优化,选择一个EO类,并且在比特流中用信号通知指示选择哪个EO类的索引。

对于具有特定方向的给定EO类别,CTB内的每个样本被分为五类之一。标记为“c”的当前采样值将沿选定的一维模式与其两个相邻值进行比较。下表总结了每个样本的类别分类规则。类别1和4分别与所选一维模式的局部谷和局部峰相关联。类别2和3分别与凹角和凸角相关联。如果当前样本不属于EO类别1至4中的任何一类,则将其分配至类别0,且不应用SAO。请注意,类别是互斥的,一个样本只能属于一个类别。

正负边界偏移的影响如图3所示,解释如下。类别1和类别2的正偏移会导致平滑,因为局部凹谷和凹角会变得更平滑,而这些类别的负偏移会导致锐化。相反,对于类别3和4,负偏移导致平滑,正偏移导致锐化。在HEVC中,不允许在EO中锐化。因此,编码器针对每个EO类别用一个信号通知四个特定偏移的绝对值,偏移的符号从相应的EO类别中隐式导出。EO和BO都使用四个偏移量,这限制了偏移量的数量,以减少对行缓冲器的要求。

边带偏移 Band Offset
HEVC SAO工具使用的另一个偏移是边带偏移(BO)。将向值属于同一边带(值范围)的所有采样添加一个偏移。样本值范围分为32个相等的边带。对于0到255范围内的8位样本,边带的宽度为8。因此,8k到8k+7的样本值属于边带k,其中k的范围为0到31。可以向解码器发送边带中原始样本和重构样本之间的差异(即,边带的偏移)。BO的偏移符号没有限制。
图4展示了BO如何补偿区域的样本强度偏移。横轴表示样本位置,纵轴表示样本值。虚线曲线表示原始样本,而实线曲线表示重建样本,受预测残差的量化误差和相位偏移的影响,因为编码运动矢量偏离真实运动。

如图4所示,如果重建的运动向量和“真实”运动向量之间存在相移(差异),则与原始信号相比,具有梯度的平滑区域可能会偏移一定值。在该示例中,与原始样本相比,重构样本被向左移动,这导致可以通过BO针对边带k、k+1、k+2和k+3校正的系统负误差,其中范围从k*8到((k+1)*8)-1的样本被分类为属于边带k,并且可以通过使用相应的偏移值来修改。
在HEVC中,只有四个连续边带的偏移和当前区域的起始(或最小)边带位置被发信号给解码器。在BO中用信号通知四个偏移量,这等于EO中用信号发送的偏移量的数量(偏移量的数目被限制以减少线缓冲器的需求)。仅发出四个边带的信号的原因是CTB形成的区域中的样本值范围可能非常有限。
因此,通过发信号通知当前区域的起始边带位置,BO可以识别当前区域中要补偿的最小采样值,以便解码器可以恢复它,如图5中的示例所示。这对于色度CTB尤其如此。在自然图像中,色度分量通常由窄带信号表示,这意味着通过几个边带偏移,编码器可以恢复该区域中的大多数样本。

SAO Parameters Signaling
序列参数集(SPS)中用信号通知的语法元素sample_adaptive_offset_enabled_flag指示在当前视频序列中是否启用了SAO。在Slice header中,两个语法元素slice_sao_luma_flag和slice_sio_chroma_flag指示当前Slice中是否分别为亮度和色度启用了SAO。
低延迟应用可以使用基于编码树单元(CTU)的SAO编码算法。如图6所示,CTU包括其对应的luma CTB、Cb CTB和Cr CTB。语法方面,SAO参数自适应的基本单元始终是一个CTU。如果在当前Slice中启用SAO,则将每个CTU的SAO参数交织到Slice数据中。比特流中的SAO数据在每个CTU的开头用信号通知。CTU级SAO参数包括SAO merge信息、类型信息和偏移信息。

A. SAO Parameters Merging
CTU可以使用三个选项来发送SAO参数:重用left CTU的SAO参数(通过将语法元素SAO_merge_left_flag设置为1),重用top CTU的SAO参数(设置语法元素
sao_merge_up_flag设置为1)或通过发送新的SAO参数。SAO Parameters Merging 由所有三个颜色分量共享。当SAO merge_left或SAO merge_up模式被指示时,来自左侧或上方CTU的所有SAO参数都将被复制,并且当前CTU没有更多信息。这种基于CTU的SAO Parameters Merging 有效地减少了需要用信号通知的SAO消息。
B. SAO Type and Offsets Signaling
如果不使用SAO Parameters Merging,则如图7所示发送当前CTU的信息。首先发送亮度分量的语法元素,然后发送Cb语法元素,再发送Cr语法元素。对于每个颜色分量,发送SAO类型(SAO_type_idx_luma或SAO_type_idx_chrma),表示EO、BO或未应用(SAO已关闭)。如果选择了BO或EO,则传输四个偏移。如果选择了BO,则发信号通知起始边带位置(sao_band_position)。否则,如果选择EO,则用信号通知EO类(sao_EO_class_luma或sao_EO_class_chrma)。

Cb和Cr共享SAO类型(SAO_type_idx_chroma)和EO类(SAO_EO_class_chrma)语法元素,以通过在某些平台上实现更高效的内存访问来减少辅助信息并加快SAO处理。因此,这些语法元素仅针对Cb进行编码。码字(包括“关闭”、“EO类别选择索引”和“BO频带位置索引”)的设计基于概率分布,以减少信息。
C. CABAC Contexts and Bypass Coding
使用基于上下文的自适应二进制算术编码(CABAC)对包括SAO merge信息、SAO类型信息和偏移信息的所有CTU级SAO语法元素进行编码。只有SAO类型的第一个bin(指定在当前CTU中SAO是打开还是关闭)以及SAO merge_left和merge-up标志使用CABAC上下文。所有其他箱都在旁路模式下进行编码,这显著增加了CABAC中的SAO解析吞吐量,而没有很大的编码效率损失。
《样本自适应偏移 Sample Adaptive Offset (SAO)》有一个想法