音视频之H.265/HEVC环路后处理
H.265/HEVC系列文章:
1、音视频之H.265/HEVC编码框架及编码视频格式
2、音视频之H.265码流分析及解析
3、音视频之H.265/HEVC预测编码
4、音视频之H.265/HEVC变换编码
5、音视频之H.265/HEVC量化
6、音视频之H.265/HEVC环路后处理
类似于以往的视频编码标准,H.265/HEVC 仍采用基于块的混合编码框架,方块效应、振铃效应、颜色偏差以及图像模糊等失真效应仍存在于采用 H.265/HEVC 标准的压缩视频中。为了降低这类失真对视频质量的影响,H.265/HEVC中采用了环路滤波技术叫(In-loop Filtering),包括去方块滤波(Deblocking Filter)和像素自适应补偿(Sample Adaptive Offset)两个模块。去方块滤波用于降低方块效应,像素自适应补偿用于改善振铃效应,这两个模块在编码框架中的位置如图7.1所示。可以看到,去方块滤波模块和像素自适应补偿模块都处在编码环路中,即经过滤波的重构像素才能作为后续编码像素的参考使用。环路滤波处理后的重建像素更有利于参考,进一步减小后续编码像素的预测残差,有效地提高视频的主客观质量。
一、去方块滤波:
1、去方块效应的由来:
方块效应是指图像中编码块边界的不连续性,如图7.2(b)所示,压缩重建图像有明显的方块效应,严重影响图像的主观质量。
造成方块效应的主要原因是:
- 各个块的变换量化编码过程相互独立,相当于对各个块使用了不同参数的滤波器分别滤波,因此各块引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续。
- 此外,运动补偿预测过程中,相邻块的预测值可能来自于不同图像的不同位置,这样就会导致预测残差信号在块边界产生数值不连续。
- 另外,时域预测技术使得参考图像中存在的边界不连续可能会传递到后续编码图像。
对块边界进行平滑滤波可以有效地降低、去除方块效应。
- 用于解码端的后处理滤波技术(环外滤波),可以有效改善图像的主客观质量。
- 一种环路滤波方法,它采用3抽头的低通滤波器来削弱边界的不连续,可以有效降低低比特率编码视频的方块效应。
- 通过设标志位可以有效降低环路滤波及后处理滤波的计算复杂度。
- 分区域滤波方法,对平坦区域利用9抽头滤波器对块边界及块内部的像素进行调整,对纹理区域通过解析像素特征对边界处像素进行相应的修正。
- H.264视频编码标准引入了环路去方块滤波,编码环路中的滤波模块不但可以改善滤波后重建图像的质量,而且滤波后重建图像作为时域预测参考还可以提升后续编码的质量。它自适应地根据不同的视频内容及不同的编码方式选择不同强度的滤波参数,然后对其进行平滑处理。该方法在相同的PSNR下可节省码流9%左右,同时明显地提高了图像视觉质量。
H.265/HEVC标准中的环路去方块滤波:
H.265/HEVC标准仍采用环路去方块滤波应对方块效应,其去方块滤波算法在提高视频主客观质量的同时,具有较低的计算复杂度,并允许并行处理等实现技术,主要体现在以下几方面。
- 无论亮度分量还是色度分量,去方块滤波均对8x8的块边界进行处理,并且对于色度分量仅当边界两侧至少有一个块采用帧内预测模式时,该边界才需要滤波,这使得滤波次数大大降低。
- 滤波时,每行像素边界两边最多各修正3个像素值,这使得各8x8的块边界空间独立,可以并行进行滤波操作。
- 可以先处理整幅图像中的垂直边界,再处理水平边界,而非H.264中的垂直边界和水平边界穿插进行,使得CTB的解码顺序更加灵活。
2、去方块滤波技术:
H.265/HEVC 中的去方块滤波模块需要针对所有PU和TU边界中的8x8的块边界进行处理,包括两个环节:滤波决策和滤波操作。首先进行滤波决策,以得到边界的滤波强度(不滤波、弱滤波或强滤波)及滤波参数。然后进行滤波操作,即根据所选择的滤波强度及滤波参数对像素进行相应的修正。
H.265/HEVC 中的去方块滤波算法对不同的视频内容及不同的编码参数具有自适应能力,即不同的块边界自适应选择是否滤波及滤波强度,如对平滑区域处的不连续边界做强滤波处理,对纹理较丰富的区域弱滤波乃至不滤波。另外,在片级上允许根据不同视频序列的个体特征调节全局滤波参数,即对滤波参数增加偏移值进行微调,如此就可增加或减少滤波强度,优化解码视频质量,获得比默认值更好的效果。例如,当偏移为负值时,滤波强度减弱,可以有助于小的空间细节的逼真度,特别是高分辨率的视频。当偏移为正值时,滤波强度增加,可以去除默认值所不能滤除的方块效应,尤其是针对低分辨率视频内容,去除可能由次优的运动估计、模式选择或残差编码引起的方块效应,提高图像主观质量。该全局滤波参数通过图像片头中的语法元素传输。
值得注意的是,虽然去方块滤波的最小单位是8x8块的边界,而实际是将8x8块分成两部分独立进行去方块滤波处理,垂直边界以8x4为基本单位,水平边界以4x8为基本单位。
滤波决策:
滤波决策的目的是对所有PU和TU边界中8x8的块边界,根据视频内容及编码参数,确定其滤波强度及滤波参数,是去方块滤波的关键环节。如图7.3所示,该环节包含3个步骤:获取边界强度是根据边界块的编码参数初步判断块边界是否需要滤波及滤波参数,因为相邻块采用不同的编码参数(如采用不同预测方式、不同的参考图像、不同的运动矢量等)易造成像素值在块边界的不连续。滤波开关决策进一步对视频内容进行分析,主要根据边界两侧块内像素值的变化及编码参数(量化参数)确定边界是否需要滤波,因为平坦区域的不连续块边界才是滤波对象。滤波强弱选择根据视频内容(块边界及块内部像素值的变化)及编码参数(量化参数)进一步判断边界是否需要滤波以及选择合适的滤波强度,因为边界的不连续也可能是视频自身内容所致。
符合滤波条件(PU和TU边界中8x8的块边界)的亮度分量块边界都需要通过以上3个环节确定滤波强度及滤波参数,而对于色度分量的块边界,滤波决策环节只需要为其获取边界强度,且其边界强度值直接取相应亮度分量的边界强度步骤得到的边界强度值。
获取边界强度:
获取边界强度是根据边界块的编码参数初步判断块边界是否需要滤波及滤波参数,经过获取边界强度模块后,所有允许滤波的边界获得边界强度(Boundary Strength,BS),其取值为0、1或2。对于亮度分量,边界强度值为0时,表示该边界不需要滤波,并不再进行后续处理(滤波开关决策、滤波强弱选择以及滤波操作)。亮度分量边界强度值为1或2时,会进行后续模块处理,并且其值会影响后续“滤波强弱选择”中的阌值。对于色度分量,边界强度值为0、1时,表示该边界不需要滤波,只有边界强度值为2时,才会对其进行滤波(也不需要进行后续滤波开关决策、滤波强弱选择)。
获取边界强度的流程如图7.4所示,其中P和Q为边界两旁4x4大小的块。块P和Q的位置如图7.5所示,对于垂直边界,P表示边界左边的块,Q表示边界右边的块;对于水平边界,P表示边界上边的块,Q表示边界下边的块。可以看到,边界强度值在一定程度上反映了两个相邻块编码参数的一致性,相邻块采用的编码参数越一致,其块边界误差的连续性越好。
滤波开关决策:
由于人眼的空间掩盖效应,图像平坦区域的不连续块边界更容易被观察到。如图7.6(a)所示,当边界两边的像素值相对平滑,但在边界处呈现出大的差异时,人眼视觉系统可以明显地识别出这种位于边界处的不连续。然而,当边界两侧的像素值呈现出高度变化的现象,如图7.6(b)所示,此时这种不连续难以察觉。另外,滤波操作也会减弱强纹理区域应有的纹理信息。滤波开关决策模块就是根据边界块内像素值的变化程度判断该边界区域的内容特性,然后根据边界区域的内容特性确定是否需要进行滤波操作。
一个垂直块边界区域如图 7.7所示,其中p(x,y)、q(x,y)分别为块边界两侧的像素值。定义4个变量:表示P块首行像素的变化率,
表示Q块首行像素的变化率,
表示P块末行像素的变化率,
表示Q块末行像素的变化率。
块边界区域的纹理度值越大,表明该区域越不平坦,当其大到一定程度时,该边界则不需要滤波。因此,H.265/HEVC标准规定当满足式(7-1)时,该边界的滤波开关打开,否则关闭。
滤波强弱选择:
在滤波开关打开的条件下,须对视频内容进行更加细致的判断,以进-步确定滤波强度。图7.8给出了3种边界情况。图7.8(a)与图7.8(b)相比较,图7.8(a)边界两侧像素值平坦,在视觉上会形成更强的块效应,因此,需要对边界周围的像素进行大范围、大幅度的修正,才能得到良好的视觉效果。而对于图7.8(c),边界处的像素差值特别大,由于像素失真总会处于一定的范围之内,当差值超出一定的范围后,这种块边界差别则是视频内容本身所致。
以图7.7为例,H.265/HEVC标准规定当式(7-2)~(7-7)均满足时,则该边界采用强滤波,否则采用弱滤波。式(7-2)和式(7-3)用于判断边界两边像素值的变化率。式(7-4)和式(7-5)用于判断边界两侧像素是否平坦。式(7-6)和式(7-7)用于判断在边界处像素的跨度是否控制在一定的范围内。
否则的值按照下列公式进行计算:
通过比较可以看出,在衡量边界两侧像素的变化率方面,无论是滤波开关还是滤波强弱,都利用与相关的值进行判断。并且,此值的大小关系如下:滤波开关阈值最大,弱滤波其次,最小的是强滤波的值。这个现象正说明了边界两侧像素值变化率越小,越需要更强的滤波。
滤波操作:
滤波操作的实现过程包括3种情况:亮度分量的强滤波、弱滤波以及色度分量的滤波。
亮度分量的强滤波:
强滤波会对边界两侧的像素进行大范围、大幅度的修正,如图7.7中的像素 p(m,n)和 q(m,n)都要进行修正,m 取值 0,1,2,且n取值 0,1,2。像素值的修正公式为式(7-8)~(7-13)。
亮度分量的弱滤波:
弱滤波操作中修正的像素范围及幅度较小,而且需要根据每一行像素的具体情况确定每行的滤波操作。以图7.7中第一行像素为例,下面给出具体的弱滤波操过程。
计算边界处像素的变化程度:
色度滤波:
当获取边界强度模块判定BS=2时,色度分量需要进行滤波操作,色度滤波的过程相对简单,以第一行像素为例具体滤波操作如下。
像素值 p(0,n)和q(0,)分别按式(7-21)和式(7-22)进行修正,n取值 0,1,2,3。
3、去方块滤波的实现:
去方块滤波的具体实现因滤波顺序的不同可有多种形式,可以以CTB为基本单位,按照raster扫描方式进行处理;或先将整幅图像划分成互不重叠的8x8的块,然后再进行滤波;或以CU为基本单位,按照Z扫描方式进行处理。但其整体上都遵循对整幅图像先水平滤波再垂直滤波,并且仅对 8x8大小的块边界进行处理的原则。
为了对去方块滤波的操作过程有系统的认识,下面详细描述该技术在 HM10.0中的实现过程:
滤波顺序:
首先,将图像划分为大小相同的CTB块,按照raster 扫描方式对每个CTB进行处理。其次,对于每个CTB,按照Z扫描方式以CU为基本单位进行处理,如图7.9所示,设CTB大小为64x64。
每个亮度CU块对应两个色度块,亮度块与色度块穿插着进行滤波。
对垂直边界按照从左到右的顺序进行处理,如图7.9中的第1个CU块,其亮度分量的滤波顺序为a→d,色度分量的滤波顺序为e→f,g-h,整体上滤波顺序为a→e→g→b→c→f→h→d,如图7.10所示。
确定滤波边界:
该部分的核心是确保被滤波的边界必是PU或TU的边界,并且图像边界不需要被滤波,具体步骤如下。
- 将图7.10中a,b,c,d的滤波标志均设置为 0。
- 对边界a进行判断。如果边界a不满足以下3种情况时,将其滤波标志重置为1。
a为图像的左边界。
loop_filter_across_tiles_enabled_flag的值为0,并且a的左边界为tile 的边界。
slice_loop_filter_across_slices_enabled_flag的值为0,并且a的左边界为 Slice 的边界。
- 标记TU的边界。如果变换单元的划分方式为图7.12(a),则将图7.10中边界c的滤波标志重置为1;如果变换单元的划分方式为图7.12(b),则边界b,c,d的滤波标志均重置为1。
- 标记PU的边界。如果预测单元的划分方式为图7.13(a)和(b)则将图7.10中边界c的滤波标志重置为1;如果预测单元的划分模式为图7.13(c),则将边界b的滤波标志重置为1;如果预测单元的划分模式为图7.13(d),则将边界d的滤波标志重置为1。
计算边界强度:
对于第1步中滤波标志为0的边界,其边界强度为0;滤波标志为1的边界,根据去方块滤波技术中的方法,以8x4为基本单元计算边界强度值。这样,对于图7.10中亮度分量,即a~d四条垂直边界,共得到32个BS值;对于色度分量,e()和g()的边界强度值由a(2i)的边界强度值复制而来; f(i)和 h(i)的边界强度值由 c(27)的边界强度值复制而来,i取值 0,1,2,3,如图 7.14所示。
对亮度分量进行滤波开关决策、滤波强弱选择:
对每个8x4的垂直边界,按照如图7.15所示的流程进行滤波开关及滤波强弱判断。
滤波:
该部分包括亮度分量的滤波以及色度分量的滤波。根据去方块滤波技术中滤波操作介绍的计算方法进行滤波。值得注意的是,第3步中滤波开关及强弱选择仅针对亮度分量,是否进行色度分量滤波仅与边界强度值有关系。
如图 7.14 所示,先对 a(0)进行滤波开关决策及滤波强弱选择,然后进行滤波操作。再依次对a(1)~a(7)进行处理。边界a处理完毕,再对色度分量的边界e进行滤波。整体上按照a→e→g→b→c→f→h→d的顺序。
至此,第一个CU块的垂直边界滤波完成。其余CU块处理方法相同。待整幅图像的所有垂直边界滤波完成后,再对其进行水平边界的滤波,该过程与垂直边界的滤波过程类似。
在不同的编码配置情况下,去方块滤波器可以在比特率上带来不同程度的减少,在主观感受上也有明显的改善。表7.3为去方块滤波性能的实验结果,采用HM10.0编码器,标准配置中去方块滤波器打开,对比组中关掉了去方块滤波,每个序列编码帧数为60帧。可以看出,关掉去方块滤波后,在同样的视频质量下带来了1.83%~4.19%的比特率增加。
图7.16为序列PartyScene,分辨率为832x480,帧率为50fps。编码配置条件为随机接入,QP=39。图7.16(a)为关掉去方块滤波处理的结果,图7.16(b)为打开去方块滤波的结果,可以明显地看出方块效应的减弱。
图7.17为序列FourPeople,分辨率为1280x720,帧率为60fps。编码配置条件为low-delayB,QP=39。图7.17(a)为关掉去方块滤波处理的结果,图7.17(b)为打开去方块滤波的结果。
4、语法语义:
SPS级语法语义:
pcm_loop_filter_disabled_flag:该语法元素用于说明对于一个编码单元CU,在pcm_enabled_fag为1的条件下是否采用环路滤波技术,包括去方块滤波以及像素自适应补偿。当该语法元素取值为1时,表示不使用;取值为0时,表示使用。
PPS 级语法语义:
loop_filter_across_tiles_enabled_flag:该语法元素用于说明在 tile的边界处是否执行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示执行;取值为0时,表示不执行。
pps_loop_filter_across_slices_enabled_flag:该语法元素用于说明在Slice 的左边界以及上边界处是否执行环路滤波操作。当取值为1时,表示执行;取值为0时,表示不执行。
deblocking_filter_control_present_flag:该语法元素指出控制去方块滤波的语法元素是否出现在PPS中。当取值为1时,表示在PPS中有控制去方块滤波的语法元素;取值为0时,表示没有。
deblocking_filter_override_enabled_flag:该语法元素指出在 Slice 头部是否出现语法元素 deblocking_filter_override_flag。当取值为1时,表示在 Slice 头部存在语法元素deblocking_ filter_override_flag;取值为0时,表示在Slice头部不存在该语法元素。其默认值为0。
pps_deblocking_flter_disabled_flag:该语法元素表示在语法元素slice_deblocking_ filter_disabled_flag 未出现的条件下,是否对各个 Slice执行去方块滤波。当取值为1时不执行;取值为0时执行。默认值为0。
pps_beta_offset_div2&pp_tc_offset_div2:该语法元素表示去方块滤波参数/2和
/2的默认补偿值,该补偿值还可以在Slice的头部进行重载。其取值范围为[-6,6],当该语法元素未出现时,认为其值为0。
Slice 级语法语义:
deblocking_filter_override_flag:该语法元素表明在 Slice 的头部是否出现去方块滤波参数。当取值为1时,表明出现了去方块滤波参数;当取值为0时,表明未出现。其默认值为0。
slice_deblocking_filter_disabled_flag:该语法元素表明对于当前 Slice是否进行去方块滤波操作。当其取值为1时,表示不进行;取值为0时表示进行。当该语法元素未出现时,其值等于语法元素pps_deblocking_filter_disabled_flag 的值。
slice_beta_offset_div2&slice_tc_offset_div2:该语法元素表明当前Slice 的去方块滤波参数/2和
/2的补偿值,其取值范围为[-6,6]。当该语法元素未出现时,slice_beta_offset _div2 的值等于pps_beta_offset_div2的值,slice_tc_offset_div2 的值等于 pps_tc_offset_div2 的值。
slice_loop_filter_across_slices_enabled_flag:该语法元素表明对于当前 Slice 的左边界及上边界是否进行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示可能进行(具体情况要根据后续条件判断);取值为0时,不进行环路滤波。当该语法元素未出现时,其值等于pps _loop_filter_across_slices_enabled_flag 的值。
二、样点自适应补偿:
H.265/HEVC 仍采用基于块的 DCT变换,并在频域对变换系数进行量化。对于图像里的强边缘,由于高频交流系数的量化失真,解码后会在边缘周围产生波纹现象,这种失真被称为振铃效应,严重影响视频的主客观质量。如图7.18所示,实线中的高频信息失真后变成了虚线(实线表示原始像素值,虚线表示重构像素值)。可以看到,重构像素值在边缘两侧上下波动。
如上所述,造成此现象的根本原因是高频信息的丢失。因此,要抑制振铃效应,就需要减小高频分量的失真,而直接精细量化高频分量势必会降低压缩效率。样点自适应补偿技术则从像素域入手降低振铃效应;对重构曲线中出现的波峰像素添加负值进行补偿,波谷添加正值进行补偿。由于在解码端只能得到重构图像信息,因此可以根据重构图像的特点,通过将其划分类别,然后在像素域进行补偿处理。
WMV9(Windows Media Video9)中,为了削弱振铃效应,在解码端采用一种去振铃滤波器,它将像素划分为两个种类:边缘性像素及非边缘性像素,再对其分别进行滤波处理,这可能导致图像之间切换时出现剧烈的闪动现象。
VCEG-AL27中提出了自适应环路滤波技术,它根据拉普拉斯能量和将重构像素值进行分类,再针对不同种类的像素进行相应的滤波及补偿。该方法可以获得较高的编码增益,然而其像素值的分类及滤波过程复杂度过高。
JCTVC-A124中提出了极值校正滤波器(EXC)以及边带修正滤波器(BDC)。EXC通过比较当前像素值与其4个相邻像素值的大小,识别到极值像素的位置,然后对其进行修正。BDC将像素值划分成多条边带,然后根据不同的边带进行相应的补偿此两种滤波方式均基于整幅图像,其整体复杂度也较高。
在JCTVC-A124的基础上,JCTVC-B077提出了基于图像的边带补偿法(PBO)、边界补偿法(PEO)以及自适应限幅(PAC)。比起BDC的均边带划分方式,PBO增加了一种非均匀划分方式。另外,该技术基于图像四叉树划分进行,整体上复杂度较高。JCTVC-C147和JCTVC-D122提出了针对不同的块,从多种分类方式中自适应选择一种进行补偿,计算复杂度仍很高。JCTVC-E049提出了像素自适应补偿法(SAO),在第5次JCT-VC 会议上SA0 被采纳至 H.265/HEVC 工作草案中。
1、SAO技术:
H.265/HEVC标准中的SAO以CTB为基本单位,通过选择一个合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值,可以有效提高视频的主客观质量。它包括两大类补偿形式,分别是边界补偿(Edge Offset,EO)和边带补偿(Band Offset,BO),此外还引入了参数融合技术。
边界补偿:
边界补偿技术是通过比较当前像素值与相邻像素值的大小对当前像素进行归类,然后对同类像素补偿相同数值。为了均衡复杂度与编码效率,边界补偿选用了1维3像素分类模式。
根据选取像素的位置差异,边界补偿共分为4种模式:水平方向(EO_0)、垂直方向(E0_1)、135°方向(EO_2)以及45°方向(EO_3),如图7.19所示。其中,c表示当前像素,a和b表示相邻像素。
在任意一种模式下,根据以下条件将重构像素归为5个不同种类:
- 如果a<c且b<c,则将像素c划分为种类1。
- 如果c<a且c==b或者c==a目c<b,则将像素c划分为种类2。
- 如果c>a且c==b或者c==a日c>b,则将像素c划分为种类3。
- 如果c>a且c>b,则将像素c划分为种类4。
- 如果不属于以上4种情况,则将像素c划分为种类0。
种类1~4所表示的像素关系如图7.20所示,这4个种类的边缘形状依次为谷状、凹角、凸角、峰状。
边界补偿技术首先根据这一规则将CTB块中的所有像素分成5类然后对属于种类1、种类2、种类3、种类4的像素进行补偿,即增加或减少一定数值(补偿值),对于属于种类0的像素不进行补偿。不同种类的像素可以采用不同的补偿值,但同一种类的像素必须采用相同的补偿值。
JCTVC-G680的实验结果表明超过90%的补偿值,其符号与种类相匹配。基于这一规律,按照不同划分种类对补偿值的符号进行限制;种类1和种类2的补偿值大于等于0,种类3和种类4的补偿值小于等于0。因此,对于边界补偿来讲,只需要传送补偿值的绝对值,解码器根据像素补偿种类即可判断出它的符号。
边带补偿:
边带补偿(BO)技术根据像素强度值进行归类,它将像素范围等分成32条边带。例如,对于8比特像素值,其范围为0~255,每条边带包含8个像素值,即[8k,8k+7]这个范围属于第条边带,k的取值范围为[0,31]。然后每个边带会根据自身像素特点进行补偿,且同一边带使用相同的补偿值。
一般情况下,在一定的图像区域内,像素值的波动范围很小,一个CTB中的大多数像素属于少数几个边带。H.265/HEVC标准规定一个CTB只能选择4条连续的边带,并只对属于这4个边带的像素进行补偿。这样边带补偿值数量与边界补偿值数量进行了统一,可以减少对线性存储器的要求。选择哪4条边带可以通过率失真优化方法确定,然后将最小边带号以及4个补偿值传至解码端。
参数融合:
参数融合(Merge)是指对于一个CTB块,其SAO参数直接使用相邻块的 SAO 参数,这时只需要标识采用了哪个相邻块的 SAO 参数即可。
如图7.21所示,A、B、C均表示CTB块,当对C块进行SAO参数决策时,4块和 B块的 SAO 参数已经确定。此时,C的SAO参数有以下3种选择:
- 直接使用 A 块的参数。
- 直接使用B块的参数。
- 通过分析自身像素块的特点,选择不同于A块和B块的参数。
前两种选择属于参数融合算法。对于这两种情况,C块仅需要传送融合标志位即可。
值得注意的是,在使用参数融合时,一个CTU的亮度和色度分量必须同时使用自身左相邻块的补偿参数,或者同时使用自身上相邻块的补偿参数。否则,采用非参数融合,即亮度和色度分量独立根据自身像素值特点选择划分模式及补偿值,在这种情况下两个色度分量共用相同的划分模式。
2、SAO的实现:
快速 SAO 模式判别:
SAO最终的补偿类型可以从以下8种情况中进行选择:不补偿、EO_0模式、EO_1模式、EO_2模式、EO_3模式、BO模式、左相邻块参数融合模式和上相邻块参数融合模式。另外,对于非参数融合模式,像素被分成许多类,每类又可能有多个候选补偿值。SAO模式判别就是指为CTU选择一组SAO参数(模式、补偿值、边带信息等),通常是选择率失真性能最优的一组 SAO 参数。
其中,SAO"为最优的一组SAO参数,为允许最大编码比特数,D为失真,R为编码比特数,R包含编码该模式的各种标志信息以及补偿值信息等。
拉格朗日优化可以将其转化为非限制条件下的求极值问题:
其中,为拉格朗日因子。基于率失真优化的SAO模式判别过程需要得到每种候选SAO参数对应的D和R,通常需要尝试每一种可能的 SAO参数对CTU进行SAO处理。因此,基于率失真优化的SAO模式选择过程中,不可避免地多次计算原始像素与重构像素之间的失真,计算复杂度很高。为了降低复杂度,可以优化失真计算方法,进而降低基于率失真优化的SAO模式选择过程的计算复杂度。下面介绍快速的失真计算方法。
SAO在HM10.0中的实现过程:
为了对SAO有一个更加准确的认识,下面较详细地描述HM10.0中SAO的实现方法。SAO过程的重点是利用拉格朗日优化选择最优的SAO参数,为了降低计算复杂度,该过程采用了上述的快速模式判别方法。
一个CTU 的 SAO 流程如图 7.22所示:
信息统计:
为了利用上述的快速模式判别方法,首先对一个CTU(包括一个亮度分量的 CTB和两个色度分量的CTB)采用不同SAO模式时进行信息统计。具体的信息如表7.4所示。
亮度CTB的 SAO 模式:
首先为亮度分量分别尝试5种SAO模式:EO_0式、EO_1式、EO_2模式、EO_3模式、BO模式,得到每种模式的相对率失真代价。这需要针对每种模式尝试不同的补偿值,每种模式的相对率失真代价为最优补偿值时的相对率失真代价。考虑不补偿模式,根据式(7-25)选择最优的SAO模式(包含不补偿模式),并记录该模式的相对率失真代价。
分别尝试左相邻块参数融合模式(左侧块可用)和上相邻块参数融合模式(上侧块可用),得到相对率失真代价和
。
色度CTB的 SAO 模式:
同亮度CTB,可以为两个色差分量得到最优SAO模式(包含不补偿模式),并记录最优模式的相对率失真代价(两分量的和),值得注意的是两种色度分量共用相同的划分模式。并得到左相邻块参数融合模式(左侧块可用)和上相邻块参数融合模式(上侧块可用)的相对率失真代价
和
。
CTU 的最优 SAO 模式:
综合亮度CTB和色度CTB的SAO模式,为CTU组合成3种SAO模式。
通过比较、
和
,拥有最小值相对率失真代价的模式为该CTU 的最优 SAO模式,该模式的SAO参数包括亮度模式、色度模式补偿值和边带号等。
CTU的 SAO 滤波:
采用最优的 SAO 参数对该CTU 进行补偿。
EO 模式:
如前所述,亮度及色度CTB的SAO模式选择过程中需要确定每一种EO模式(EO_0模式、EO_1模式、EO_2模式、EO_3模式)的相对率失真代价,这就需要为每种EO模式尝试不同的补偿值。下面以EO_0模式为例,介绍其最优补偿值的确定过程。
EO0模式时,CTB中的像素被分为5类,对于属于种类1~4的像素需要进行补偿,每个种类又可以选择不同的补偿值,因此需要为每个种类选取最优补偿值(、
、
、
)。每个种类(种类1~4)最优补偿值的确定过程独立进行,下面以种类1的最优补偿值
为例介绍其获取过程,流程如图 7.23所示。
BO模式:
如前所述,亮度及色度CTB的SAO模式选择过程中需要确定BO模式的相对率失真代价,这就需要尝试不同的边带及补偿值。BO模式时,CTB内的像素被划分到32个边带,最终选择4条连续的边带,并只对属于这4个边带的像素进行补偿,不同的边带可以选择不同的补偿值。
BO模式的确定过程:首先依次为0~31个边带选取最优补偿值,然后确定最优的连续4个边带。下面以第0条边带为例介绍其最优补偿值的获取过程,流程图如图 7.24 所示。
在HM10.0中是以一个Slice 为基本单位进行SAO的。也就是说先对整个Slice的CTU进行信息统计,再计算其SAO参数,最后再进行补偿。表7.5给出了SAO性能的实验结果,标准配置中SAO打开,对比组中SAO关掉,每个序列编码帧数为60帧。可以看出,关掉SAO后,在同样的视频质量下带来了0.63%~6.64%的比特率的上升。
图 7.25为序列 Chinaspeed,分辨率为832x480,帧率为25fps。编码配置条件为 LP,QP-39。图7.25(a)为不使用 SAO 处理的结果,图7.25(b)为使用SAO后的结果,可以明显地看出图7.25(b)比较平滑。
图7.26为序列Cactus,分辨率为1920x1080,帧率为50fs。编码配置条件为 LP,QP-39。图7.26(a)为不使用 SAO 处理的结果,图7.26(b)为使用SAO的结果,可以明显地看出图7.26(b)比较平滑。
3、语法语义:
SAO 语法:
SAO的语法如表7.6所示,它定义了SAO的语法结构,指明了SAO部分在码流中依次出现的语法元素及它们出现的条件,并提出描述子的方法等。
对于当前位置为(rx,ry)的CTU块,首先根据条件判断其是否可以选择左块参数融合模式,如果可以,则根据相应描述子提取出对应的比特该比特即表示出了sao_merge_let_flag的值;同样可提取出sao_merge_up_flag的值。如果这两个语法元素有一个为真,说明该CTU块使用了参数融合模式,其 SAO参数信息根据融合块就可得到;否则,该CTU块使用了非参数融合模式,此时可根据相应描述子分别提取出亮度和色度分量的补偿类型、补偿值、边带序号等SAO参数信息用于后续补偿。
SAO语义:
1.sao_merge_left_flag:
该语法元素代表当前CTU块的SAO参数信息是否与左侧相邻块进行了融合,取值为0或1。
当等于1时,表示当前 CTU块的 SAO 信息,即语法元素 sao_type_idx_luma, sao_type_idx_chroma, sao_band_position, sao_eo_class_luma, sao_eo_class_chroma,sao_offset_abs 以及 sao_offset_sign 的值是根据左侧 CTU 块的相应语法元素得到的;当该值等于0时,表示以上构成SAO信息的语法元素的值不是从左侧 CTU 得到的。其默认值为 0。
2.sao_merge_up_flag:
该语法元素代表当前CTU块的SA参数信息是否与上侧相邻块进行了融合,取值为0或1。
当等于1时,表示当前 CTU的SAO 信息,即语法元素 sao_type_idx_luma, sao_type_idx_ chroma, sao_band_position,sao_eo_class_luma, sao_eo_class_chroma,sao_offset_abs 以及sao_ offset_sign的值是根据上侧 CTU相应语法元素得到的;当该值等于0时,表示以上构成SAO信息的语法元素的值不是从上侧CTU 得到的。其默认值为0。
3.sao_type_idx_luma:
该语法元素代表亮度分量的补偿类型。数组SaoTypeldx[cIdx][rx][ry]表示色彩分量为cldx且位置为(rx,ry)处的CTB块的补偿类型,该变量取值为0时,表示不补偿;该变量取值为1时,表示边带补偿;该变量取值为2时,表示边界补偿。亮度分量的补偿类型,即数组SaoTypeldx[0][rx][ry]的值由以下步骤得到。
如果 sao_type_idx_luma存在,则将其赋给 SaoTypeldx[0][rx][ry]。
否则,进行以下步骤。
若sao_merge_leffag=l,则将 SaoTypeldx[0][rx-1][ry]的值赋给SaoTypeldx[0][rx][ry]。
否则,若sao_merge_up_fag-1,则将 SaoTypeldx[0][rx][ry-1]的值赋给 SaoTypeldx[0][rx][ry]。
否则,将 SaoTypeldx[0][rx][ry]设置为 0。
4.sao_type_idx_chroma:
该语法元素代表色度分量的补偿类型。色度分量的补偿类型,即数组 SaoTypeldx[cIdx][rx][ry]的值(cIdx=1,2)由以下步骤得到。
如果 sao_type_idx_chroma 存在,则将其赋给 SaoTypeldx[cIdx][rx][ry]。
否则,进行以下步骤。
若sao_merge_leftflag=1,则将 SaoTypeldx[0][rx-1][ry]的值赋给SaoTypeldx[cIdx][rx][ry].
否则,若sao_merge_up_flag=1,将SaoTypeldx[0][rx][ry-1]的值赋给
SaoTypeldx[cIdx][rx][ry]。
否则,将 SaoTypeldx[cldx][rx][ry]设置为0。
5. sao_offset_abs[cIdx][rx][ry][i]:
该语法元素表示色彩分量为Idx,位置为(x,y)的CTB,它的第i个种类的补偿值。当其不存在时,通过以下步骤得到。
若sao_merge_left_flag=l,则将sao_ofset _abs[cIdx][rx-1][ry][i]的值赋给 sao offset abs[cldx][rx][ry][i]。
否则,若sao_merge_up_flag=l,则将sao offset abs[cldx][rx][ry-1][i]的值赋给 sao_offset_abs[cldx][rx][ry][i]。
否则,将其设为0。
6.sao_offset_sign[cldx][rx][ry][i]:
当 SaoTypeldx[cldx][rx][ry]=1,即边带补偿时,该值代表了色彩分量为Idx,位置为(rx,y)的CTB,它的第i个补偿值的符号。
当该值不存在,通过以下方式获得。
若sao_merge_left flag=l,则将sao_offset _sign[cldx][rx-1][ry][]的值赋给 sao offset sign[cldx][rx][ry][i]。
否则,若sao_merge_up_flag=1,则将 sao _ofset sign[cIdx][rx][ry-1][i]的值赋给它。
否则,将其置 0。
7. sao_band_position[cIdx][rx][ry]:
该语法元素代表了进行边带补偿的最小边带位置。当其不存在时,通过以下步骤获得。
若sao_merge_left_flag=1,
则将 sao_band_position[cIdx][rx-1][ry]赋给 sao_band_position[cIdx][rx][ry]。
否则,若sao_merge_up_flag=1,则将sao_band position[cIdx][rx][ry-1]赋给它。
否则,将其置 0。
8.sao_eo_class_luma:
该语法元素代表了亮度分量的边界补偿模式。数组SaoEoClass[cldx][rx][ry]表示了色彩分量为 cdx,在位置(rx,ry)处的CTB 的补偿类型。SaoEoClass[0][rx][ry]通过以下步骤得到。
如果 sao_eo_class_luma存在,则将其值赋给 SaoEoClass[0][rx][ry].
否则,进行以下步骤。
若sao_merge_left_flag=1,则将 SaoEoClass[0][rx-1][ry]的值赋给SaoEoClass[0][rx][ry]。
否则,若sao_merge_up_flag1,则将 SaoEoClass[0][rx][ry-1]的值赋给 SaoEoClass[0][rx][ry]。
否则,将其设置为 0。
9.sao_eo_class_chroma:
该语法元素代表了色度分量的边界补偿模式。SaoEoClass[cIdx][rx][ry]的值(cIdx=1,2)通过以下步骤得到。
如果 sao_eo_class_chroma存在,则将其值赋给 SaoEoClass[cIdx][rx][ry]。
否则,进行以下步骤。
若 sao_merge_left_flag-1,则将 SaoEoClass[cIdx][rx-1][ry]的值赋给SaoEoClass[cldx][rx][ry]。
否则,若sao_merge_up_flag=1,则将 SaoEoClass[cldx][rx][ry-1]的值赋给 SaoEoClass[cIdx][rx][ry]。
否则,将其设置为0。
SPS 级 SAO 语义:
sample_adaptive_offset_enabled flag:该语法元素标识是否采用 SAO补偿技术。当该值取1时,表示使用;该值取0时,表示不使用。
PPS 级 SAO 语义:
loop_filter_across_tiles_enabled_flag:该语法元素用于标识在 tile的边界处是否执行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示执行;取值为0时,表示不执行。
pps_loop_filter_across_slices_enabled_flag:该语法元素用于标识在Slice 的左边界以及上边界处是否执行环路滤波操作。当取值为1时,表示执行;取值为0时,表示不执行。
Slice 级 SAO 语义:
slice_sao_luma_flag:该语法元素标识当前 Slice的亮度分量是否允许进行SAO操作。当取值为1时,表示允许进行SAO:取值为0时,表示不允许进行SAO。当该语法元素未出现时,默认其值为0。
slice_sao_chroma_flag:该语法元素标识当前Slice的色度分量是否允许进行 SAO操作。当取值为1时,表示允许进行SAO;取值为0时,表示不允许进行SAO。当该语法元素未出现时,默认其值为0。
slice_loop_filter_across_slices_enabled_flag:该语法元素标识当前Slice 的左边界及上边界是否进行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示可能进行(具体情况要根据后续条件判断);取值为0时,不进行环路滤波。当该语法元素未出现时,其值等于pps_loop_ filter_across_slices_enabled_flag 的值。
参考资料:
《新一代高效视频编码 H.265/HEVC 原理、标准与实现》——万帅 杨付正 编著