H.266/VVC的样点自适应补偿技术和H.265/HEVC的类似。SAO的主要思想是对对照原始图像, 通过对重建图像块的像素特点进行合适的分类,对不同的分类施加不同的补偿值,使其更接近原始图像,从而可以减少图像失真。
根据吉布斯效应, 时域跳变信号在频域进行截断操作后会在时域原始值附近产生起伏, 如下图所示, 虚线为原始信号值, 而实线表示重建信号值, 它存在一些局部峰值、局部谷点等。在编码中,由于变换、量化导致图像的高频信息丢失,解码后会在边缘周围产生波纹现象,即振铃效应。
造成振铃效应的根本原因是高频信息的丢失。SAO的基本原理就是对重构曲线中的波峰像素加上负值进行补偿,波谷像素加上正值进行补充。
样点自适应补偿SAO技术包含两滤波类型,边缘补偿(Edge Offset,EO)和带补偿(Band Offset,BO),在实际编码中,以CTU为单位,针对每个CTU的不同特性,由RDO准则决定使用哪种SAO滤波类型或者不使用SAO滤波。
带补偿(BO)
在带补偿模式中,所选的补偿值直接取决于像素的幅度值。编码器把图像像素值范围划分为32个等份,每个小等份成为“带”(band)。
以 8bit 为例,将 0~255 划分成 32 个带,每个边带包含256/32=8个像素值,即像素值属于[8k,8k+7]范围属于第k个边带,k=0...31。同一边带使用相同补偿值。
针对每个CTU,分别统计落入每个带中的原始像素均值和重建像素均值之差(即补偿值),在编码端将每个补偿值加到每个重建像素上,使得每个带中的原始像素的均值和重建像素的均值相等,同时,将这一补偿值写入码流传到解码端,使得解码端可以完成同样的补偿。
计算完32个带后,选择4个连续补偿值最大的带作为最终确定的需要补偿的带。(原因:(1)对于图像的平坦部分大部分像素的取值都集中在很少的几个带中,使用连续的4个带能够覆盖大部分的像素;(2)EO模式使用了4个补偿值,为了节省码流,BO也可以服用这四个补偿值的语法)
边缘补偿(EO)
边缘补偿根据边界方向区分像素值,EO采用了4种一维方向来确定该样点值所属的EO模式,分别为水平、垂直、135度角和45度角,如下图所示,c表示当前像素,a和b表示相邻像素。在编码端,每个CTU只可以选择4种EO模式中的一种,即该CTU中所有的像素都为这一EO模式,通过使用RDO准则选择EO模式。
对于一个给定的EO模式,根据a/b/c值的大小关系,即当前c点像素与周围a、b两个点的参考像素相比,将CTU中的每个像素分为5种类型:
- 如果当前像素值小于相邻两个像素值,则该像素为谷值,属于类型 1;
- 如果当前像素值小于一个相邻像素值,且等于另一个相邻像素值,则该像素为凹拐点,属于类型 2;
- 如果当前像素值大于一个相邻像素值,且等于另一个相邻像素值,则该像素为凸拐点,属于类型 3;
- 如果当前像素值大于相邻两个像素值,则该像素为峰值,属于类型 4;
- 如果①~④的情况都不满足,则该像素属于平坦区域,不需要进行边缘补偿
类型 | 条件 |
1 | c<a和c<b |
2 | (c<a和c=b)或(c=a和c<b) |
3 | (c>a和c=b)或(c=a和c>b) |
4 | c>a和c>b |
0 | 其他 |
四类的图如下所示;
对于以上第1类谷值点和第2类凹拐点,EO 对其加上一个正的补偿值,使之与相邻像素平齐;对第3类凸拐点和第4类峰值点,EO 对其加上一个负的补偿值,使之与相邻像素平齐。在同一个 CTU 内,EO 并不对每个像素都施加不同的补偿值,而是每一类共享同一个补偿值,每个 CTU 仅需要传递 4 个补偿值,这样可以极大地节省码率消耗。另外,编码器也不需要为每个补偿值传递额外的符号标志位,因为第12类的补偿值必为正数,第34类的补偿值必为负数,编码器只需要将补偿值的绝对值传递到解码端即可,具体的正负号由类型决定。
Merge模式
参数融合(Merge)是指对于一个CTB,其SAO参数可以直接使用相邻块的SAO参数,这时只需标识采用了哪个相邻块的SAO参数即可。
如上图所示,当进行SAO参数决策时,左侧块和上侧块的SAO参数已经确定。此时当前块SAO参数有以下3种选择:
-
直接使用左侧块的参数。
-
直接使用上侧块的参数。
-
通过分析自身像素的特点,选择不同于左侧块和上侧块的参数。