HEVC-环路滤波 之去块效应滤波

HEVC系列的目标:

1、对基本概念的进行了解,不深入公式推导当中。在学习进行之前存在的疑问,学习之后是不是都一一解决了?

2、在一段时间忘记相关概念的时候,是不是可以通过阅读之前的记录 最快的回忆起相关概念。

     环路滤波是什么?环路滤波在编解码框架的哪个部分?环路滤波是为了解决什么问题的?环路滤波用了哪些技术?环路滤波的流程是怎样的?

一、 环路滤波是什么?

    环路滤波顾名思义就是在环路上面对数据进行滤波操作,而所谓的滤波操作就是将数据乘上某一个权重数据。

二、环路滤波在编码框架的哪个部分?

    从解码端考虑,解码端用于帧间/帧内预测解码的数据 是熵解码 反变换 反量化之后的数据。而在编码端,帧间预测的数据是经过环路滤波处理的。这样做虽然增加了复杂度,同时还需要多传输滤波相关的比特数。 但是滤波后的数据用于参考 能够减少残差的数据,这样从整个编码系统看来 编码出来的比特数反而少了。

三、环路滤波是为了解决什么问题的?

   环路滤波主要是为了解决块效应和振铃现象而设置的模块。两个问题产生的原因不同,解决的方法也不一样。

  • 块效应和去块效应

    方块效应是指图像中编码块边界的不连续性。块效应是在环路滤波之前的模块引入的。

    1、变换量化过程中的TU分块导致的。

TU块中变换量化编码过程相互独立,引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续。

     2、预测编码PU分块导致。

在运动补偿预测过程中,相邻块的预测值可能来自于不同图像的不同位置,这样就会导致预测残差信号在块边界产生数值不连续。另外,时域预测技术使得参考图像中存在的边界不连续可能会传递到后续编码图像。

     解决块效应的方法 是加入一个去块效应模块,这个模块的作用是将块与块边界附近的像素进行平滑滤波处理。使得边界的不连续性不那么明显。

  • 振铃效应和样点自适应补偿

    振铃效应 是从量化过程中引入的,数据经过DCT变换、量化后,高频的信息产生失真。这些失真的信息经过解码恢复的时候就会在图像边缘周围产生波纹现象。

    SAO(样点自适应补偿)滤波就是为消除这种振铃效应而设计的。它通过对重建图像的分类,对每一类图像像素值加减一个偏移,达到减少失真的目的。在HEVC中包含了两种像素值补偿方法:边界补偿(Edge Offset,EO)以及边带补偿(Band Offset,BO)。在HEVC中SAO是以CTU为基本单位的。

四、环路滤波采用了哪些技术?

4.1 去块效应

    去块效应的最终目的是: 为了 不同的块边界自适应选择是否滤波及滤波强度,如对平滑区域处的不连续边界做强滤波处理,对纹理较丰富的区域弱滤.波乃至不滤波。

    去方块滤波模块的总体流程:首先图像分割成一个个8x8块,找8x8块的边界,包括水平和垂直,取边界两侧的4x4进行组合形成8x4(垂直)或者4x8(水平),边界就落在这8x4/4x8的块中间了。对这些8x4/4x8进行边界强度(BS),然后BS>0的时候进行计算滤波开关的决策计算,对于滤波打开的情况下进行滤波强度的计算,以得到边界的滤波强度(不滤波、弱滤波或强滤波)及滤波参数,在BS大于0而且滤波开关打开的情况下才进行滤波操作,即根据所选择的滤波强度及滤波参数对像素进行相应的修正。

     如下图BS>0是BS的计算过程,计算得到的BS大于0,进入式7-1就是一个滤波开关的决策过程,如果开关时开的情况下 进入滤波强度的决策。然后根据不同的滤波强度进行滤波处理。

HEVC-环路滤波 之去块效应滤波_第1张图片

  •  分块找边界 确定边界的处理顺序

    对图像进行分块的大小是8x8。TU和PU最小都是8x8,所以块滤波取这个大小是为了覆盖所有TU和PU的边界。而实际是将8x8块分成两部分独立进行去方块滤波处理,垂直边界以8x4为基本单位,水平边界以4x8为基本单位

HEVC-环路滤波 之去块效应滤波_第2张图片

  • 计算边界强度BS

    边界强度跟滤波强度是两个概念,边界强度间接影响滤波强度,边界强度( Boundary Strength, BS),其取值为0、1或2。

    亮度分量:

    边界强度值为0时,表示该边界不需要滤波,亮度分量边界强度值为1或2时,会进行后续模块处理,并且值会影响后续“滤波强弱选择”中的阈值。

    色度分量:

    边界强度值为0、1时,表示该边界不需要滤波,只有边界强度值为2时,才会对其进行滤波。

    计算流程:

    如下图。P\Q如前图所示,边界强度值在一定程度上反映了两个相邻块编码参数的一致性。 相邻块采用的编码参数越一致,那么BS就越小,边界的块效应就越小。

HEVC-环路滤波 之去块效应滤波_第3张图片

 

  • 确定边界是不是要进行滤波(滤波开关)

边界需不需要滤波的规则是 边界两边比较平滑但是边界处出现了差异,这个差异不能太大,太大就是图像边界而不是编码过程中引入的。如下图,

HEVC-环路滤波 之去块效应滤波_第4张图片

 

问题是该如何取衡量边界的差异,HEVC中是用8X4块中最上6个和最下6个像素进行计算得到的,计算的值称为纹理度。

HEVC-环路滤波 之去块效应滤波_第5张图片

 

HEVC-环路滤波 之去块效应滤波_第6张图片

            垂直块边界区域的纹理度定义为

Cb小于某个阈值时开启边界滤波,这个阈值通过边界两边块的QP值算出来的。

  • 确定边界是进行什么强度的滤波(滤波强度)

滤波强度也跟边界处的差异有关,差异越大需要越强的滤波,但不能超过一定范围。判断的方式如下

强滤波: 式(7-2) ~ (7-7) 均满足时,否则采用弱滤波。

其中式(7-2)和式(7-3) 用于判断边界两边像素值的变化率。

其中式(7-4)和式(7-5)用于判断边界两侧像素是否平坦。

其中式(7-6)和式(7-7) 用于判断在边界处像素的跨度是否控制在一定的范围内。 其中tc是判断的阈值,跟QP、 slice_tc_offset div2 (片级补偿值)以及前面计算到的QS有关。

 

HEVC-环路滤波 之去块效应滤波_第7张图片

 

  • 进行滤波操作

1、亮度分量强滤波

    强滤波会对边界两侧的像素进行大范围、大幅度的修正,边界像素p(m,n)和q(m,n)都要进行修正,m取值0,1,2,且n取值0,1,2。也就是对边界左右两边3个共6个像素进行修正。像素值的修正公式略。但是是跟前面tc有关 也就是其中跟QP、 slice_tc_offset div2 (片级补偿值)以及前面计算到的QS有关。

2、亮度分量弱滤波

    弱滤波操作中修正的像素范围及幅度较小,而且需要根据每一行像素的具体情况确定每行的滤波操作。一般情况下不修复或者只修复一个点。

3、色度分量滤波

    当获取边界强度模块判定BS=2时,色度分量需要进行滤波操作,色度滤波的过程跟边界左右两边4 共8个像素都有关系。

五、解码相关的语法

1. SPS级语法语义

       pcm_loop_filter_disabled_flag: 该语法元素用于说明对于一个编码单元CU,在pcm_ enabled_ flag 为1的条件下是否采用环路滤波技术,包括

去方块滤波以及像素自适应补偿。当该语法元素取值为1时,表示不使用;取值为0时,表示使用。

      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_ filter _disabled_ flag: 该语法元素表示在语法元素

    slice_ deblocking filter_ disabled_ flag 未出现的条件下,是否对各个Slice执行去方块滤波。当取值为1时不执行;取值为0时执行。默认值为0。

    pps beta_ offset_ div2& pps_ tc_ offset_ div2: 该语法元素表示去方块滤波参数p/2和tc/2的默认补偿值,该补偿值还可以在Slice的头部进行重载。其取值范围为[- 6,6],当该语法元素未出现时,认为其值为0。

2. 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和tc/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 的值。

六、总结

    块效应是编码块与块之间的预测,变换参数方法等不一样导致的块边界像素的不连续。 解决这个问题的方法是对边界周围的像素点进行滤波修正。滤波修正处理的是左右或者上下两个8x8之间的垂直和水平边界,实际计算的范围是边界周围8x8像素矩阵拆分成的两个4x8或者8x4像素矩阵。首先计算边界强度,边界强度跟边界周边两个4x4块采用的预测和变换的参数相关。计算得到边界强度后,对于边界强度大于0的,进一步判断是否需要滤波。是否需要滤波是通过边界像素的差异来决定的。如果是需要滤波的情况,还需继续判断是使用强滤波还是弱滤波。这一步的判断跟边界差异,QP,边界强度以及sps 中片级偿值 有关。最后就依照公式进行滤波像素修正。强滤波修正的范围比较大。

 

 

 

 

 

 

你可能感兴趣的:(编解码)