编解码技术:H264 - 去块效应滤波

我们知道现在的主流编码器都是使用基于块的混合编码框架,以编码块为单位进行预测、变换、量化。

这就导致不同的编码块会使用不同的编码参数,进而不同编码重建块之间的存在一定的差异,尤其在编码块边界处较为明显。编码块边界处不连续的现象就是块效应,产生这种效应的原因主要有两个:

  1. 预测时出现不准的地方称为残量(Residual),残量会利用离散余弦变换(Discrete Cosine Transform, DCT)做量化(Quantization),由于量化与反量化会产生误差,因此会在区块边界上产生视觉上的不连续。
  2. 运动补偿,同一个画面内相邻区块可能不是从前几个编码影像中相邻区块获取来做预测,因此造成不连续的现象。同样地,画面内预测的方式也可能会造成影像不连续。

这种现象在 QP 较大时比较明显,因此 QP 越大 Deblocking 的强度也越大。

正是由于这种块效应的存在,才需要添加环路滤波器调整相邻的块边缘上的像素值以减轻这种视觉上的不连续感。

去区块滤波器主要有三个工作,分别是边界强度计算(Boundary Strength Computation)、边界分析(Boundary Analysis)及滤波器应用(Filter Implementation)。

  1. 边界强度计算:主要是去计算边界强度(Boundary Strength, Bs)这个参数,边界强度呈现出相邻区块边界不连续的程度,而这个参数会跟量化的方式、区块类型、移动向量以及边界取样的梯度有关。
  2. 边界分析:因为区块边缘不连续的现象可能真的是对象边缘所产生,并非所谓的人造边界,这个工作主要在判断是否为人造边界。
  3. 滤波器的应用:做完前面两个工作可以决定边界强度以及判断是否真的为人造边界,这个工作主要对人造边界依造对应的边界强度选择该应用的滤波器。

边界强度

每一个 4x4 的亮度区块中需要做滤波的区块都会计算出一个边界强度。色度区块的边界强度是对亮度区块已经求得的边界强度做取样,如图所示:

色度区块的边界强度与亮度区块边界强度的关系

H.264 的边界强度 Bs 的判定方式如下:

条件(针对两边的图像块) Bs
若两个区块皆属于帧内预测且边界属于宏区块的边界 4
有一个块为帧内预测或是不在宏区块的边界上 3
区块的转换系数非 0 2
如果使用不同的参考影像或是两个区块间的移动向量大于等于 4 1
其它 0

《ITU-T Rec. H.264-200305》 8.7.2.1 亮度的依赖内容的边界滤波强度的推导过程

从上表得出边界强度的判断流程如图所示:

边界强度的判断流程

边界分析

并不是所有的块的边界处都需要环路滤波。例如画面中物体的边界正好和块的边界重合的话,就不能进行滤波,否则会使画面中物体的边界变模糊。因此需要区别开物体边界和块效应边界。一般情况下,物体边界两边的像素值差别很大,而块效应边界两边像素值差别比较小。

边界强度如果大于 0 则对这个边界进行分析,判断是否为人造边界。下图是利用水平滤波器对垂直边界做滤波的示意图,一行有八个点 p3、p2、p1、p0、q0、q1、q2 以及 q3,p0 及 q0 之间为两区块的边界。H.264 标准定义了 2 个变量 αβ 来判决边界是否需要进行环路滤波。只有满足下面条件的时候才能进行环路滤波::

描述一个 4x4 块横向或者纵向边界的样点的惯例
 Bs != 0
|p0 - q0| <α (IndexA)
|p1 - p0| <β (IndexA)
|q1 - q0| <β (IndexB)

简而言之,就是边界两边的两个点的像素值不能太大,即不能超过 α;边界一边的前两个点之间的像素值也不能太大,即不能超过 β。其中 αβ 是根据量化参数 QP 推算出来(具体方法不再记录)。总体说来 QP 越大,αβ 的值也越大,也就越容易触发环路滤波。由于 QP 越大表明压缩的程度越大,所以也可以得知高压缩比的情况下更需要进行环路滤波。

αβ 两个函数一般利用查表法计算值,而 IndexAIndexB 计算方式如下

IndexA = Min(Max(0,QP + OffsetA), 51)
IndexB = Min(Max(0,QP + OffsetB), 51)

其中 OffsetAOffsetB 为编码器的参数,QP 为量化参数(Quantization Parameter)。如果上面四个条件是都成立则 p0q0 之间的边界为人造边界。