0、环路滤波器与ALF简介

VTM6.0中总共有三个环路滤波器。除了HEVC中就有的去块滤波器(DBF)和样点自适应补偿(SAO),还采用了自适应环路滤波器(ALF)。 VTM6.0中滤波过程的顺序是:DBF >> SAO >> ALF。在VTM6.0中,SAO和DBF与HEVC中的过程几乎相同,可参考万老师书籍。从VTM5.0开始,添加了一个新过程:带有色度缩放的亮度映射(the luma mapping with chroma scaling ,此过程以前称为自适应环路整形器),此新过程在DBF之前执行。

所谓ALF,简单来说就是根据局部梯度的方向和活动,对于亮度分量的每个4×4块选择25个滤波器之一,而对于色度分量只采用1个。

1、滤波器形状

在VTM6.0中,使用了如图两种菱形滤波器。色度分量采用5×5菱形滤波器滤波(如下图左),亮度分量采用7×7菱形滤波器滤波(如下图右),滤波系数大小关系也如图。
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)

2、块的分类

2.1 对于亮度分量

每个4x4的块最终会归为25类中的一个。选择25类中的哪一个,是基于其方向性D活动值A的量化值计算得出的。

2.1.1 求四个方向的梯度

为了计算D和A,首先需要使用一维拉普拉斯计算4个梯度值,分别是水平gv、垂直gh,两个对角线gd1、gd2四个方向的梯度,如下算式:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
其中索引i和j指4×4块内左上样本的坐标,而R(i,j)表示在坐标(i,j)处的重构样本值。

2.1.2 下采样

为了降低块分类的复杂性,应用了二次采样的一维拉普拉斯算法。如下面四张图所示,对四种梯度的计算都采样相同的下采样位置。下采样位置如下图:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)

2.1.3 比较梯度最值与阈值大小,得到D

然后将水平和垂直方向和两个对角线方向的梯度的最大值和最小值分别设置为:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
为了得出方向性D的值,将这些值相互比较,并使用两个阈值t1和t2:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)

2.1.4 通过梯度,得到A

活动值A的计算公式为
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
将A进一步量化为0到4的范围(包括端值),并将量化后的值表示为A。

2.1.5 得到分类索引

分类索引C是如下得到的(其中D =0,1,2,3,4,A=0,1,2,3,4,故C的取值为0到24,即25个分类索引)。
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)

2.2 对于色度分量

对于色度分量,不应用分类方法,即对每个色度分量应用单个ALF系数集。

3 几何变换

几何变换针对滤波器系数和滤波器限幅值,与梯度相关。作用是通过调整方向来使应用了ALF的不同块更加相似。
具体的,在对每个4×4亮度块进行滤波之前,根据为其计算得出的梯度值,将几何变换应用于滤波器系数f(k,l)和相应的滤波器限幅值c(k,l)。这里引入了三种几何变换:对角线变换、垂直翻转、旋转,如下公式所示。这相当于将这些变换应用于ALF覆盖区域的像素样本。
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
其中K是滤波器的大小k和l是系数坐标,其中0≤ k,l ≤K-1;坐标(0,0)在左上角,(K-1,K-1)在右下角。根据为该块计算的梯度值,将变换应用于f(k,l)c(k,l)。下表总结了变换与四个方向的四个梯度之间的关系。
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)

4 滤波信号

4.1 滤波参数

ALF滤波参数在自适应参数集APS中发出信号。在每个APS中,最多可以发信号通知25组亮度和最多8组色度滤波器参数(但现在色度只用一种),后面我们知道一共有7个APS。为了减少比特数,可以合并亮度分量不同分类的滤波器参数。在Slice头中,用信号发送用于当前Slice的APS的索引。

4.2 滤波限幅值

限幅值也是从解析APS中得到,通过两个表(亮度表和色度表)查找得出。这些限幅值取决于内部比特深度。而限幅值亮度表和色度表来源于以下公式:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
其中,B为比特深度,N是VTM6.0中允许的限幅值的数量,等于4。

4.3 亮度分量滤波系数信号

Slice级别上:在Slice头中,最多可以发信号通知7个APS索引,以指定用于当前slice的亮度滤波器是哪个。
CTB级别上:可以通过一个始终会发出的flag进一步控制滤波过程,这个flag用来指示是否将ALF应用于当前亮度CTB。亮度CTB可以从16个固定滤波器组和APS滤波器组中选择一个滤波器组,对亮度CTB,会用信号通知用的滤波器组索引。 所说的16个固定滤波器组在编码器和解码器中都是预定义和硬编码(pre-defined and hard-coded)的。

4.4 色度分量滤波系数信号

Slice级别上:在Slice头中用信号通知APS索引,以指示用于当前切片的色度过滤器集。
CTB级别上:如果APS中设置了多个色度滤波器,则会为每个色度CTB发出滤波索引信号。

4.5 滤波器系数

滤波器系数以等于128的范数进行量化。为了避免乘法的复杂度,应用了比特流一致性(bitstream conformance)使得非中心位置的系数值应在-27到27-1之间。而中心位置系数未在比特流中用信号发送,其值为128。

5 滤波过程

在解码端,当为CTB启用ALF时,对CU中的每个样本像素R(i,j)滤波,滤波结果为R’(i,j)。滤波公式:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
其中f(k,l)表示获取的的滤波器系数,c(k,l)表示获取的的限幅参数,K(x,y)= min(y,max(-y,x))是限幅函数,相当于函数Clip3(-y,y,x);而。变量k和I在-L/2到 L/2之间变化,其中L表示滤波器长度。

6 减少行缓冲区的虚拟边界过滤过程

在VTM6.0中,为减少ALF的行缓冲区要求,对水平CTU边界附近的样本采用了改进的块分类和滤波。为此,通过用“N”个样本移动水平CTU边界,将虚拟边界定义为一条线,如图,其中亮度分量的N等于4,色度分量的N等于2。
下图所示的是修改虚拟边界处的块分类:
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
对亮度分量应用了修改后的块分类。对于虚拟边界上方的4x4块的一维拉普拉斯梯度计算,仅使用虚拟边界上方的像素。类似地,对于虚拟边界以下的4x4块的一维拉普拉斯梯度计算,仅使用虚拟边界以下的样本。因此,通过考虑一维拉普拉斯梯度计算中使用的样本数量减少,可以对活动值A的量化进行缩放。
对于滤波处理,在虚拟边界处的对称填充操作用于亮度和色度分量。如下图所示,当要滤波的样本位于虚拟边界下方时,将填充位于虚拟边界上方的相邻样本。同时,另一侧的相应样本也被对称填充。
H.266/VVC代码学习39:自适应环路滤波器算法简介(ALF,翻译自JVET-O2002)
当禁用跨边界的slice,brick和tile边界时,该过程也适用。对于ALF块分类,仅使用相同slice,brick和tile中的样本,并相应地缩放活动值。对于ALF滤波,在水平和垂直方向分别对水平和垂直边界应用对称填充。

相关文章:

  • 2021-07-26
  • 2022-02-09
  • 2021-09-04
  • 2021-06-19
  • 2022-01-14
  • 2021-11-27
  • 2021-12-08
  • 2022-01-06
猜你喜欢
  • 2021-11-18
  • 2021-06-11
  • 2021-09-18
  • 2021-04-27
  • 2021-08-29
  • 2021-08-06
  • 2021-09-12
相关资源
相似解决方案