【HEVC简介】ALF-Adative Loop Filter

由于HEVC在HM4.0之后,就把ALF去掉,所以ALF的介绍是基于AVS2.
《HEVC标准介绍、HEVC帧间预测论文笔记》系列博客,目录见:http://www.cnblogs.com/DwyaneTalk/p/5711333.html
 
一、基本流程:
 1、算法描述: 

        自适应环路滤波器f 是根据原始信号和失真信号计算得到均方意义下的最优滤波器,即维纳滤波器,如公式(2-1)所示,                         

        其中,Y是失真信号,X是原始信号,是滤波后估计得信号,f是自适应滤波器系数向量,使得滤波信号和原始信号X之间均方误差(MSE)最小,如图1所示。

                       

1:ALF滤波器

        本提案提出的ALF在视频编码框架中的位置如下图所示,即对SAO滤波后的重建图像进行恢复,使得重建图像与原始图像的MSE最小                        

2:ALF在AVS2中的位置

2、滤波器形状和系数决策

       本提案对彩色图像的亮度和色度通道均采用如图3所示的7x7十字加3x3方形的中心对称滤波器,每个滤波器只包含9个不同的系数,其中C0~C7是7bit有符号数,取值范围是[-1,1),C8是7bit无符号数,取值范围是[0,2)(注:C0~C8的范围后面提案中被修改)。                              

3:ALF滤波器形状

        对于亮度分量,ALF将图像按照固定规则分为16个区域,按照LCU对齐的原则均匀划分16个区域(图像右边界和下边界除外),对每个区域分别计算其对应的ALF系数。对训练得到的ALF系数(这个过程就是维纳滤波器的原理),依次计算相邻区域(按照类Hilbert扫描序号上相邻的区域,如图4所示)合并后得到的率失真代价,选择率失真代价最小的区域进行合并,该过程迭代直到合并为一套滤波器为止,从中选择率失真代价最小的合并结果,合并的区域共用相同的滤波系数。对于色度分量(Cb和Cr)分别设计一套滤波系数。对每个分量提供滤波器控制开关,根据率失真代价决定当前图像分量是否进行滤波。为了更细粒度的控制滤波过程,我们对每个LCU的三个颜色分量分别建立控制开关,用1个比特标识,如果当前LCU滤波后的率失真性能优于滤波前,则标识为1,表示对该LCU进行滤波。                           

    

4:类Hilbert扫描方式

        为了降低编码ALF参数带来的码率增加,我们提出在编解码端建立ALF参数缓存,缓存最大可以支持8组ALF参数(后面提案改成1组)。在编码端,分别计算当前训练的ALF参数和缓存中ALF参数率失真代价,选择率失真代价最小的作为当前图像的自适应滤波器参数,如果缓存中ALF参数率失真代价小,那么只需传递缓存中滤波器的索引值即可。

 

3、低延迟模式(LL)和高效模式(HE)

        考虑到利用当前编码帧训练ALF参数会造成编码延迟,因此,本提案提出利用相邻已经编码重构的图像进行ALF参数训练,从而降低编码延迟,我们称这种模式为低延迟模式(LL,而将利用当前编码重构图像训练ALF参数的方式成为高效模式(HE)如图5所示。                           

5:(a)低延迟ALF参数训练和(b)高效ALF参数训练

4、实验结果

        本部分对提出的LL和HE两种配置的ALF滤波器分别进行验证。Anchor是RD6.0,配置是通测条件[1],两种配置的测试结果分别如表1和2所示。

1:所提方案在LL配置下与RD6.0 anchor的性能比较  

2:所提方案在HE配置下与RD6.0 anchor的性能比较                        

5、结论

        本提案为AVS2设计了自适应环路滤波器,在HE和LL配置下均获得了较高的编码性能增益,编码复杂度的提升在可接受范围内。所以被AVS工作组采纳,并集成到参考软件RD7.0中,其中LL和HE都集成实现,并通过代码中的开关进行选择。

 

二、ALF语法格式说明:

1、序列头定义

序列头定义

描述符

sequence_header() {

 

    video_sequence_start_code

f(32)

    profile_id

u(8)

    level_id

u(8)

    ……    other syntax

 

 

    sample_adaptive_offset_enable

u(1)

    adaptive_loop_filter_enable

u(1)

    pmvr_enable

u(1)

    reserved_bits

r(3)

    next_start_code()

 

}

 

2、I帧图像头定义

I图像头定义

描述符

i_picture_header() {

 
     ……other syntax
 

    loop_filter_disable

u(1)

    if ( ! loop_filter_disable) {

 

        loop_filter_parameter_flag

u(1)

       if ( loop_filter_parameter_flag) {

 

           alpha_c_offset

se(v)

           beta_offset

se(v)

         }

 

    }

 

   if (AlfEnableFlag) {

 

         for ( i=0; i<3; i++ ) {

 

             pic_alf_enable[i]

u(1)

         }

 

         if(PicAlfEnableFlag[0]|| PicAlfEnableFlag[1]|| PicAlfEnableFlag[2])

 

         {

 

                alf_parameter_set_new_flag

u(1)

                alf_parameter_set_id (这两个参数在后面提案中有修改)

u(3)

          }
 

          if(alf_parameter_set_new_flag)

 

           {

 

                  alf_parameter_set()

 

              }

 

       }

 

      next_start_code()

 

}

 

3、 P、B、F帧图像头定义

PBF图像头定义

描述符

pbf_picture_header() {
 
      ……other syntax
 

     loop_filter_disable

u(1)

      if ( ! loop_filter_disable) {

 

          loop_filter_parameter_flag

u(1)

         if ( loop_filter_parameter_flag) {

 

               alpha_c_offset

se(v)

               beta_offset

se(v)

          }

 

      }

 

      if (AlfEnableFlag) {

 

             for ( i=0; i<3; i++ ) {

 

                   pic_alf_enable[i]

u(1)

            }

 

           if(PicAlfEnableFlag [0]|| PicAlfEnableFlag [1]|| PicAlfEnableFlag [2])

 

           {

 

                    alf_parameter_set_new_flag

u(1)

                    alf_parameter_set_id

u(3)

             }

 

if(alf_parameter_set_new_flag)

 

{

 

   alf_parameter_set()

 

}

 

next_start_code()

 

}

 

4、条带定义

条带定义

描述符

slice() {

 
……other syntax
 

while ( ! byte_aligned() )

 

      aec_byte_alignment_bit

f(1)

do {

 

     for ( i=0; i<3; i++ ) {

 

         if(PicAlfEnableFlag [i])

 

           lcu_alf_enable[i][LcuIndex]

u(1)

     }

 

     coding_unit_tree(LcuSizeInBit, LcuIndex)

 

     aec_lcu_stuffing_bit

ae(v)

} while ( ! is_end_of_slice() )

 

next_start_code()

 

}

 

 5、自适应环路滤波参数 

自适应环路滤波参数定义

描述符

alf_parameter_set () {

 

   if(PicAlfEnableFlag [0]){

 

     alf_no_filters_minus1

u(4)

for(i=0;i<alf_no_filters_minus1+1;i++){

 

      if(i>0)

 

        alf_region_distance[i]

u(4)

      for(j=0;j<9;j++)

 

        alf_coeff_luma[i][j]

ae(v)

}

 

}

 

if(PicAlfEnableFlag [1]){

 

    for(j=0;j<9;j++)

 

        alf_coeff_chroma[0][j]

ae(v)

}

 

if(PicAlfEnableFlag [2]){

 

       for(j=0;j<9;j++)

 

          alf_coeff_chroma[1][j]

ae(v)

}

 

}

 

6、语义说明

         自适应滤波允许标志  adaptive_loop_filter_enable。值为‘1’表示可使用自适应滤波;值为‘0’表示不应使用自适应滤波。AlfEnableFlag的值等于adaptive_loop_filter_enable的值。

        图像自适应滤波允许标志  pic_alf_enable[i]。PicAlfEnableFlag的值等于pic_alf_enable的值。PicAlfEnableFlag [i]的值为1表示在该图像内第i个分量可使用自适应滤波;值为0则表示在该图像内第i个分量不应使用自适应滤波。其中i等于0表示亮度分量,i等于1表示Cb分量,i等于2表示Cr分量。

        自适应滤波参数集标号  alf_paramter_set_id。3位无符号整数,表示当前图像自适应滤波参数集的标号。

        自适应环路滤波参数集解码标志  alf_parameter_set_new_flag。值为‘1’表示当前图像存在aps解码过程;值为‘0’表示当前图像不存在aps解码过程。

        LCU自适应滤波允许标志  lcu_alf_enable[i][LcuIndex]。lcu_alf_enable[i] [LcuIndex]值为1表示第LcuIndex个LCU的第i个颜色分量可使用自适应滤波;值为0则表示第LcuIndex个LCU的第i个颜色分量不使用自适应滤波。其中i等于0表示亮度分量,i等于1表示Cb分量,i等于2表示Cr分量。 

        图像亮度分量自适应滤波个数  alf_no_filters_minus1。alf_no_filters_minus1加1表示当前图像亮度分量自适应滤波器个数。 

        图像亮度分量相邻自适应滤波器间区域个数  alf_region_distance。alf_region_distance[i]表示亮度分量第i个自适应滤波器与第i-1个自适应滤波器之间区域标号的差值。

        图像亮度分量自适应滤波系数alf_coeff_luma。alf_coeff_luma[i][j] 表示亮度分量第i个自适应滤波器的第j个系数。

        图像分量自适应滤波系数  alf_coeff_chroma。alf_coeff_chroma[0][j] 表示Cb分量第j个自适应滤波器系数,alf_coeff_chroma[1][j] 表示Cr分量第j个自适应滤波器系数。

三、解码过程:

     sequence_header中ALF语法元素adaptive_loop_filter

        如果adaptive_loop_filter_enable为0,则SAO的输出样本直接作为ALF的输出样本。

        如果adaptive_loop_filter_enable为1,则根据6.2中定义的过程对SAO输出样本进行自适应环路滤波处理

    Picture header中ALF语法元素解码

        解码pic_alf_enable[3]语法元素,其中pic_alf_enable[0]表示亮度分量是否进行ALF滤波处理,如果pic_alf_enble[0]为1表示亮度分量进行ALF处理,否则亮度分量不进行ALF处理。pic_alf_enable[1]和pic_alf_enable[2]分别表示色度分量Cb和Cr是否进行ALF处理。将pic_alf_enable[i]的值分别赋给PicAlfEnableFlag。

    滤波器参数标识解码

        如果PicAlfEnableFlag[0]~[3]不同时为0,即存在需要进行滤波处理的图像分量。那么依次解码alf_parameter_set_new_flag和alf_parameter_set_id。

        如果alf_parameter_set_new_flag为1,则将6.2.3中解码得到的滤波器系数保存到alf_parameter_set_id所指示的缓存区中。

        如果alf_parameter_set_new_flag为0,则跳过6.2.3解码过程,从alf_parameter_set_id所指示的缓存区中读取ALF滤波器系数。

    滤波器系数解码

        如果PicAlfEnableFlag[0]为1,则解码alf_no_filters_minus1语法元素,alf_no_filters_minus1+1 表示亮度分量滤波器个数。

        解码每组滤波器系数控制的相邻基本区域的数量或者相邻滤波器系数控制区域的距离alf_region_distance[i](i>0)(如果将16个划分区域记做基本区域单元,那么这里的滤波器系数控制区域的距离可以表示为两个区域中的基本单元个数)。例如alf_region_distance[1]=2 表示第0组滤波器系数和第1组滤波器系数之间的距离2个基本单元,也就是第0组滤波器控制2个基本区域单元。如果存在4组滤波器,其中alf_region_distance[1]=4,alf_region_distance[2]=5,alf_region_distance[3]=2,其中第0组控制0-3的基本区域,第1组控制4-8的基本区域,第2组控制9-10的基本区域,第3组控制11-15的基本区域。

        解码亮度分量滤波器系数alf_coeffluma[i][j]表示亮度分量中第i组滤波器的第j个系数。

        如果PicAlfEnableFlag[1]为1,则解码色度Cb分量对应的滤波器系数,其中alf_coeff_chroma[0][j]表示Cb分量滤波器系数的第j个系数。否则跳过色度Cb分量滤波器系数解码。

        如果PicAlfEnableFlag[2]为1,则解码色度Cr分量对应的滤波器系数,其中alf_coeff_chroma[0][j]表示Cb分量滤波器系数的第j个系数。否则跳过色度Cb分量滤波器系数解码。

    系数重构

        亮度分量和色度分量的最后一个系数,即如图6所示的C8,alf_coeffluma[i][AlfCodedLengthLuma-1]和alf_coeff_chroma[g][AlfCodedLengthChroma-1]的重构值通过如下过程得到(以亮度为例),

              #define ALF_NUM_BIT_SHIFT 6(对于这个6的处理,后面提案对C0-C7和C8有了重新的修改)

              sum = 0;

              for(j=0; j< AlfCodedLengthLuma -1; j++)

              {

                     sum += (2 * alf_coeffluma[i][j]);

              }

              coeffPred = (1<<ALF_NUM_BIT_SHIFT) - sum;

              alf_coeffluma[i][AlfCodedLengthLuma-1]=coeffPred+ alf_coeffluma[i][AlfCodedLengthLuma-1][ AlfCodedLengthLuma-1];                                   

图6 滤波器形状和系数标号

    LCU控制语法元素

            如果PicAlfEnableFlag[i]为1,那么在读取每个LCU参数前首先读取其滤波器控制开关参数lcu_alf_enable[i],该变量为1表示对当前LCU进行6.2.6所指定的自适应环路滤波处理,否则跳过自适应环路滤波。

    LCU滤波过程

            如果LcuIndex所指示的LCU的滤波器控制开关lcu_alf_enable[i][LcuIndex]为1,那么对该LCU中第i个颜色分量进行滤波。对LCU中的每个样本进行滤波时,当且仅当滤波器所使用的样本都可用时才对该样本进行滤波,其中样本可用是指该样本存在且与当前滤波样本处于相同的slice内。

            对亮度分量中样本p(m,n)利用第i组滤波器进行滤波的计算过程如下:

p_tmp = alf_coeffluma[i][0]*(p(m-3,n) + p(m+3,n))

p_tmp = p_tmp +  alf_coeffluma[i][1]*(p(m-2,n) + p(m+2,n))

p_tmp = p_tmp +  alf_coeffluma[i][2]*(p(m-1,n-1) + p(m+1,n+1))

p_tmp = p_tmp +  alf_coeffluma[i][3]*(p(m-1,n) + p(m+1,n))

p_tmp = p_tmp +  alf_coeffluma[i][4]*(p(m-1,n+1) + p(m+1,n-1))

p_tmp = p_tmp +  alf_coeffluma[i][5]*(p(m,n-3) + p(m,n+3))

p_tmp = p_tmp +  alf_coeffluma[i][6]*(p(m,n-2) + p(m,n+2))

p_tmp = p_tmp +  alf_coeffluma[i][7]*(p(m,n-1) + p(m,n+1))

p_tmp = p_tmp +  alf_coeffluma[i][8]*(p(m,n))

p_tmp = (p_tmp +  alf_coeffluma[i][8])>>ALF_NUM_BIT_SHIFT

p(m,n) = max(0,min(p_tmp,255))

                        

图7 滤波样本

    滤波器参数缓存(关于缓存滤波器系数的个数,后面提案进行了修改

            滤波器缓存中包含的参数包括滤波器帧级控制开关pic_alf_enable[3],滤波器系数alf_coeffluma[alf_no_filters_minus1+1][AlfCodedLengthLuma]和alf_coeffChroma[2][AlfCodedLengthChroma]和滤波器控制区域参数alf_region_distance。

 

四、后续提案修改:

    1、ALF时域系数缓存核心实验提案:M3384 

            M3384.doc本提案对M3292提出的环路滤波器技术在RD7.0上进行了时域滤波器系数缓存的实验。原提案中支持8套时域滤波器系数缓存,本提案测试了关闭时域缓存和只保留一个时域缓存的滤波器性能。实验表明,关掉时域缓存时,相对于原有ALF技术AI、RA和LDP通测条件下分别有0.09%、0.17%和0.17%的性能损失;只保留一个时域缓存时,AI、RA和LDP通测条件下分别有0.00%、0.12%和0.09%的性能损失。为了保持滤波器灵活性,建议现有ALF中保留一个时域滤波器系数缓存。

        语法修改如下:alf_parameter_set_id由u(3)变成u(1),只需要1位就可以了。其它部分没有变化。        

    2、基于虚拟边界的自适应环路滤波:M3433(存在提案针对该提案进行的改进)

    ALF处于deblocking filter和SAO之后,在基于LCU的解码过程中,对于当前LCU进行ALF滤波时,该LCU下边界的N行像素(亮度4行像素,色度3行像素)需要等到下方的LCU解码重构后才能进行deblocking filter、SAO和ALF,因此需要缓存该对应行的像素,增加ALF后,需要再额外增加6行缓存像素,如图8所示。                                 

 8: AVS2中基于LCU解码过程中需要的line buffer示意图

        为了减少ALF技术产生的line buffer的增加,本提案提出采用虚拟边界技术,如果ALF滤波没有使用跨虚拟边界的像素时,那么滤波过程不变;如果ALF用到了跨虚拟边界的像素,那么需要将滤波器用到的跨虚拟边界像素对应的系数及其水平对称位置的系数作相对应的修改,使得滤波器不再使用对应的跨虚拟边界的像素及其水平对称位置的像素,从而避免了增加line buffer,如图2所示,虚线是LCU的虚拟边界。AVS2亮度分量中,deblocking filter需要3行line buffer,SAO需要1行line buffer,因此虚拟边界距离LCU亮度下边界4行像素;AVS2色度分量中,deblocking filter需要2行line buffer, SAO需要1行line buffer,因此虚拟边界距离LCU色度下边界3行像素。       

图9:滤波器形状跨越虚拟边界时具有虚拟边界的ALF滤波过程(亮度) 

            本提案提出采用虚拟边界对LCU内部进行ALF处理的像素进行限定,从而避免了M3292中ALF产生的line buffer。

    3、样本滤波补偿参数:M3466(这个修改在其他提案中,该提案是修改标准文档中相关说明)

        图像亮度分量样本滤波补偿滤波器系数  alf_coeff_luma[i][j]

                alf_coeff_luma[i][j]表示亮度分量第i个样本滤波补偿滤波器的第j个系数。当j大于或等于0且小于或等于7时,AlfCoeffLuma[i][j]的值等于alf_coeff_luma[i][j]的值。其中,j大于或等于0且小于或等于7时,alf_coeff_luma[i][j]为7位有符号数,取值范围是-64~63alf_coeff_luma[i][8]为12位有符号数取值范围是-1088~107。(权值取整数,避免浮点运算)

        图像色度分量样本滤波补偿滤波器系数  alf_coeff_chroma[0][j]和alf_coeff_chroma[1][j]

                alf_coeff_chroma[0][j]表示Cb分量第j个样本滤波补偿滤波器的系数,alf_coeff_chroma[1][j] 表示Cr分量第j个样本滤波补偿滤波器的系数。当j大于或等于0且小于或等于7时,AlfCoeffChma[0][j]的值等于alf_coeff_chroma[0][j]的值,AlfCoeffChma[1][j]的值等于alf_coeff_chroma[1][j]的值。其中,j大于或等于0且小于或等于7时,alf_coeff_chroma[i][j]为7位有符号数,取值范围是-64~63;alf_coeff_chroma[i][8]为12位有无符号数,取值范围是-1088~107。解码过程对应更改。

    4、基于虚拟边界的自适应环路滤波:M3493(是对M3433的改进)                       M3493.doc

图10:滤波器形状跨越虚拟边界时具有虚拟边界的ALF滤波过程(亮度)

     如上图10,该提案的修改主要就是对于虚拟边界情况时,对于C0'、C1'等值不再是简单地置0,而是赋值为其他没有越过虚拟边界的像素点的值。 

High Efficiency Video Coding (HEVC) Adaptive Loop Filter.pdf

posted @ 2016-07-28 15:37  DwyaneTalk  阅读(...)  评论(... 编辑 收藏