分享

H.264/AVC 帧间预测

 印度阿三17 2019-08-20

在早前介绍MPEG-2的时候,就介绍过帧间预测,它是从过去编码后重构的相邻帧(参考帧)的样本,预测当前帧(待编码帧)样本的过程。这一过程分为三个步骤:

(1)在参考帧中,找出与待编码帧图块的最佳匹配块,所谓最佳匹配块,即这两个图块的差值最小。在数学上,通常用图块中样本值差值的绝对值,也即AE(absolute difference)来表示,进一步也可用SAE,也即绝对值误差之和来表示。在查找最佳匹配块时,会涉及一系列的搜索算法,这也是帧间预测的一个研究方向。

(2)找到最佳匹配块之后,就可以计算出移动矢量,它是帧间预测最重要的两个参数之一。

(3)另一个重要的参数,就是参考帧中的最佳匹配块,与待编码帧中对应的图块之间的差值,也即移动补偿量。

所以只要我们知道了移动矢量和补偿量,就可以根据参考帧,预测出当前帧。这样对于编码的好处就是,对于预测帧,我们只需要对移动矢量和补偿量进行编码,就可以消除时间方向的冗余。

这也就是MPEG-2和MPEG-1时,所讲的帧间预测的原理。那H.264/AVC又有何不同呢?就像在上一篇帧内预测里说的,H.264/AVC的大小可变的预测块,在帧间预测里同样可用。

  • (1)也就是移动补偿块的大小可变,

  • (2)而且移动矢量的计算精度,可以小到1/4像素,你没看错,是四分之一像素。

  • (3)而且更进一步,移动矢量也可由相邻块进行预测得到。

下面我们就围绕这三点进行展开。

1、移动补偿块的大小

同帧内预测一样,H.264的移动补偿块的大小,同样可以从16x16,小到4x4。但是要注意的是,对于每个宏块、宏块区、子宏块或子宏块区,都需要单独的移动矢量,而且每个移动矢量和分区方法(宏块的划分方法),都必须编码并加到压缩位流里,这样解码器才能正确解码。

所以虽然小的移动补偿块,可以产生比较好的补偿效果,但是移动补偿块越小,搜索最佳匹配块的计算量也越大,需要编码的移动矢量的数目和分区方法也越多。

所以在帧间预测的时候,并不是移动补偿块越小越好,因为我们需要在编码效率与编码质量上寻求一个平衡。所以在实际中,可以根据视频的内容来进选择。比如对于移动比较平缓的部分,使用比较大的补偿块,而对于移动比较剧烈、画面比较复杂、细节较多的部分,用比较小的补偿块。

2、 子像素移动矢量

就像上面说的,移动矢量的计算精度,可以小到1/4像素,这其实就是子像素移动矢量,子的意思是它不是一个整像素得到,而是利用多个像素进行插值得到。

为什么需要这样做呢?我们知道,通过采样得到的样本数是有限的,也就是说一幅图像的像素点是有限的,这也就是栅格图像的特点。这样就会产生,当图像分辨率确定之后,也就是采样的样本数确定后,样本与样本之间的差值随机也确定下来,有时候这个差值可能过大,达不到我们的计算精度。

这就要求在两个样本之间的位置,使用子像素这一概念,而它的样本值,则利用它附近的样本值,通过插值计算得到。

在这里插入图片描述
像素位置

如上图所示,图中空心圆(○)表示实际样本的位置,也就是原本采样的样本位置。图中的方块(口),表示两个样本中间的位置,也即1/2像素位置。三角形(△)则处于两个样本之间1/4的位置,称为1/4像素位置。

有时候,通过搜索插值样本,可以为当前图块,找到比较准确的移动矢量和移动补偿量,这就是子像素移动补偿。

通过子像素搜索最佳匹配图块的步骤如下:

在这里插入图片描述
移动估算

  • (1)第一步,肯定是去搜索整像素,也即原采样的样本,得到图中最佳整像素(实心圆圈○)。

  • (2)然后用半像素搜索得到最佳匹配结果(实心方块口),与整像素匹配结果比较,看看有没有改善。

  • (3)需要的话再使用1/4像素搜索,得到最佳匹配结果(实心三角形△),与前面匹配结果比较,看看有没有改善

下图为一个当前帧中,要预测的4x4的亮度块,在参考帧中寻找最佳匹配块的过程:

在这里插入图片描述
图中b和c,就是分别使用整像素搜索和半像素搜索,得到的移动矢量。

3、移动矢量预测

前面我们说,每个宏块、子宏块的移动矢量,都需要编码和传送,解码器才能正确解码。但是在这种情况下,图像的压缩比将会损失惨重,尤其当使用了较小的移动补偿块时,所以这就催生了移动矢量预测的产生。

也就是说我们可以选择性的,不编码和传送某些移动矢量,这些未编码的移动矢量,可以通过已编码的相邻块的移动矢量进行预测产生。

同样的,我们会对实际的移动矢量,与预测的移动矢量之差,进行编码和传送。

如下图以待预测图块E为例:
在这里插入图片描述
块大小相同的当前块(E)和相邻块

如图所示,当前块的预测矢量,可以用块大小相同的相邻块A、B、C来进行预测。

在这里插入图片描述
块大小不同的当前块(E)和相邻块

如图所示,当前块的预测矢量,可以用块大小不同的相邻块A、B、C来进行预测。

在处理的时候,我们可以把当前块E的预测矢量,取成A、B、C块移动矢量的中值。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多