懒人李冰

记录我的生活、学习

H.264 Loop Filter Algorithm

本文将从去块滤波的引入原因出发,分析去块滤波的原理、强度、决策、实现,并给出一个具体的实例,最后会给出 x264 中关于 Deblock 的代码实现。

引入环路滤波的原因

在编码过程中,会因如下原因引入块效应:

  1. 每个宏块的变换、量化过程都是独立进行的,采用的量化参数不同,这就会引入量化误差,导致相邻块边界步连续。
  2. 在运动补偿中,相邻块的预测值可能来自不同图像的不同位置,导致预测残差信号在边界产生数值不连续。

环路滤波的引入,可以调整相邻宏块边缘上的像素值,降低不连续性,使其看起来更平滑。

环路滤波的介绍

下面给出两篇论文中,关于环路滤波部分的介绍:首先给出Overview of the H.264/AVC Video Coding Standard 中的K. In-Loop Deblocking Filter的介绍。我把它翻译成长中文如下。

基于块的编码的一个特殊特征是偶然产生可见的块结构。块边缘通常以低于内部像素的精度重建,块通常被认为是当前压缩方法中最明显的伪影之一。为此,H.264/AVC 定义了一种自适应的环路去块滤波器,其中滤波的强度由若干语法元素的值控制。有关自适应去块滤波器的详细说明,请参阅Adaptive deblocking filter;

图 16 给出了使用一维边缘的可视化的去块滤波器的原理。样本 p0 和 q0 以及 p1 和 q1 是否被滤波取决于使用的量化参数(QP)和量化阈值α(QP)和β(QP)。因此,仅当满足以下每个条件时,才进行 p0 和 q0 的滤波:
1. |p0 - q0 | < α(QP)
2. |p1 - p0 | < β(QP)
3. |q1 - q0 | < β(QP)
其中 β(QP) 比 α(QP) 小的多。如果满足相应的以下条件,则进行 p1 或 q1 的滤波: |p2 - p0| < β(QP) 或者 |q2 - q0| < β(QP)

基本思想是,如果测量块边缘附近的样本之间相对较大的绝对差,则很可能是块伪影,因此应减少。然而,如果该差异的幅度太大以致不能用编码中使用的量化的粗糙度来解释,则边缘更可能反映源图片的实际行为,并且不应被平滑。

块效应降低,而内容的锐化程度基本不变。因此,主观质量显著提高。滤波器通常将比特率降低 5%-10%,同时产生与未滤波视频相同的客观质量。