查看文章 |
MPEG 4 & H.263视频编码从基础到深入,这是第三章的前三节.
3.1 介绍 压缩是把数据用更小的空间来存放的技术.视频压缩(视频编码)是把数字视频流序列用更少的数据位进行存放的方法."Raw"或叫没压缩过的视频需要大量的码(大约每秒信息216M),而且压缩对于数字视频的存储和传输来说都是需要的. 压缩包括一对互补的系统,一个编码器(encoder)和一个解压器(decoder).编码器把原数据在传输或存放之前转变为压缩格式(占用更少的数据位),而解压器把压缩的格式转会到原来的视频数据格式上.编码器/解码器对经常被叫做CODEC(enCOder/DECoder) 数据压缩是通过移除数据冗余来实现的,比如说,对于数据重构过程中无用的数据。很多种数据都有统计上的冗余性,它们就可以通过无损压缩进行有效的压缩,这样的标准比如说JPEG-LS,它可以达到3-4倍的压缩。有损压缩可以达到更高的压缩比。在有损压缩系统中,解压数据与源码流数据是不同的,高压缩率是通过视频质量的下降来达到的。有损视频压缩系统是建立在删除主观冗余的原理之上的,从图象或视频中删掉的部分不会很大程度上影响观察者对于视频质量的认识的。 大多数视频编码方法寻找空间和时间上的冗余来达到压缩的效果。在时间域中,连续几帧的视频通常有很强的相关性,特别是当时域采样率是非常高的时候尤其如止。在空间域中,通常像素采样点之间是相互关联的,比如说,相邻象素之间很相近。 H.264和MPEG4视频标准共用了一部分特征。这两种标准都假设了一种以块(block)为基础的运动补偿,变换,量化和熵编码。我们主要关注到这些主要的方法中,并从时间模型开始,接下来是图象变换,量化,预测式编码和熵编码。并以对于一个图象采样块进行编码和解码的过程进行描述。 3.2 视频编解码器 CODEC用一种模型来表示原始视频流(一个被有效编码的表示方式,并可以用它来重建视频数据的近似结果或尽量取得高的码率。这两个目标(压缩效率和高质量)通常是相矛盾的,因为一个低的压缩码率通常在解压部分会降低图象的质量。码率和质量的平衡我们会在之后进行介绍 视频编码器是由三个主要的功能部件实现的:时域模型,空域模型和熵编码。时域模型的输入为一个未压缩的视频流序列。时域模型试图用邻近帧的相似性来消除了时域冗余,通常是构造通当前帧的预测。在MPEG4视频部分和H.264中,预测通常从一个或多个之前或之后的帧来进行的,并通过对于帧之间的差别进行补偿。时域模型的输出是一个剩余帧(通过从实际当前帧中减去预测值得到),而一系列的模型参数,通常是一系列用来描述运动是如何补偿的运动向量。 剩余帧构成了时域模型的输入,它会利用邻近采样点的相似性来降低空域的冗余。在MPEG4视频部分和H.264中,这通常通过一些变换来对样点进行处理来实现。变换把采样点转到其他的域中,在这些域中用变换系数来表示。这些系数被量化来删除不明显的值,只留下很少的大系数来对剩余帧进行表示。空域模型的输出是一系列的量化变换的系数。 时域模型的参数(通常是运动向量)和空域模型的参数(系数)通常用熵编码来进行压缩。这就删除掉了统计上的冗余度(比如,用短二进制码表示当前的向量和系数)并制造出一个压缩流或文件来进行传输或存储。一个压缩的序列由编码的运动向量参数,编码的剩余系数和头信息表示。 视频解吗器从一个压缩流中构造一个视频帧。系数和运动向量由熵解码器进行解码,然后空域模型构建出一个版本的剩余帧。解码器利用运动向量参数与一个或多个解压帧来构成一个对当前帧的预测,然后帧就可以通过加入这个剩余帧来得到。 3.3 时域模型 3.3.1 从前一视频帧进行预测 3.3.2 由于运动造成的改变 如果光流域是准确描述的,那么它应该可以构成一个对大多数像素点准确的预测,方法即为沿着光流向量移动参考帧中的每个像素点。然而,种种原因之下,这并不是一个实用的运动补偿的方法.对于光流的准确的计算对于计算来说是非常敏感的而且把每个像素点的光流传给解码器也是必要的,以使它能重构造预测帧(这样就得到了大量的传输数据,与我们小剩余值的目标是相矛盾的)。 3.3.3 基于块的运动估计和补偿 1. 在参考帧中查找一帧(过去的或以后的,已被编码的或传输的),来找到一个相匹配的M * N的区域。这是由在查找区域中比较M * N的块,并找到一个最接近这一块的区域。一个流行的匹配方式是用把两个块的能量作差,这样能量相差最小的两个区域被认为是最佳的匹配结果。这个查找匹配的过程被叫做运动估计。 2. 选定的区域成为对于当前M * N块的预测块,它被减掉当前的块来构成一个M*N的剩余块(运动补偿). 3. 剩余块被编码并传输,当前块和选定块的差值(运动向量)也被传输. 解码器使用接收到的运动向量来重建预测区域并解压剩余块,加上之前的预测块来重建一个原始块。 基于块的运动补偿这么流行是有很多原因的。它很直接,计算性上也很易处理,它与矩形视频帧很相适应,并且使用基于块的图形变换(比如DCT等),而且它对于视频序列提供了一个有很效的时域模型。然而它也有一些缺点,比如说,实际物体中几乎没有平滑的边缘来进行矩形边界的匹配,物体通常在帧之间用很小的像素点位置移动(比如说可变形的物体,旋转和扭曲),而且很多种运动是难以用基于块的方法进行补偿的。尽管它有这些缺点,基于块的运动补偿是当前所有的视频标准使用的时域模型的基础. 3.3.4 对于一个宏块的运动补偿 运动估计 运动补偿 在运动估计和补偿的过程中有很多不同方法。参考帧可以是之前的或之后的一帧,也可以是结合或是更多帧的搭配。。如果一个之后的帧用来进行参考的话,那么就要先对这一帧进行编码。在参考帧和当前帧之间有一个很大的改变的地方(比如说,一个场景的变化),也许不使用运动补偿进行编码宏块会更有效。这样编码器就选择帧内编码(在没有运动补偿的情况下进行编码.在移动场景中移动的物体很少符合16*16像素边缘而且这样也许使用可变的块大小进行运动估计和补偿会更高效。物体可能有很少的像素部分运动,这样使用在参考帧中插值法会是一种更加好的预测方法。 3.3.5 运动补偿块大小 3.3.6 子像素运动补偿 用4*4的块大小得到的剩余帧可以使用半采样插值并有更低的剩余能量。这种方法可以由从四分之一采样格来得到更小的剩余帧能量得到扩展。总体上说,“更好的”插值可以达到更好的运动补偿性能(更小的剩余帧能量),代价则是复杂度会更高一些。这样得到的性能提升会因为插值的步骤的增多而抵销。半采样插值相比整采样有更好的性能,四分之一采样插值会给出更好的效果,八分之一更胜之,以此类推。 一个运动补偿过的参考帧被从当前帧中减去,剩余帧的能量如下(用总绝对误差来近似SAE): 一个低的SAE表示更好的运动补偿性能。在每种情况下,子像素运动补偿相对整像素补偿都有更好的性能表现,而四分之一补偿会更好。"Grasses"序列有更复杂的运动,这样就更难以实施运动补偿,悲痛"Violen"和"Carphone"就更容易进行补偿了。 在四分之一采样插值中寻找一个匹配的4*4的块是比在没有插值的16*16的块中更加复杂的。除了更大的复杂度之外,因为每个块的运动向量都要被编码并传输到接收端以更好的重建图象,这样就有了编码上的性能损失了。因为块大小减小了,传输的向量数增加了。需要更多的位来表示半采样或四分之一采样向量,因为向量的更细节部分也必须被像整采样那样进行编码。这样有另复杂运动的补偿模式下就有编码效率上的平衡度了,因为运动补偿越准确,就有更多的数据来表示运动域,但是在不那么准确的情况下,就不需要那么多位了。 在图像的任意区域应用运动补偿是可以达到更好的性能的。比如说,如果我们试图在椭圆形的物体中进行运动补偿的话,我们可以在参考帧中找到一个理想的匹配。然而使用基于区域的运动补偿会遇到很多的实际困难,包括识别区域边界,指出边界的轮廓,在运动补偿之后编码剩余帧,MPEG-4视频包括了一系列的工具来支持基于区域的补偿和编码。 |