VVC環路濾波(一):ALF

在VTM5中提供了三種環路濾波技術:去方塊濾波(Deblocking filter,DF),樣點自適應補償(Sample adaptive offset,SAO)和自適應環路濾波(adaptive loop fitler,ALF)。在VTM5中這些濾波工具的使用順序爲DF,SAO,ALF。

VTM5中的DF和SAO與HEVC中的類似,ALF是VTM5中新增的技術。本文主要介紹ALF。

ALF

自適應環路濾波(adaptive loop fitler,ALF)是VTM5中新增的技術。是基於塊的濾波技術,它作用於4x4的子塊,對於每個4x4的子塊需要將其歸爲25個類別之一,然後根據類別爲其選擇濾波器。

1、濾波器形狀

 

VTM5提供了兩種菱形濾波器,如上圖所示。左邊5x5的菱形濾波器用於色度分量,右邊7x7的菱形濾波器用於亮度分量。

enum AlfFilterType
{
  ALF_FILTER_5,
  ALF_FILTER_7,
  ALF_NUM_OF_FILTER_TYPES
};

2、塊分類

對於亮度分量需要爲每個4x4的子塊分類,共25個類別。類別C由塊的方向D和活動性A決定:

C = 5D + A

爲了計算D和A,需要計算子塊的水平、垂直、兩個對角線方向的梯度,梯度計算使用1維拉普拉斯方法實現:

 

爲了減少計算複雜度在計算梯度前進行下采樣,如下圖:

 

得到梯度後D和A的計算方法如下:

 

對於色度分量不需要對其子塊進行分類操作,它只有一個濾波器。

3、濾波器係數和門限值幾何變換

由上一步可以得到濾波器,但是在濾波操作前需要對濾波器係數和相應門限值進行幾何變換,包括旋轉、對角和垂直翻轉。變換類型由上面計算的塊的梯度決定。對濾波器進行幾何變換效果等價於對濾波區域進行相應幾何變換,這麼做的目的是使不同塊方向對齊。

 

    
  if( filtType == ALF_FILTER_7 )
      {
        if( transposeIdx == 1 )
        {//!<對角線變換
          filterCoeff = { coef[9], coef[4], coef[10], coef[8], coef[1], coef[5], coef[11], coef[7], coef[3], coef[0], coef[2], coef[6], coef[12] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[9], clip[4], clip[10], clip[8], clip[1], clip[5], clip[11], clip[7], clip[3], clip[0], clip[2], clip[6], clip[12] };
#endif
        }
        else if( transposeIdx == 2 )
        {//!<垂直翻轉
          filterCoeff = { coef[0], coef[3], coef[2], coef[1], coef[8], coef[7], coef[6], coef[5], coef[4], coef[9], coef[10], coef[11], coef[12] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[0], clip[3], clip[2], clip[1], clip[8], clip[7], clip[6], clip[5], clip[4], clip[9], clip[10], clip[11], clip[12] };
#endif
        }
        else if( transposeIdx == 3 )
        {//!<旋轉變換
          filterCoeff = { coef[9], coef[8], coef[10], coef[4], coef[3], coef[7], coef[11], coef[5], coef[1], coef[0], coef[2], coef[6], coef[12] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[9], clip[8], clip[10], clip[4], clip[3], clip[7], clip[11], clip[5], clip[1], clip[0], clip[2], clip[6], clip[12] };
#endif
        }
        else
        {//!<不變換
          filterCoeff = { coef[0], coef[1], coef[2], coef[3], coef[4], coef[5], coef[6], coef[7], coef[8], coef[9], coef[10], coef[11], coef[12] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[0], clip[1], clip[2], clip[3], clip[4], clip[5], clip[6], clip[7], clip[8], clip[9], clip[10], clip[11], clip[12] };
#endif
        }
      }
      else
      {
        if( transposeIdx == 1 )
        {//!<對角線變換
          filterCoeff = { coef[4], coef[1], coef[5], coef[3], coef[0], coef[2], coef[6] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[4], clip[1], clip[5], clip[3], clip[0], clip[2], clip[6] };
#endif
        }
        else if( transposeIdx == 2 )
        {//!<垂直翻轉
          filterCoeff = { coef[0], coef[3], coef[2], coef[1], coef[4], coef[5], coef[6] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[0], clip[3], clip[2], clip[1], clip[4], clip[5], clip[6] };
#endif
        }
        else if( transposeIdx == 3 )
        {//!<旋轉變換
          filterCoeff = { coef[4], coef[3], coef[5], coef[1], coef[0], coef[2], coef[6] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[4], clip[3], clip[5], clip[1], clip[0], clip[2], clip[6] };
#endif
        }
        else
        {//!<不變換
          filterCoeff = { coef[0], coef[1], coef[2], coef[3], coef[4], coef[5], coef[6] };
#if JVET_N0242_NON_LINEAR_ALF
          filterClipp = { clip[0], clip[1], clip[2], clip[3], clip[4], clip[5], clip[6] };
#endif
        }

採用的幾何變換方式由上面計算的四個方向的梯度決定:

 

   
   int hv1, hv0, d1, d0, hvd1, hvd0;
​
      if( sumV > sumH )
      {
        hv1 = sumV;
        hv0 = sumH;
        dirTempHV = 1;
      }
      else
      {
        hv1 = sumH;
        hv0 = sumV;
        dirTempHV = 3;
      }
      if( sumD0 > sumD1 )
      {
        d1 = sumD0;
        d0 = sumD1;
        dirTempD = 0;
      }
      else
      {
        d1 = sumD1;
        d0 = sumD0;
        dirTempD = 2;
      }
      if( d1*hv0 > hv1*d0 )
      {
        hvd1 = d1;
        hvd0 = d0;
        mainDirection = dirTempD;
        secondaryDirection = dirTempHV;
      }
      else
      {
        hvd1 = hv1;
        hvd0 = hv0;
        mainDirection = dirTempHV;
        secondaryDirection = dirTempD;
      }
​
      int directionStrength = 0;
      if( hvd1 > 2 * hvd0 )
      {
        directionStrength = 1;
      }
      if( hvd1 * 2 > 9 * hvd0 )
      {
        directionStrength = 2;
      }
​
      if( directionStrength )
      {
        classIdx += ( ( ( mainDirection & 0x1 ) << 1 ) + directionStrength ) * 5;
      }
      //!<幾何變換索引計算
      static const int transposeTable[8] = { 0, 1, 0, 2, 2, 3, 1, 3 };
      int transposeIdx = transposeTable[mainDirection * 2 + ( secondaryDirection >> 1 )];

4、濾波器參數傳輸

在VTM5中,ALF濾波器參數在Adaptation Parameter Set (APS)中。在一個APS中,有至多25組亮度濾波器參數和門限值,及至多1組色度濾波器參數和門限值。爲了減少比特開銷,不同類別的濾波器參數可以merge。當前slice使用的APS索引在slice header中。

APS中可以解碼出門限值索引,通過門限值索引可以從亮度門限值列表和色度門限值列表中指定所需的門限值。門限值列表由位深決定:

 

濾波過程可以在CTB級進行控制,可以傳輸一個標誌位表示是否需要對一個亮度CTB進行ALF濾波。一個亮度CTB使用的濾波器可以從16個固定濾波器和APS提供的濾波器中選擇。有一個濾波器索引表示最終使用的濾波器。16個固定濾波器是預定義好的,硬編碼進編碼器和解碼器了。

濾波器參數被量化成均值爲128。爲了減少乘法的複雜性,需要對碼流進行一致性處理以使非中心位置的參數在[-128,127]間。中心位置的參數不需要傳輸,默認等於128。

5、濾波操作

 

感興趣的請關注微信公衆號Video Coding

 

發佈了97 篇原創文章 · 獲贊 174 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章