在Matlab中执行帧内预测

时间:2014-08-16 02:14:43

标签: matlab video-processing

我正在尝试实现混合视频编码框架,该框架用于我需要执行的H.264 / MPEG-4视频标准中。帧内预测'和'国际预测' (用于运动估计)用于Matlab中的视频处理的一组30帧。我正在使用母女框架。

请注意,此帖与我之前提到的question非常相似,但这个帖子完全基于Matlab计算。

修改 我正在尝试实现下面显示的框架:

enter image description here

我的问题是如何执行水平编码方法,这是Intra Coding框架的九种方法之一?如何对像素进行采样?

enter image description here

我觉得令人困惑的是帧内预测需要两个输入,即8x8输入帧块和8x8块重建帧。但是,在对输入帧的第一个块进行编码时会发生什么,因为没有重建像素来执行水平编码?

在上图中,整个系统是一个闭环,你从哪里开始?

END:

问题1 :帧内预测图像仅针对序列的第一个图像(I帧),还是需要针对所有30个帧进行计算?

我知道有五种帧内编码模式,分别是水平,垂直,DC,左上,右下,右上,左下。

问题2 :我如何实际比较重建帧和锚帧(原始当前帧)?

问题3 :为什么我需要搜索区域?单独的8x8块可以用作一次完成一个像素的搜索区域吗?

我知道重建块的像素用于比较,但它是否在搜索区域内一次完成一个像素?如果要处理30帧,那么这样做是不是太费时了?

2 个答案:

答案 0 :(得分:3)

继续我们之前的帖子,让我们一次回答一个问题。


问题#1

通常,您使用一个I帧并将其表示为参考帧。使用此功能后,对于参考帧中的每个8 x 8块,您可以查看下一帧,并确定此8 x 8块在下一帧中最佳移动的位置。您将此位移描述为运动矢量,并构造一个由此信息组成的P帧。这将告诉您参考帧中的8 x 8块在此帧中最佳移动的位置。

现在,您可能要问的下一个问题是在我们决定使用其他参考框架之前需要多少帧?这完全取决于您,您可以在解码器设置中进行设置。对于数字广播和DVD存储,建议您每0.5秒左右生成一个I帧。假设每秒24帧,这意味着您需要每12帧生成一个I帧。 This Wikipedia article是我得到这个参考的地方。

对于帧内编码模式,这些模式告诉编码器在尝试找到最佳匹配块时应该查找的方向。实际上,采用look at this paper来讨论不同的预测模式。看一下图1,它提供了各种预测模式的非常好的总结。事实上,总共有 9 。另外,请查看at this Wikipedia article以获得不同预测机制的更好的图示。为了获得最佳精度,他们还通过在像素之间进行双线性插值,以1/4像素精度进行亚像素估计。

我不确定您是否需要使用P帧实现运动补偿,或者您是否还需要B帧。我会假设你需要两者兼而有之。因此,请看一下我从维基百科中摘取的图表:

来源:Wikipedia

这是用于编码视频中帧的非常常见的序列。它遵循以下格式:

IBBPBBPBBI...

底部有一个时间轴,告诉您编码帧后发送到解码器的帧序列。需要首先编码I帧,然后是P帧,然后是B帧。在I帧之间编码的典型帧序列遵循您在图中看到的格式。 I帧之间的帧块是所谓的图片组(GOP)。如果你记得我们之前的帖子,B帧使用来自前方和当前位置后面的信息。因此,为了总结时间线,这通常是在编码器方面完成的:

  • 对I帧进行编码,然后用于预测第一个P帧
  • 然后使用第一个I帧和第一个P帧来预测这些帧之间的第一个和第二个B帧
  • 使用第一个P帧预测第二个P帧,使用第一个P帧和第二个P帧之间的信息创建第三个和第四个B帧
  • 最后,GOP中的最后一帧是I帧。对此进行编码,然后使用第二个P帧和第二个I帧(最后一帧)之间的信息来生成第五个和第六个B帧

因此,需要发生的是先发送I帧,然后发送P帧,然后发送B帧。解码器必须在重建B帧之前等待P帧。但是,这种解码方法更加健壮,因为:

  • 它可以最大限度地减少未覆盖区域的问题。
  • P帧和B帧比I帧需要更少的数据,因此传输的数据更少。

但是,B帧需要更多的运动矢量,因此这里会有更高的比特率。

问题#2

老实说,我所看到的人做的是在一帧与另一帧之间做一个简单的求和差来比较相似性。您从一个位置的一个帧中为每个像素获取颜色分量(无论是RGB,YUV等),使用另一个帧中相同空间位置的颜色分量减去这些颜色分量,将每个分量加起来并将它们全部加在一起。您为帧中的每个位置累积所有这些差异。值越高,这与一帧和下一帧之间的差异就越大。

众所周知的另一个衡量标准叫做Structural Similarity,其中一些统计指标(如均值和方差)用于评估两个帧的相似程度。

使用了大量其他视频质量指标,使用其中任何一种都有优点和缺点。我不是告诉你使用哪一个,而是将你推迟到Wikipedia article,这样你就可以根据自己的应用决定自己使用哪个。{3}}。这篇维基百科的文章描述了一大堆相似性和视频质量指标,而降压并不止于此。目前仍在进行有关数值测量最佳捕获两帧之间相似性和质量的研究。

问题#3

当从在P帧中移动的I帧中搜索最佳块时,您需要从该I帧块的位置限制搜索到有限大小的窗口区域,因为您没有我希望编码器搜索框架中的所有位置。这将只是计算量太大,因此会使您的解码器变慢。我实际上在之前的帖子中提到了这一点。

使用一个像素在下一帧中搜索另一个像素是一个非常糟糕的主意,因为该单个像素包含的信息量极少。在进行运动估计时,一次比较块的原因是因为通常,像素块在块内部具有很多变化,这些变化对于块本身是唯一的。如果我们可以在下一帧中的另一个区域中找到相同的变体,那么这是像素组一起移动到此新块的非常好的候选者。请记住,我们假设视频的帧速率足够高,因此帧中的大多数像素都不会移动,或者移动速度非常慢。使用块可以使匹配更准确。

一次比较块,并且比较块的方式是使用我在我引用的维基百科文章中谈到的那些视频相似性度量之一。你肯定是正确的,因为这样做30帧确实会很慢,但是存在高度优化的实现以非常快速地进行编码。一个很好的例子是FFMPEG。事实上,我一直在工作中使用FFMPEG。 FFMPEG具有高度可定制性,您可以创建利用系统架构的编码器/解码器。我设置它,以便编码/解码使用我的机器上的所有核心(总共8个)。

这并没有真正回答实际的块比较本身。实际上,H.264标准有一系列预测机制,因此您不会查看I帧中的所有块来预测下一个P帧(或一个P帧到下一个P帧等)。这暗示了维基百科文章和我推荐给你的论文中的不同预测模式。编码器足够智能以检测图案,然后概括图像中相信表示将显示相同运动量的区域。它跳过这个区域并移动到下一个区域。


这项任务(在我看来)过于宽泛。在进行运动预测/补偿方面有很多错综复杂的原因,大多数视频工程师已经使用可用的工具为我们完成工作。为什么要在已经完善的情况下发明轮子呢,对吗?

我希望这已经充分回答了你的问题。我相信我给你的问题多于答案,但我希望这足以让你进一步深入研究这个话题,以实现你的总体目标。

祝你好运!

答案 1 :(得分:-1)

问题1:帧内预测图像是仅针对序列的第一个图像(I帧)还是需要针对所有30个帧进行计算?

我知道有五种帧内编码模式,分别是水平,垂直,DC,左上,右下,右上,左下。

答案:不需要对所有帧使用帧内预测。

问题2:我如何实际比较重建帧和锚帧(原始当前帧)?

问题3:为什么我需要搜索区域?单个8x8块可以用作一次完成一个像素的搜索区域吗?

答案:我们需要使用块匹配算法来查找运动矢量。所以搜索区域是必需的。通常,搜索区域的大小应大于块大小。搜索区域越大,计算越多,精度越高。