H.264 and MPEG-4 第三章(翻译)

来源:互联网 发布:淘宝会员名是什么意思 编辑:程序博客网 时间:2024/06/05 11:36
 

3视频编码概念
3.1引言
压缩(动词):挤在一起或者缩到更小的空间;压紧
压缩(名词):压缩的动作,或者被压缩的条件
压缩是将数据缩至更小比特的过程。视频压缩(视频编码)是压缩一个视频序列,使视频序列的比特数更少的过程。原始的或者未压

缩的数字视频通常需要一个大的比特率(未压缩的电视质量视频接近每秒216Mbits,看第二章),对于数字视频实际的存储和传输来

说,压缩是必需的。
压缩包含一对互补的系统,一个压缩机(编码器)和一个解压器(解码器)。在传输或存储前,编码器将原数据转换成一种压缩的形

式(占据相对较少的比特),解码器将压缩形式转换回原始视频数据的表示。解码器和编码器对常常被描述成一个编解码器(图像

3.1)(新浪上传图形不好啊)。
数据压缩通过移除冗余信息来完成,即那些对于数据的忠实重现不是必需的信息都可以算是冗余。许多形式的数据包含统计性冗余,

它们可以通过使用无损压缩有效地得到压缩,所以在解码器端输出的重建数据时原始数据的完美重现。不幸的是,图像和视频压缩的

无损压缩只能给出一个适度的压缩。用无损图像压缩标准最好的(如JPEG-LS)压缩比率是大约3-4倍。为了完成更高比率的压缩,有

损压缩是必要的。在一个有损压缩系统中,解压缩的数据和原始数据是不完全匹配的,在付出一定视频质量损失的情况下,可以实现

更高的压缩比率。失真视频压缩系统基于移除主观冗余、图像或视频序列的元素(将这些元素移除不会明显的影响观察视频质量的感

觉)的原理。
绝大多数的视频编码方法将时域冗余和空域冗余去掉来完成压缩。在时域中,大约相同时间捕获的视频帧常常有着高的相似度。时间

上相近的帧(时间顺序上连续的帧)常常是高度相关的,尤其是在时间采样率(帧速率)是高的。在空域上,在靠近的像素之间常常

接近于彼此,即相邻的采样值常常非常相似(图像3.2)。
H.264和MPEG-4视频部分标准(在第5章和第6章进行细节描述)有许多共同的特性。这两种标准都采用了一种编解码模型,这种模型

使用了基于块的运动补偿、变换、量化、熵编码。在这一章中,我们研究这种模型的主要组成部分,以时间模式(运动估计和运动补

偿)开始,接下来图像变换,量化,预测编码和熵编码。这一章以这种基本模型的草图结束,其后跟着一块图像采样编解码的过程。
3.2视频编解码
一个视频编解码器(图像3.3)将一个源图像或源视频序列编码成一种压缩格式,在解码器端解码产生原始序列的复制或者近似。如

果解码视频序列和原始视频序列是一致的,此时可知编码过程是无失真的。如果解码序列不同于原始序列,则编码过程是失真的。
编解码通过一种模型表示原始视频序列(一种有效的编码表示,这种表示被用来重建视频数据的近似)。理想情况下,这种模型应该

使用尽可能少的比特数以及尽可能高的保真度表示视频序列。这两个目标(高效压缩和高质量)常常是冲突的,因为通常来说,较低

的压缩比特速率在解码器端产生降低了可视化质量的图像。这种比特率和质量的折中将在第7章中进行更进一步的讨论。
一个视频编码器(图像3.3)包括三个主要功能单元:时间模型、空域模型和熵编码。输入到时域模型中的是一个未经压缩的视频序

列。时域模型通过移除相邻视频帧之间的相似性打算降低空间冗余,这常常通过构造一个现在时刻视频帧的预测来实现的。在MPEG-4

视频部分和H.264中,通过前面或后面的一个或几个视频帧来形成预测,通过补偿和这些参考帧的差别来提高预测帧的质量(运动补

偿预测)。时域模型的输出是一个残余帧(通过从实际当前帧中减去预测帧)和一系列的模型参数,一般来说,是一些运动矢量,这

些运动矢量描述了运动是怎样补偿的。
帧残留形成了空间模型的输入,利用了残留帧中相邻采样点的相似性,试图减少空间冗余。在MPEG-4视频部分和H.264中,通过对残留采样值应用变换以及量化结果值,来实现降低空间冗余。变化将采样值变换到另一个域中,在另一个域中,他们通过变换系数表示。这些系数被量化,从而移除了一些微不足道的值,留下了一小部分更加简洁的残留帧的表示值。空间模型输出的是一些量化了的变换系数。
时间模型的参数(通常为运动矢量)和空间模型的参数(系数)被熵编码器压缩。这移除了数据中的统计性冗余(举个例子,通过短的二进制编码表示常用的矢量和系数),并产生了经过压缩的位流或者文件,这些位流或文件可能被传输和(或)存储。一个压缩序列包括编码的运动矢量参数、编码的残差系数和头信息。
视频解码器从压缩的位流重建一个视频帧。熵解码器解码生成系数和运动矢量,在此之后,解码空间模型量,重建一个版本的残留帧。解码器使用运动矢量和一个或多个先前经过解码的帧,生成当前帧的预测,通过加上残余帧的值,可以重建当前帧。
3.3 时间模型
空间模型的目标是通过形成一个预测帧和减去当前帧减少传输帧之间的冗余。这个过程的输出是一个残差(差值)帧,并且预测过程越准确,在残差帧中包含的能量越少。编码残差帧,发送到重新生成预测帧的解码器,加上解码的残差,重建当前帧。预测帧通过一个或多个过去的或未来的帧(参考帧)生成。预测的精度通过补偿在参考帧和当前帧之间的运动来提高。
3.3.1来自先前视频帧的预测
时间预测的最简单方法是,使用先前的帧作为当前帧的预测。一个视频序列中的两个连续的帧,在图像3.4和图像3.5中表示了出来。第一帧被用作第二帧的预测,并且通过将当前帧减去预测帧,并且被显示在图像3.6中。在这幅图像中,中灰代表零差值,亮灰和黑灰相应的代表正差值和负差值。这种简单预测的明显的问题是在残差帧中有许多的能量剩余(通过亮色和黑色区域可以表示),并且这意味着在时域压缩后仍然有许多数量的信息要压缩。残留能量中的许多是由于两帧中的物体运动,通过补偿两帧之间的物体运动可以形成一种更好的预测。
3.3.2由于运动引起的变化

物体运动(刚性物体的运动,举个例子,一辆运动中的汽车,以及可变形物体的运动,如一只移动的手臂)、相机运动(平移、倾斜、缩放、旋转)、裸露区域(举个例子,运动物体引起的裸露的一部分场景背景)和亮度变化可能引起视频帧之间的变化。除裸露区域和亮度变化之外,这些不同对应着帧之间像素的运动。预测出连续视频帧之间每个像素的运动轨迹是可能的,产生了一个像素轨迹的场,称之为光流场。图像3.7显示了图像3.4和图像3.5的帧之间的光流场。完整的光流场包含每一个像素位置的流动矢量,但是为了清晰,这个场经过下采样,以至于只有每隔一个像素的矢量被显示。
如果光流场可以准确的被知道,根据光流场中的矢量,移动参考帧中的像素就应该可能形成当前帧中绝大多数像素的精确预测。然而,这是一种由于多种原因而不能实现的运动补偿的方法。精确地光流场的计算,其运算量非常大(对于每一个像素更准确的方法是使用迭代过程),发送每个像素的光流失量给解码器将是必须的,为了解码器重新生成预测帧(导致大数量的传输数据和否定了小的残余值的优势)。
3.3.3 基于块的运动估计和运动补偿
实用和广泛应用的运动补偿的方法是补偿当前帧中的矩形部分或者块的运动。接下来的过程是实施在当前帧中的M乘以N采样的块。
1、在参考帧(过去或者将来的帧,先前被编码和传输)中搜索一块区域,去寻找一个匹配的M乘以N采样的区域。这通过比较当前帧中的M乘以N块和搜索区域(尝尝以当前块位置为中心的区域)内的许多或全部可能的M乘以N域来实现。找到能够提供最好匹配的区域。一种流行的匹配准则是通过将候选区域减去当前M乘以N块产生的残余中的能量,所以最小化残余能量的候选区域作为最佳匹配。找到最佳匹配的过程称之为运动估计。
2、被选择的候选区域成为当前M乘以N块的预测。当前块减去预测块从而形成残留的M乘以N块(运动补偿)。
3、残留块被编码和传输,候选区域的位置和当前块之间的偏移(运动矢量)也被传输。解码器利用收到的运动矢量去重建预测区域,解码残余块,将它加到预测块,重建原始块的版本。
基于块的运动补偿由于许多的原因而受到欢迎。它是相对来说比较简单,而且计算是可行的。它适合于矩形视频帧,并且适合基于块的图像变换(即,离散余弦变换,稍后将看到),并且它为许多视频序列提供了一种合理有效的时间模型。然而,也有许多缺点,举个例子,现实中的事物,很少有整齐的界限来匹配矩形边界,物体在视频帧之间尝尝移动分数数目的像素位置,许多类型的物体运动难以使用基于块的方法来补偿(即,变形的物体,旋转和变形,如烟云的复杂的运动)。尽管有这些缺点,基于块的运动补偿仍然是在现在所有的视频编码标准中使用的时间模型的基础。
3.3.4一个宏块的运动补偿预测
宏块对应于一帧中的一个16乘以16的像素区域,是在许多重要的视频编码标准(包括MPEG-1/MPEG-2/MPEG-4视频部分/H.261/H.263/H.264)中运动补偿预测的基本单元。对于4:2:0格式的源视频材料(在第二章看),在图像3.8中显示了组织一个宏块。原始帧的一个16乘以16像素的区域由256个亮度采样(由4个8乘以8的采样块组成),64个蓝色色度采样(一个8乘以8块)和64个红色色度采样(8乘以8),给出了总共六个8乘以8的块。一个MPEG-4视频部分或者H.264编解码器以宏块为单元处理每一个视频帧。
运动估计
宏块的运动估计包含在参考帧中查找紧密匹配当前宏块的16乘以16采样区域。参考帧是序列中先前经过编码的视频帧,可能在显示顺序上在当前帧之前或者在当前帧之后。搜索的区域是在参考帧中以当前帧宏块位置为中心的区域,在搜索区域中搜索最小化匹配准则的16乘以16区域作为最佳匹配(图像3.9)。
运动补偿
当前宏块减去在参考帧中选择的最佳匹配区域可以得到一个残留的宏块(亮度和色度),残留宏块编码并传输,同时相对于当前宏块描述最佳匹配区域位置的运动矢量也将被传输。在编码器中,残余被编码以及被解码并且加到匹配区域从而形成重建宏块,它被存储作为一个将来运动补偿预测的参考。利用解码的残余来重建宏块是必需的,为的是确保编码器和解码器在进行运动补偿时使用同一个参考帧。
在基础的运动估计和运动补偿过程中,有许多的变化。参考帧可以是一个以前的帧(在时间顺序上),一个未来的帧或者两帧或者更多先前编码的帧的预测的集合。如果一个未来的帧被选为参考帧,在当前帧之前进行编码是必需的(即帧必须打乱顺序进行编码)。在参考帧和当前帧有一个明显的变化时(例如,一个场景的变化),不利用运动补偿进行宏块的编码可能更加高效,所以编码器可以为宏块选择帧内模式(不利用运动补偿进行编码),或者选择帧间模式(用运动补偿预测进行编码)进行编码。在一个视频场景中的移动物体很少有整齐的16乘以16像素边界,所以为运动估计和补偿使用一个变化的块尺寸可能更加高效。在帧之间,物体可能移动非整数数目的像素数(即,在水平方向上2.78像素,而不是2.0像素),在搜索这些位置的最佳匹配前,将参考帧插进亚像素位置下,这样可以得到一种更好的预测。
3.3.5 运动补偿块尺寸
视频序列中连续的两帧被显示在图像3.10和图像3.11中。不用运动补偿,将帧2减去帧1,从而可以得到残余帧(图像3.12)。

通过运动补偿(基于16乘以16的宏块),残余中的能量被削减。运动补偿(基于8乘以8的块(代替每16乘以16的宏块))进一步减少了残余的能量(图像3.14)。运动补偿(基于4乘以4的块)给出了最小的残余能量(图像3.15)。这些例子显示了,较小的运动补偿块尺寸可以得到更好的运动补偿结果。然而,一个更小的块尺寸引起了复杂性的提高(更多的搜索操作必须被执行),需要传输的运动矢量数目上也增加了。发送每一个需要发送的运动矢量以及矢量的额外开销将超出减少的残留能量的好处。一个有效地折中办法是依据图片特性来采用块的尺寸,举个例子,在一帧的平坦、均匀区域内,选择大的块尺寸,在帧内拥有高细节的区域选取小尺寸的块和复杂的运动。H.264使用自适应的运动补偿块尺寸(树结构的运动补偿,在第六章中描述)。
3.3.6 亚像素运动补偿
图像3.16显示了一个参考帧其中一部分的特写。在许多情况下,通过在参考帧中采样位置插值实现预测,可以形成一个更好的运动补偿预测。在图像3.17中,参考区域亮度采样被插入半采样位置,通过搜索经过插入的采样,寻找到当前宏块的最佳匹配是可能的。亚像素运动估计和补偿包括像搜索整型采样位置一样搜索亚采样插入位置,选择给出最佳匹配的位置(即最小化残余能量),使用这个位置的亚采样值或者整采样值来得到运动补偿预测。图像3.18中显示了显示了四分之一像素精度运动估计的概念。在第一阶段,运动估计找出在整型采样窗格(圆形)的最佳匹配。接下来,解码器立刻搜索半采样位置得到最佳匹配(正方形),看一下是否匹配得到提升。如果需要,正方形采样位置接下来去搜索匹配最佳半采样位置(三角形)。从现在的块或者宏块减去最终的匹配(在一个整型,半或者四分之一采样位置)。
在图像3.19中,一个4乘以4的采样块使用半采样位置插值来得到残留,并且有着比图像3.15更低的能量残留。这种方法可以更进一步得到应用,通过插值仅一个方形采样窗格,从而得到一个静止的更小的残留(图像3.20)。总体来说,以花费一定量的复杂度,更细的插值提供更好的运动补偿性能(一个更小的残余)。随着插值步骤增加,性能增益趋向降低。相对于整型采样运动补偿,半采样插值给出一个明显的增益,四分之一采样插值给出一个放缓了的提高,八分之一采样给出一个更小的提高,继续如是。
通过亚像素运动估计和补偿完成的性能的许多例子在表3.1中给出。将当前帧减去一个运动补偿参考帧(在视频帧序列中先前的帧)能量的残余(由绝对误差之和SAE近似得出)在表中列出。一个较低的绝对误差指示了更好的运动补偿性能。在每种情况下,亚像素运动补偿给出相对于整型采样补偿的提高了的性能。从整型到半采样的提升要比半采样到四分之一采样的提高更加明显。序列GRASS有着高复杂度的运动,特别难以进行运动补偿,因此产生大的SAE;Violin和Carphone的复杂度较低,运动补偿可以产生小的SAE值。

经过四分之一插值的4乘以4块的查询匹配比未经插值的16乘以16块的查找要复杂得多。除了多余的复杂度,还有编码的拖累,因为每一个块的矢量必须经过编码,然后传输到接收端,以便完成图像的准确重建。随着块尺寸的减少,需要传输的矢量的数量增加。表示半或者四分之一采样矢量需要更多的比特数,因为矢量的小数部分(即0.25、0.5)也必须像整数部分一样进行编码。图像3.21绘出了在残余图像3.13中,需要传输的整型运动矢量。残余图像3.20(4乘以4块尺寸)需要的运动矢量在图像3.22中绘出。在这幅图像中,相对于之前的图像有16倍的运动矢量,每个通过四分之一像素精度的两个小数数字DX和DY表示。因此在压缩效率和复杂的运动补偿之间有一个折中,因为更多精确地运动补偿需要更多的比特数编码矢量场但是需要更少的比特去编码图像残余,然而较小的精度运动补偿需要较少的比特而表示图像残余需要更多的比特。
3.3.7 基于区域的运动补偿
在自然场景中移动的物体很少整齐的沿块边界对齐,而是可能形成不规则的形状,定位在任意的位置,并且在一些情况下,在帧之间会改变形状。在图像3.23中描述了这个问题,在图像3.23中椭圆形物体移动了,而矩形物体是静止的。在参考帧中发现高亮宏块一个好的匹配是困难的,因为它覆盖了移动物体的部分以及静止物体的一部分,在参考帧中的两个匹配位置都不是理想的。
通过运动补偿图片中任意形状的区域来达到更好的性能,这是可能的(基于区域的运动补偿)。举个例子,如果我们只是试图运动补偿椭圆物体内部的像素位置,然后我们就可以在参考帧中找到一个好的匹配。然而,在实际应用中为了使用基于区域的运动补偿有许多的困难需要克服,包括准确和一致地确定区域边界,为解码器(分割)指明(编码)边界的轮廓以及为运动补偿后的残余进行编码。MPEG-4视频部分包括许多支持基于区域补偿和编码的工具,在第5张中会进行描述。
3.4图像模式

自然视频图像包括成矩形窗格分布的采样值。自然图像以他们原始的形式往往难以压缩,因为在相邻的图像采样点之间有着高相关性。图像3.24显示了一幅自然视频图像(图像3.4)的自相关函数,在这幅图像中的每一个位置图示的每一个高度值指示了原始图像和空间转移副本之间的相似度。在图像中心的峰值对应着0漂移。由于空间转移的副本在任何方向上转移了原始图像,函数像图像中显示的一样降低了,随着函数的缓慢下滑,显示了相邻位置的图像采样值是高度相关的。
一个运动补偿残差图像,如图像3.20,有自相关函数(图像3.25),随着空间偏移的增加,降落速度很快。这显示了临近的采样值是弱相关的。高效的运动补偿降低了本地的相关性,使它相对其原始视频帧来说更加易于压缩。图像模式的功能是把图像或者残差数据进一步解相关,并且转换它到一种能使用熵编码器进行高效压缩的模式。实际的图像模式经常有三个主要的要素,变换(解相关和使数据紧凑),量化(减少变换后数据的精度)以及重排(将数据排列成组,集合成有意义的数据)。

3.4.1 预测图像编码
运动补偿是预测编码的一个例子,在预测编码中,编码器基于先前或者后来的帧创建当前帧某一区域的预测,并且从当前区域中减去预测区域从而形成一个残差。如果预测是成功的,残差图像中的能量低于原始帧,残差图像能用较少量的比特表示。
用相同的方法,一个图像采样或者区域的预测也可以从同一幅图像或者帧中先前传输的采样形成。预测编码被用作早期图像压缩算法的基础,并且是H.264帧内预测的重要组成部分(被应用在变换域内,看第六章)。空间预测有时也被描述为“差分脉冲编码调制”,这是从电话系统中的差分编码PCM采样的方法引进的术语。
图像3.26显示了一个进行编码的像素X。如果这一帧按光栅顺序进行处理,然后像素A,B和C(在现在和先前的行中相邻的像素)在编码器和解码器中都是可以利用的(因为这些在X之前已经进行解码)。编码器基于先前已经进行编码的像素形成X的预测,然后将X减去预测值,并对残差(减的结果)进行编码。解码器形成相同的预测,并且加解码的残差重建像素。
例子
编码预测P(X)= (2A+B+C)/4,残差R(X)=X-P(X)被编码和传输,解码器解码R(X),并且形成相同的预测:P(X)=(2A+B+C)/4,重建像素X= R(X)+P(X)。
如果编码过程是失真的(即如果残差是被量化的-看3.4.3部分),则解码的像素A',B'和C'可能与原始的A,B和C(由于在编码期间的损失)是不一致的,所以在解码器和编码器之间,上面的过程将造成累积不匹配(或者偏移)。在这种情况下,编码器应该应该自己解码残差R'(X),并且重建每一个像素。
编码器使用解码的像素A',B'和C'形成预测,即在上面的例子中P(X)=(2A'+B'+C')/4。在这种方法中,编码器和解码器使用相同的预测P(X),漂移就可以阻止了。
这种方法的压缩效率依赖于预测P(X)的精度。如果预测是精确地(P(X)近似于X的值),然后残差能量就是小的。然而,对于一幅复杂图像的所有区域来说,选择一种预测器好好地工作,常常是不可能的。通过采用依赖于图像的当前统计值选取合适的预测器可以获取更好的性能(举个例子,对于平的纹理,强的垂直纹理,强的水平纹理,使用不同的预测器)。对于编码器来说,为解码器指出预测器的选择是必需的。所以在高效率的预测和需要多余的比特来指示出预测器的选择有一个折中。
3.4.2变换编码
3.4.2.1综述
在一幅图像中或者视频编解码器中,转换阶段的目的是将图像或者运动补偿的残差数据转换到另一个域(变换域)。变换的选择依赖于多项准则:
1、在变换域内的数据应该解相关(分成存在最小依存的元素),并且使它们更加紧凑(变换数据中的绝大多数的能量应该集中到少数的值上)。
2、这个变换应该是可逆转的。
3、变换需要的计算损耗应该是可以接受的(低的内存需要,可完成的有限精度的计算,低数目的算术操作,等等)。
已经为图像和视频压缩提出了许多变换,最流行的变换往往分为两类:基于块和基于图像。基于块的变换的例子包括KLT、SVD和曾经流行的DCT。这些变换都基于N乘以N的图像或者残差采样的块,因此图像是以块的单元进行处理。块变换有着低内存的要求,适合于基于块运动补偿的残差压缩,但是往往受到块边缘的人工制品(块效应)。基于图像的变换在整幅图像或者整帧上进行操作(或者图像的一大部分,称之为平板)。最流行的图像变换是DWT(离散小波变化或者小波)。图像变换如小波变换已经证明了在性能上
对静止图像的压缩超过了块变换,但是却往往需要有较高的内存需求(因为整幅的图像或平板被作为一个单元被处理),并且不能和基于块的运动补偿不能很好的匹配。DCT和DWT在MPEG-4视频部分中都讲到了(并且DCT的一个变种包含在H.264中),并且将会在后面的部分中讨论到。

3.4.2.2DCT
离散余弦变换(DCT)在X上进行操作,X是一个N乘以N的采样块(一般来说是,经过图像预测后的图像采样或者残差值),并且产生一个N乘以N的参数块。用变换矩阵A可以描述DCT变换(以及反DCT变换)的行为。一个N乘以N采样块的前向DCT(FDCT)如3.1式,反DCT变换通过式3.2给出。在式中,X是一个采样块,Y是一个系数的矩阵,A是一个N乘以N的变换矩阵。等式3.1和等式3.2可以以和形式进行书写:分别为3.4式和3.5式。
例子:N= 4
为一个4乘以4的DCT的变换矩阵A
余弦函数在2π弧度后是对称和重复的,因此A能被简化为3.7式或者3.8式。计算余弦后可得:A
两维前向FDCT的输出是一系列的N乘以N的系数,这些系数代表了在DCT域中的图像块数据。这些系数内被认为一系列标准基础模式的加权。4乘以4和8乘以8DCT的基础模式分别在图像3.27和图像3.28中显示。这些基础模式由水平和垂直余弦函数联合组成。任何图像块可以通过联合所有N乘以N基础模式得到重建。每个基础乘以合适的加权因素(系数)。

DCT的益处在通过系数子集进行重建时,变得明晰。用DCT系数的自己去重建一个块的相似复制是可能的。移除微不足道的系数(举个例子,用量化,看3.4.3部分),使图像数据可以在减少数目的参数下重新表示,虽然这样付出了一定的失真。
3.4.2.3小波
流行的小波变换(广泛应用在图像压缩中),它是基于一系列的带有系数(相当于离散小波函数)的滤波器。一个离散小波变换的基础操作是如下应用到一个包含N个采样的离散信号。一对滤波器被应用到这个信号,从而对信号进行分解,将其分解为一个低频带宽(L)和一个高频带宽(H)。每一个带宽由1/2参数下采样,以至于两个频率带宽包含N/2个采样值。在滤波器正确选择的情况下,操作是可以逆转的。
这种方法可以被扩展引用到一个二维信号,如一张密集图像(图像3.32)。2D图像的每一行用低通和高通滤波器(Lx和Hx)进行滤波,每个滤波器的输出经过二分之一下采样,产生中间图像L和H。L是原始图像低通滤波和在x方向上进行下采样获取,H是原始图像进过高通滤波和在X方向上进行下采样所得。接下来,这些新图像的每一列经过高通和低通滤波器滤波,二分之一下采样产生四个子图像(LL,LH,HL,HH)。这四个子宽带图像可以联合起来产生一个输出图像,这个输出图像有着和原始图像一样数目的图像(图像3.33)。LL是原始图像,在水平方向上和垂直方向上进行滤波,并且经过二分之一采样。HL是垂直方向上的高通滤波,并且包含着残差垂直频率。
3.4.3 量化
一个量化器将一系列X值的信号映射为一个减少了排列的值Y的量化信号。用更少数目的比特数表示量化的信号是可能的,因为相比起原始信号,可能的值的数目是较小的。一个标量量化器映射输入信号的采样到一个量化了的输出值,一个矢量量化器量化一系列的输入采样值(一个矢量)到一组的量化值。
3.4.3.1标量量化
一个标量量化的简单例子是对于小数四舍五入到最近的整数,即完成从实数到整数的映射。这个过程是失真的(不是可以逆转的),因为不可能从已完成四舍五入的整数决定原始小数的准确值。一个更普遍的量化器例子是:式3.9
在这里,QP是一个量化的台阶大小。量化的输出技术是以QP的统一间隔进行分割的(就像下面的例子一样)。
图像3.36显示了两个标量量化器的例子,一个线性量化器(在输入与输出值之间存在线性映射关系),一个非线性量化器有一个大约为0的死去(在这个死区内,小的数值的输入被映射为0)。
在图像和视频压缩编解码器中,量化操作常常由两部分组成:在编码器中的量化器FQ,和在解码器中的反向量化器(事实上,量化是不可翻转的,所以一个更加准确的术语是定标器或者反定标器。在一系列的按比例换算值之间,一个关键的参数是步长Qp。如果步长是大的,量化值的数目就是少的,并且因此能有效的表示,但是按比例换算的值是对原始信号的一种粗略估计。如果步长是小的,按比例换算的值可以更加近似于原始信号,但是大数目的量化值降低了编码的效率。
量化可能被用来降低应用变换后的图像数据的精度,如DCT或者小波变换之后,这移除了如接近于零的DCT系数或者小波系数等无效值。在图像或者视频编码器中的前向量化器,被映射无效的系数值到0,而保留了一些减少数目的显著地、非零的系数。前向量化器的输出一般是一个稀疏数组的量化参数,主要包含0。

3.4.3.2矢量量化
一个矢量量化器将一系列的输入数据(如一块图像采样)映射为一个单独的值(码字),并且在解码器端,每个码字映射为接近于原始序列的输入数据(一个矢量)。一系列的矢量被存储在编码器和解码器的码本中。一个典型的矢量量化在图像压缩中的应用是如下这样:
1、分割原始图像成为区域(即M乘以N像素块)
2、从码本中选取一个尽可能接近当前区域的矢量。
3、传输一个标识所选取矢量的索引到解码器。
4、在解码器端,利用选择的矢量重建区域。
在图像3.37中描述了基本的系统。这里,量化被应用在空间域中(即一组图像采样被作为矢量进行量化),但是它同样能应用到经过运动补偿和经过变化的数据。在矢量量化器中的关键问题包括码本的设计以及在码本中查找最优矢量的高效性。
3.4.4 重新排序和零编码
在存储和传输之前,量化了的变换系数需要尽可能大的实现编码。在一个基于变换的图像或视频编码器中,量化器的输出是包含有少量非零向量和大量的零值系数的稀疏数组。重新排序(将非零系数分成组)和对零系数有效的表示在熵编码之前进行应用。这些过程为DCT和小波变换进行描述。
3.4.4.1DCT
系数分布
一个块图像或者残差采样的明显的DCT系数一般是在直流系数周围的低频位置。图像3.38中划分了在一个QCIF残差帧中(图像3.6)在一个8乘以8的块中每个位置的非零DCT系数的可能性分布。非零DCT系数云集在左上系数附近,并且分布大体来说在水平和垂直方向上是对称的。对于一个残差域(图像3.39),图像3.40划分出了非零DCT系数的可能性,这里,系数云集在直流位置,但是是倾斜的,即更多的非零系数出现在划分的左侧边缘。这是因为区域图片在垂直轴上有一个较强的高频元素(由于在垂直方向上的抽样),导致对应于垂直频率上的较大的DCT系数(相对于图像3.27)。
扫描
在量化之后,一个块的DCT系数被重新把非零系数整理成组,使其他的零值量化参数额可以高效表示。最佳的重排路径(扫描顺序)依赖于非零DCT系数的分布。对于类似于图像3.38的典型帧块的分布,一种合适的扫描顺序是从直流系数开始的一字形。从直流系数开始,每个量化系数按照在图像3.41中所示的那样,复制进一个一维数组。非零系数在重排序的数组中倾向于组织在一起,而其后跟随着长序列的零。
锯齿形的扫描可能对于一个倾斜的系数分布区域块是不理想的,一个如图像3.42中经过修改的扫描顺序可能更加有效,在这种扫描顺序中,左侧的系数在右侧的系数之前被扫描。
运行级别编码
重排序过程的输出是一个数组,在这个数组中,开始部分云集着一个或者更多的非零系数,而其后包含一串零值。零值的数目可能被编码,已达到更紧密表示他们的目的,举个例子,通过把这个数组表示成一系列的(运行,级数)对,在这里运行指示在非零系数之前的零的数目,而级数代表非零系数的大小。
每一个这种输出值(一个运行-级数对)被熵编码器编码成一个单独的标志。
较高频的DCT系数常常被量化为0,并且一个重新被排序的块常常以一系列的0结束。在块中的最后的非零系数需要一个特殊的表示。在所谓的二维运行级数编码中,每个运行级数对像上面一样进行编码,一个单独的编码标志,last,表示非零值的结束。如果使用三维运行级数编码,每个标志编码三个量化值,运行,级数,和最终。在上面的例子中,如果-7是最终的非零系数,三维值是(0,16,0),(2,-3,0),(0,5,0),(0,6,0),(4,-7,1)。在最终的编码中的1,指示在块中的最后的非零系数。
3.4.4.2小波
系数分布
图像3.35显示了一个典型的2维小波系数分布。在更高的子带(偏向于图像的右底)的多数系数是接近于零,可以在没有明显图像质量损失的情况下量化为0。非零系数往往对应于图像的结构,举个例子,在所有的水平和对角线子带中,小提琴弓显示为一个明显的水平结构。当一个系数在低频自带中非零,有很大的可能性,在高频子带的相应位置也将是非零的。我们可以考虑一个树状的非零量化系数,以低频子带的根源开始。图像3.43描述了这个概念。在第一层的LL带宽中,一个单独的系数在对第一层的其他带宽里均有一个对应的系数(即这四个系数对应原始图像的相同区域)。第一层系数位置映射到第二层每个子带的四个相应的仔细数位置(记得,第二层的垂直和水平分辨率是第一层的两倍)。
零树编码
在进行熵编码之前,将非零小波系数编码的更加紧凑是可取的。实现这个目标的有效方法是从分解的最低(根)的水平开始编码每个树状的费零系数。在最低层的一个系数经过编码,其后跟着在高层中的子系数,等等。编码过程继续,直到这个树遇到一个零系数。零值系数的更进一步子系数可能为0,所以剩下的子系数通过一个单独的标识零树的编码表示。解码器从每个树的根部进行系数映射重建,非零系数被解码和重建,当到了0树码时,剩下的所有子系数被设置为0,。这是编码小波系数的EZW方法的基础。一个额外的可能性被包含在编码进程中,在编码进程中,一个零参数可能后接零树或者一个非零子系数。第二种情形布是经常性出现,但是通过考虑到这种情形的存在可以轻微的提高重建图像的质量。
3.5熵编码器
熵编码器将表示视频序列元素的一系列符号转换为压缩的流,这个流适合于传输或者存储。输入符号可以包含量化变换系数(在3.4.4部分描述的运行级别或者零树),运动矢量(每个运动补偿块的位移矢量,以整数或者子像素分辨率为单位),标识(指示序列中的重新同步点的编码),头(宏头,图片头,序列头,等等)和补充信息(对于正确的解码不是必需的边信息)。在这部分中,我们讨论预测前向编码的方法(利用编码帧局部区域的相关性),其后跟着两种广泛应用的熵编码技术,修改的哈夫曼变长编码和算术编码。

3.5.1 预测编码
图片中的局部区域的某些符号是高度相关的。举个例子,相邻帧内编码块的平均或DC值可能是非常相似的,相邻的运动矢量可能有着相似的x和y位移,等等。通过从前面经过编码的数据预测当前块或宏块的元素,并且对预测值和现实中的值的差值进行编码,可以有效地提高编码效率。
块或者宏块的运动矢量表示在先前帧中预测参考的偏移。因为物体的运动也许可以扩展到一帧的大区域内,所以相邻块或者宏块的矢量常常是相关的。这对于小的块尺寸以及大的移动物体是特别正确的(即4乘以4块矢量,看图像3.22)。运动矢量场的压缩可以通过通过前面经过编码的矢量预测每个运动矢量得到提高。对当前宏块X的运动矢量的一种简单预测是水平相邻宏块A(图像3.44),另外三个或者更多个先前编码的矢量也可以被用于预测宏块X的矢量(即在图像3.44中的A,B,C)。在预测和实际的运动矢量的差值(运动矢量差或者MVD)被编码和传输。
量化参数或者量化阶数的尺寸控制着压缩效率和图像质量的折中。在一个实时的视频编解码中,在一个编码帧内修改量化尺寸可能是必需的(举个例子,改变压缩比例使编码速率可以匹配传输信道速率)。在连续编码的宏块之间,只改变参数的小小的数量,这常常是足够并且是可取的。

修改后的量化参数必须被以信号形式发送给解码器,代替发送新的量化参数值,发送一个增量或者差值指出需要的变化值是更可取的。用编码一个小的增量值代替编码一个完整的新的量化参数,需要较少的比特数。
3.5.2变长编码
一个变长编码器将输入符号映射为一系列的码字(变长编码)。每一个符号映射到码字,码字可能有变长,但是每个码字必须为整数长的比特数。频繁发生的符号代表短的变长码字,而不太常见的符号用长的变长变量表示。足够多的编码符号,则会使数据量得到压缩。
3.5.2.1哈夫曼编码
哈夫曼编码基于不同符号出现的可能性,分配一个变长编码给每一个符号。根据由哈夫曼1952年提出的原始计划,计算每个符号出现的可能性是必要的,创建一系列的变长变量。
如果概率分布式准确的,哈夫曼编码提供原始数据的相对紧密的表示。在这些例子中,常常出现的0矢量被有效的表示为单个比特。然而,为了完成最优的压缩,由于两个序列拥有不同的概率分布,对于两个序列分别需要一个单独的码表。由于需要完整的代码,潜在压缩效率的损失对于序列2的0矢量是非常清楚地。因为比特的最有数目是一个比特。

3.5.2.2基于哈夫曼的前向计算编码
对于一个实际的视频编解码器,哈夫曼编码过程有两个缺点。首先解码器必须使用和编码器相同的码字。传输在概率表中的信息将增加额外的开销,降低压缩效率,尤其是对于较短的视频序列。第二点,大的视频序列概率表(需要生成哈夫曼树)不能被计算,直到视频数据被编码后,一个不可以被接受的延迟引入了编码进程中。由于这些原因,最近的图像和视频编码标准定义了一系列的通用的视频材料中所用到的码字集。预先计算的变长码字表的两个例子是来自MPEG4视频部分(简单配置)。
变换系数(TCOEF)
MPEG4视频部分采用量化系数的3D编码,在量化系数中,每个码字表示一个(运行,水平,最后一个)的集合。总共102个指定的(运行,水平,最后一个)的集合有变长码字被赋给它们,这些码字中的26个被显示在表3.6中。一个更进一步的76变长编码被定义,每个有13比特长。每个码字的最后位是标志位‘s’,指出解码系数的符号(0为正,1为负)。每一个不列在表中的(运行,水平,最后一个)集合用一个转义序列进行编码,一个指定的转义编码(0000011)跟着13比特固定长度的编码,描述运行,水平和最后一个的值。
显示在表3.6中的编码中的一些在表3.47中的树形式表示。包含超过8个连零的码字是无效的,因此每个以00000000...表示位流的一个错误(或者以一长串零开始的起始码出现在序列的不希望其出现的地方)。所有其他序列的比特可以被解码为有效的代码。注意最小的代码被分配到小运行和小级别(即代码‘10’表示一个0的运行和一个正负1的级别),因为这些出现是频繁的。
运动矢量差值
差分编码运动矢量被编码为一对变长编码,一个编码代表x元素,一个编码代表y元素。变长编码表的部分被显示在表3.7中。一个更进一步的49个编码(8到13比特长)不显示在这里。注意最短的代码表示小的运动矢量差值(即运动矢量差值被单独的比特编码‘1’表示)。
这些代码表清楚地相似于真正的哈夫曼编码,因为每一个符号被赋值为一个单独的码字,经常出现的符号被赋值为一个较短的码字,在一份表中,没有码字是其他码字的前缀。与真正的哈夫曼编码最大的区别在于:码字是基于通用的概率分布进行预先计算的,在变换系数的情况下,只有102个经常出现的符号被定义,其他符号的码字被用固定长度的编码进行定义。
3.5.2.3其他的变长编码
和哈夫曼编码及基于哈夫曼编码一样,一些变长编码的其他种类在视频编码应用中是有潜在益处的。一个基于哈夫曼编码的传输数据的一个严重的缺点是他们对于传输错误的敏感。在变长编码序列中的一个错误可能引起解码器丢失同步,并且对随后的编码解码失败,导致在解码序列中一个错误的扩散。可逆变长码字是能成功正向或者后向解码成功的变长码字,这种码字在当错误出现时,可以提高解码性能(看5.3部分)。一个预先定义的表(如表3.6和表3.7)的缺点有,编码器和解码器必须以许多形式存储这份表。另一种方法在输入系统已知的情况下是使用自动生成的编码。指数golomb编码术语这一类,在第六章进行描述。
3.5.3算术编码
在3.5.2部分描述的变长编码计划有着共同的基本的缺点,这个缺点是每种符号的码字包含一个整数的数字,这是不太好的,因为符号的最优比特数目依赖于信息内容,并且常常是一个分数。变长编码的压缩效率对于出现概率大于0.5的符号尤其差,因为最好的方式是用一个单独比特的编码表示这些符号。算术编码提供一个实际的替代哈夫曼编码的方法,这种编码能更接近于理论最大的压缩比。
算术编码主要的优点是传输的数字不限于每个数据符号用一个整数数目的比特数进行表示。在这个例子中,算术编码完成9个比特,这接近于最优值。一个用整数个数的比特数表示每个数据符号的计划(如哈夫曼编码)不可能达到离最优比特数如此之近的地步,总体来说,算术编码超出哈夫曼编码的性能。
3.5.3.1基于上下文的算术编码
成功的熵编码依赖于准确的符号概率模式。基于上下文的算术编码使用局部空间和(或)时间特征来估计符号的概率进行编码。基于上下文的算术编码被用在JBIG标准中,进行双级别图像压缩,已经被采用在MPEG4视频部分的形状掩码以及H.264主要配置的熵编码。
3.6混合DPCM/DCT视频编解码器模型
自20世纪90年代初公布的主要的视频编码标准都基于相同的通用视频编解码器设计(模型),这些设计模型结合了运动估计和补偿前端(有时描述为DPCM),一个变换阶段和一个上编码器。这个模型常常被描述为混合的DPCM/DCT编解码器。适应于H.264,H.263,MPEG-1,MPEG-2,MPEG-4视频部分和H.264的任何编解码器必须执行相似的基本编解码函数(虽然在标准和执行的细节上有许多的差别)。
图像3.50和图像3.51显示了通用的DPCM/DCT的混合编码和解码器。在编码器中,视频帧n(Fn)经过处理生成一个编码(压缩)的位流,在解码器端,压缩的位流(在图像的右侧显示)被解码生成一个重建视频帧(常常不同于源视频帧)。在编码器和解码器中共同的元素已经被标记为高亮。在编码器中的绝大多数的函数其实包含在编码器中(原因在下面进行解释)。
编码数据流
在编码器中,有两条主要的流路径,左到右(编码)和右到左(重建)。编码流如下:
1、一个输入视频帧Fn进行编码,被以宏块的单元进行处理,宏块对应于16x16亮度区域以及相关的色度采样。
2、Fn与参考帧进行比较,举个例子前一个经过编码的视频帧F'n-1。一个运动估计函数在F'n-1(或F'n-1的一个下采样插值版本)中寻找一个16x16区域,匹配现在Fn的当前宏块(即根据一些匹配条件相似)。当前宏块与选定的参考区域之间的便宜是一个运动矢量。
3、基于选好的运动矢量MV,一个运动补偿预测P生成(通过运动估计器选定的16x16区域)。
4、当前宏块减去P,产生一个残差宏块。
5、D被使用DCT进行变换。一般来说,D被分割成8x8或者4x4子块,每个子块独立的进行变换。
6、每个子块被量化。
7、每个子块的DCT系数被重新排序,并进行运行时编码。
8、最终,每个宏块的系数,运动变量和相关的头信息被熵编码从而产生压缩的位流。
重建数据流的过程如下:
1、每个量化宏块X被调整,逆变换产生解码残差D’。注意不可能的量化过程意味着,D'不同于D(即失真被引入)。
2、运动补偿P被加上D',从而产生重建宏块,并且重建宏块被保存,从而重建帧F'n。在编码一个完整的帧之后,重建帧F'n可能被下一个编码帧Fn+1用于参考帧。
解码数据流
1、压缩的位流被熵解码,提取每个宏块的系数、运动矢量和头。
2、运行级编码和重新排序被反转,从而生成一个经过量化、变换的宏块X。
3、X被调整并经过反变换从而生成解码的残差D'。
4、解码运动矢量被用于确定在前一个参考帧F'n-1的解码器副本中的16x16区域。区域变成运动补偿预测P。
5、P被加到D'从而产生一个重建宏块。重建宏块被保存从而产生解码帧F'n。
在一个完整的帧进行解码后,F'n准备显示,也许也被存储用作下一个解码帧F'n+1的参考帧。
从图像以及上面的解释可以清楚的看出,编码器包括一个解码的路径(调整,IDCT,重建)。对于运动补偿预测,编码器和解码器使用相同的参考帧F'n-1是必要的。
例子
一个25HZCIF格式的视频序列(每帧352x288亮度采样和176x144红/蓝色差采样)使用一个DPCM/DCT编解码器进行编码和解码。图像3.52显示了一个CIF(视频帧Fn),这个视频帧被编码,图像3.53显示了重建的前一个帧F'n-1。注意F'n-1被编解码,并且显示了一些失真。没有经过运动补偿,Fn和F'n-1的差值(图像3.54)仍然包含非常明显的能量,尤其在移动区域的边缘。运动估计被以16x16亮度块尺寸和半采样精度进行执行,产生如图3.55的矢量集(叠加在当前帧上)。许多矢量为零(以点表示),这意味着在参考帧的相同位置有着当前帧宏块的最好匹配。在移动区域周围,矢量指出宏块移动的方向,一些矢量不能很好的对应真实当中的移动,但是简单的指出了在草考阵中的最好匹配。像这样的噪声矢量常常出现在图像的同质区域,在参考帧的这些地方,对象特征没有清楚地表示。
根据运动矢量重新组织的运动补偿参考帧。举个例子,注意正在走的人(左边第二个)已经移到左边,从而提高匹配度。从现有的帧中减去运动补偿参考帧给出图像3.57运动补偿残差,在残差中能量已经被明显的减少,尤其在移动区域的周围。

图像3.58显示了来自原始帧的一个宏块,这个宏块来自右边人物的头部周围,图像3.59在运动补偿之后的亮度参差。应用一个2D离散余弦变换到顶部右上的8x8亮度采样块(表3.9)产生在表3.10中的DCT系数。每种系数的大小绘制在图像3.60;注意较大的系数集中在右上(直流)系数。
一个前向量化器被应用:
Qcoeff=round(coeff/Qstep)
在这里Qstep是量化阶大小,在这个例子中为12。在这个量化块中小的数值系数变为0(表3.11),并且非零输出杯集中在左上系数。
量化块以交错扫描被重新排序(从左上开始),生成一个线性数组:-1,2,1,-1,-1,2,0,。。。。。
这个数组被处理,从而生成一系列的(零运行,级别)对:
EOB指示着系数的剩余量是零。
每一个(运行,级数)对被编码成一个变长编码。使用MPEG4视频部分TCOEF表(表3.6),产生显示在表3.12中的变长编码。最终的变长编码标志着LAST为1,指示着这是一个块的结束。宏块的运动矢量是(0,1)(即矢量向下指)预测矢量(基于相邻宏块)是(0,0),所以运动矢量差值是MVDx=0,MVDY=+1。使用MPEG4 MVD表(表3.7),这些分别被编码成1和0010。
宏块被作为一系列的变长编码传输,包括一个宏块头,运动矢量差值(X和Y)以及每个8x8块的变换系数。
在解码器中,变长编码序列被解码抽取头参数,运动矢量差值和每个块的(运行,级别)对。重新排列系数的64元素的数组通过在每个级别前面插入运行零进行重建。数组被重新排序从而产生一个8x8块(和表3.11相同)。量化系数被调整。
一个反向离散余弦变换被应用,从而创建一个解码完成的残差块(表3.14),每一个残差块是相似的,但不完全同于原始的残差块(表3.9)。原始和解码的残差块在图像3.61中被并排绘制,并且它是清楚地,解码的块通过量化损失了高频DCT系数,所以解码的块有这很少高频的变化。
解码器基于先前解码的矢量形成预测运动矢量,从而重建原始运动矢量(0,1)。使用这个矢量,联合先前解码的帧F'n-1的所有的副本,解码器重建这个宏块。完全的解码帧在图像3.62中进行显示。由于量化进程,一些失真被引入,举个例子在细节区域附近,如脸和在白板中的等式,有一些明显的8x8块边界。完整的序列被压缩大约300倍(即编码序列占用的空间小于未编码序列的尺寸的1/300),以及所以在付出相对差的图像质量的情况下,可以完成明显的压缩。
3.7结论
在这一章中描述的视频编码工具,如运动补偿预测,变换编码,量化和熵编码组成可靠并且有效率的编码模型的基础。这种模型统治了视频编码这个领域超过10年。编码模型是书中描述的两种标准的核心。标准的技术细节在第5和6章进行介绍,前面的4章进行标准的引入。

原创粉丝点击