视频编码基础(2)

来源:互联网 发布:智慧家庭记账软件 编辑:程序博客网 时间:2024/05/01 03:07
3.1 介绍
压缩(compress) 动词: 挤压到更小的空间中;即condense
压缩(conpress) 名词: 压缩的行为或是压缩的状态

压缩是把数据用更小的空间来存放的技术.视频压缩(视频编码)是把数字视频流序列用更少的数据位进行存放的方法."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 由于运动造成的改变
在视频帧之间的改变可能是由物体的运动造成的(刚性的物体运动,比如说一辆运动着的汽车,或可变形物体运动,比如说移动的
手臂),摄象头的移动,被去覆盖的区域(比如说一个运动场景中由于物体的运动致成背景的去覆盖性)和光线的变化。除去去覆盖
和光线变化,差别都是由于帧间的像素点的运动造成的。这样构造的像素点的邻接被称为光流(optical flow)。完整的域包括对于
每个像素位置的光流向量,但是这些域都是被子采样过的,这样的话,只有每隔两个像素点的向量才被显示出来。

如果光流域是准确描述的,那么它应该可以构成一个对大多数像素点准确的预测,方法即为沿着光流向量移动参考帧中的每个像素
点。然而,种种原因之下,这并不是一个实用的运动补偿的方法.对于光流的准确的计算对于计算来说是非常敏感的而且把每个像素
点的光流传给解码器也是必要的,以使它能重构造预测帧(这样就得到了大量的传输数据,与我们小剩余值的目标是相矛盾的)。

3.3.3 基于块的运动估计和补偿
一个实用并被广泛使用的运动补偿方法是为了裣一个矩形区域的运动或叫当前帧的“块”。下列的步骤对当前帧的一个M × N采样
的块的处理过程:

1. 在参考帧中查找一帧(过去的或以后的,已被编码的或传输的),来找到一个相匹配的M * N的区域。这是由在查找区域中比较
M * N的块,并找到一个最接近这一块的区域。一个流行的匹配方式是用把两个块的能量作差,这样能量相差最小的两个区域被认
为是最佳的匹配结果。这个查找匹配的过程被叫做运动估计。

2. 选定的区域成为对于当前M * N块的预测块,它被减掉当前的块来构成一个M*N的剩余块(运动补偿).

3. 剩余块被编码并传输,当前块和选定块的差值(运动向量)也被传输.

解码器使用接收到的运动向量来重建预测区域并解压剩余块,加上之前的预测块来重建一个原始块。

基于块的运动补偿这么流行是有很多原因的。它很直接,计算性上也很易处理,它与矩形视频帧很相适应,并且使用基于块的图形
变换(比如DCT等),而且它对于视频序列提供了一个有很效的时域模型。然而它也有一些缺点,比如说,实际物体中几乎没有平滑
的边缘来进行矩形边界的匹配,物体通常在帧之间用很小的像素点位置移动(比如说可变形的物体,旋转和扭曲),而且很多种
运动是难以用基于块的方法进行补偿的。尽管它有这些缺点,基于块的运动补偿是当前所有的视频标准使用的时域模型的基础.

3.3.4 对于一个宏块的运动补偿
宏块,对应于一个16*16的帧区域,是大多数编码标准(包括MPEG1,MPEG2,MPEG4,H.261,H.263和H.264)运动补偿预测方法的基本组
成部分。对于源4:2:0的视频信号来说,一个对于源帧的16*16像素区域的是由256个亮度采样(用4个8*8的采样块排列),64个Cb色
度采样(用一个8*8的采样块排列),64个Cr色度采样(用一个8*8采样块排列),这样就一共六个8*8的块。MPEG4或H.264的CODEC通过
宏块来处理每一个视频帧.

运动估计
对于一个宏块的运动估计包括在参考帧中找一个与当前宏块相近的16*16的采样区域。参考帧是一个在之前被编码过的帧。参考帧
的区域以当前宏块的位置为中心,宏块区域的查找16*16的相匹配区域做为最佳匹配结果。

运动补偿
在参考帧中选定的最佳匹配区域是从当前宏块中减掉的部分,它用来构成一个剩余帧,接着通过运动向量被编码和传输,它也描述
了最佳对应区域。在编码器之内,剩余帧被编码和解码并被加到相应区域之中,来重构一个宏块,这个宏块被存为以后的运动补偿
预测的参考帧。用一个解码的剩余帧来重构宏块来保证编码器和解码器在运动补偿的时候使用相同的参考帧。

在运动估计和补偿的过程中有很多不同方法。参考帧可以是之前的或之后的一帧,也可以是结合或是更多帧的搭配。。如果一个之
后的帧用来进行参考的话,那么就要先对这一帧进行编码。在参考帧和当前帧之间有一个很大的改变的地方(比如说,一个场景的
变化),也许不使用运动补偿进行编码宏块会更有效。这样编码器就选择帧内编码(在没有运动补偿的情况下进行编码.在移动场景
中移动的物体很少符合16*16像素边缘而且这样也许使用可变的块大小进行运动估计和补偿会更高效。物体可能有很少的像素部分
运动,这样使用在参考帧中插值法会是一种更加好的预测方法。

3.3.5 运动补偿块大小
视频序列中的连续两帧中图1是从图2中不通过运动补偿而进行减操作得到的一个剩余帧.剩余帧中的能量由于通过16*16的宏块做运动
补偿而降低.每8*8块(而不是16*16)的块会更近一步降低剩余帧中的能量,4*4会更少.这个例子说明了小的运动补偿块可以得到更佳的
运动补偿效果.然而,一个更小的运动补偿块会导致复杂度的升高(更多的搜索操作被执行了),这样更多的运动向量就要被传输。发送
每个运动向量需要一些位来做到,这个多余的负担会抵销剩余帧中能量的减少的优势。一个更有效的妥协的方法是采用调节图的块
大小,比如说在相似的区域上选择一个大的块,而在高度细节化运动的部分选用更小的块。H.264使用了一种自适应的运动补偿块大小
,在以后我们会提到。

3.3.6 子像素运动补偿
一些情况下,通过在参考帧中从插值采样位置来预测会得到更好的运动补偿预测。“子像素”运动估计和补偿包括寻找子采样的
插值位置与整值采样位置,来寻找最佳匹配(比如说,最小化剩余帧的能量)并在这个位置使用整或子采样值来直行运动补偿预测。对于
四分之一像素运动裣来说,第一步,运动估计会寻找对于整采样格的最佳匹配,接下来编码器在最佳匹配附近寻找半采样位置来看
匹配是否可以被改进,如果需要的话,对半采样最佳匹配像素附近的四分之一采样位置进行寻找。最终的匹配(整,子或四分之一
采样位置)由当前块或宏块相差得到。

用4*4的块大小得到的剩余帧可以使用半采样插值并有更低的剩余能量。这种方法可以由从四分之一采样格来得到更小的剩余帧能量
得到扩展。总体上说,“更好的”插值可以达到更好的运动补偿性能(更小的剩余帧能量),代价则是复杂度会更高一些。这样得到
的性能提升会因为插值的步骤的增多而抵销。半采样插值相比整采样有更好的性能,四分之一采样插值会给出更好的效果,八分之一
更胜之,以此类推。

一个运动补偿过的参考帧被从当前帧中减去,剩余帧的能量如下(用总绝对误差来近似SAE):
Sequence No motion compensation Integer-pel Half-pel Quarter-pel
'Violin',QCIF 171945 153475 128320 113744
'Grasses',QCIF 248316 245784 228952 215585
'Carphone',QCIF 102418 73952 56492 47780

一个低的SAE表示更好的运动补偿性能。在每种情况下,子像素运动补偿相对整像素补偿都有更好的性能表现,而四分之一补偿会更
好。"Grasses"序列有更复杂的运动,这样就更难以实施运动补偿,悲痛"Violen"和"Carphone"就更容易进行补偿了。

在四分之一采样插值中寻找一个匹配的4*4的块是比在没有插值的16*16的块中更加复杂的。除了更大的复杂度之外,因为每个块的
运动向量都要被编码并传输到接收端以更好的重建图象,这样就有了编码上的性能损失了。因为块大小减小了,传输的向量数增加了。
需要更多的位来表示半采样或四分之一采样向量,因为向量的更细节部分也必须被像整采样那样进行编码。这样有另复杂运动的
补偿模式下就有编码效率上的平衡度了,因为运动补偿越准确,就有更多的数据来表示运动域,但是在不那么准确的情况下,就不需
要那么多位了。
3.3.7 基于区域的运动补偿
在一个自然的视频场景中移动的物体很少被对很整齐地对齐到块的边缘,它们很可能是不规则形状的,放置在任意位置上,而且在
帧间改变他们的形状。这样就很难在参考帧中找到一个理想的匹配,因为它覆盖了一部分运动着的物体,一部分静态的物体。

在图像的任意区域应用运动补偿是可以达到更好的性能的。比如说,如果我们试图在椭圆形的物体中进行运动补偿的话,我们可以在
参考帧中找到一个理想的匹配。然而使用基于区域的运动补偿会遇到很多的实际困难,包括识别区域边界,指出边界的轮廓,在运动
补偿之后编码剩余帧,MPEG-4视频包括了一系列的工具来支持基于区域的补偿和编码。