文档库 最新最全的文档下载
当前位置:文档库 › MPEG4 & H.264学习笔记

MPEG4 & H.264学习笔记

MPEG4 & H.264学习笔记之一 ---- 视频格式与质量
2.1介绍
视频编码是对一个数字视频信号的编码和解码的过程.这一章讨论了数字图象和视频信号的结构和特征以及对于视频编码来说很重要的一些基本概念,比如采样格式等.数字视频是对于一人自然的视觉场景的从时间和空间上进行采样的表示方式.一个场景是由通过在时间上对于点进行采样来得到帧从而产生的(一种对于在时间上点在整个视频场景中的表示方法)或是一个场(由奇数或偶数行的空间采样组成).采样在一定的时间间隔上(通常是1/25或1/30秒时间间隔)进行重复,从而产生一个可动的视频信号。一般来说,需要三种采样集来表示一个有色的场景。表示数字视频的流行的方法是使用ITU-R 601标准并使用"中间集"。对于一个视觉场景的重建的准确性必须被计算来决定一个视频通信系统的性能,这是一个出了名的困难和极为不准确的过程。主观的测量方法是极耗时间而且它与观察者对于变换的反应程序不同而不同。客观的测量方法实现起来就更简单一些,但是目前还不能与人类实际视觉感完完全全匹配。

2.2 自然视频场景

一个经典的“现实世界”或“自然世界“的视频场景是由多个有各自特征形状,深度,纹理和亮度的物体构成的。视频场景的颜色和明亮度在不同的场景中根据不同程序的光滑度而定。一个与视频处理和压缩相关的经典的自然视频场景包括空间特征(纹理变换,物体的数目和形状,颜色等)和时间特征(物体运动,亮度的变化,视点的移动等)

2.3 捕捉
一个自然视频场景在空间和时间上是连续的。用数字的形式表示一个视频场景包括在空间对实际场景进行采样(通常是通过在视频图形面上用长方形格处理)和时间采样(以一系列以某时间间隔采样得到的静态帧组成)。数字视频就是在数字形式下的一个视频场景的采样的表示方式。每一个时-空采样(像素)用一个数或一组数来表示,用来描述采样点的亮度和色度。

为了得到一个二维的采样图像,摄像头把一个视频场景的二维投影聚焦到传感器上,比如一组电荷耦合装置(CCD)。在带色的图像捕捉过程中,每一个颜色成员都分别被过滤并投影到一组CCD中。

2.3.1 空间采样
一组CCD的输出就是一个模拟的视频信号,一组可以表示一个视频图像的电信号。在时间上对一点进行采样就形成了一个有定值的采样点图像或帧。最常用的采样方法是把采样点置于一个正方形或长方形格中进行操作。然后对于每个格交点处的点进行采样,重建过程就以采样值对应到像素上进行显示。重建图的视觉效果取决于采样点的数量。选择一个粗糙的采

样格会得到一个低分辨率的采样图像,而增加采样点的数量就会增加采样图像的分辨率。

2.3.2 时间采样
一个可动的视频图像是通过对信号在周期性的时间间隔上进行快照得到的。重放这一系列的帧会得到一个运动的效果。一个高的时间采样率(帧率)会产生更加平滑的运动但是它就要求有更多的采样要被捕捉并被保存。在10帧每秒之下的帧率有些被用于一些很低码率的视频通信中(因为被传输的数据量非常的小)但是运动却看起来很笨拙而且不自然。在10-20帧每秒是比较经典的低码率视频。在25-30帧每秒进行采样是标准电视信号图象的采样帧率(配合隔行扫描采样来达到更好的运动效果)。50-60帧每秒就可以形成平滑的运动(代价就是帧率太过高,传输和存储的压力大).

2.3.3 帧和场
一个视频信号可以被通过对于一系列帧(渐进采样)或一个序列的隔行扫描的场(隔行扫描采样)来进行采样。在一个隔行扫描采样的视频序列里,一帧的一半的数据是在每个时间采样间隔进行采样的。一个场由奇数个或偶数个扫描线组成,而一个隔行扫描的视频序列包括一系列的视频帧。这种采样方式的优点在于与有相同帧数的同样码率的渐进序列相比,可以在一秒中传输两倍多的场,这样就可以形成更加平滑的运动。比如,一个PAL视频序列由50场/秒的码率组成,在回放过程中,运动可以比与之相同的25帧每秒的用渐进视频序列形成的运动显得更加的平滑。

2.4 颜色空间
大多数数字视频程序都依赖于彩色视频的显示,这样的话,就需要一个来捕捉并表示颜色空间的表示方法。一个单色的图像只需要一个在空间内表示一个像素点的亮度或流明度的值就可以了。但对于颜色图像来说,对于一个像素点至少需要三个数来把颜色信息准确地表示出来。用来表示亮度和颜色的方法叫做颜色空间。

2.4.1 RGB
在RGB颜色空间中,一个带颜色的图象采样是用三个值来表示一个象素点的相对的红,绿和蓝色比(三种光线的主样构成颜色)。任何颜色都可以通过把红,绿和蓝来通过不同的比例相混得到。RGB颜色空间更加适合于捕捉并显示颜色图像。捕捉RGB图像包括过滤出红,绿和蓝色的构成比率,并用一个单独的传感器数组来捕捉。CRT和LCD通过分别对每个像素点的红绿蓝值进行显示来得到各种颜色。从一个通常的观察距离来看,不同的构成部分可以达到颜色上的真实感。

2.4.2 YCbCr
人类视觉系统(HVS)相比亮度来说对于颜色不是那么敏感的。在RGB颜色空间中,三种颜色被平等地看待,并用相同的分辨率存放起来。但是通过把亮度与颜色信息分离,并对亮度值取更高的分辨率可以更有效

地表示一个颜色图像。

YCbCr颜色空间和它的变换(通常写为YUV)是一种流行而高效的表示一个颜色图像的方法。Y是亮度值,由R,G,B的加权平均可以得到: Y=krR + kgG + kbB
这里k是加权因子。

颜色信号可以由不同的颜色差别来表示:
Cb = B-Y
Cr = R-Y
Cg = G-Y
对于一个颜色图像的完整的描述由给定Y和三个色差:Cb,Cr,Cg来表示。

目前为止,我们的表示方法好像并不那么好,因为相比RGB表示来说,我们这次用了四个参数。然后Cb+Cr+Cg是一个常数,那么我们只需要两个色度参数就可以了,第三个可以通过其他两个计算出来。在YCbCr空间中,只有Y和Cb,Cr值被传输和存储,而且Cb和Cr的分辨率可以比Y低,因为人类视觉系统对于亮度更加敏感。这就减少了表示图像的数据量。通常的观察情况下,RGB和YCbCr表示的图像看上去没有什么不同。对于色度采用比亮度低的分辨率进行采样是一种简单而有效的压缩办法。

一个RGB图像可以在捕捉之后转换为YCbCr格式用来减少存储和传输负担。在显示图象之前,再转回为RGB.注意没有必要去指明分别的加权值kg(因为kb+kr+kg=1),而且G可以从YCbCr中解压出来,这说明不需要存储和传输Cg参数。

Y = kr R + (1-kb-kr)G + kb B
Cb = 0.5/(1-kb) * (B-Y)
Cr = 0.5/(1-kr) * (R-Y)

R = Y + (1-kr)/0.5 * Cr
G = Y - 2kb(1-kb)/(1-kb-kr) * Cb - 2kr(1-kr)/(1-kb-kr) * Cr
B = Y + (1-kb)/0.5 * Cb

ITU-R的BT.601决议定义了kb=0.114,kr=0.299,那么代换参数就有了如下等式:

Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y )
Cr = 0.713(R - Y )

R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb

2.4.3 YCbCr采样格式
4:4:4采样就是说三种元素Y,Cb,Cr有同样的分辨率,这样的话,在每一个像素点上都对这三种元素进行采样.数字4是指在水平方向上对于各种元素的采样率,比如说,每四个亮度采样点就有四个Cb的Cr采样值.4:4:4采样完整地保留了所有的信息值.4:2:2采样中(有时记为YUY2),色度元素在纵向与亮度值有同样的分辨率,而在横向则是亮度分辨率的一半(4:2:2表示每四个亮度值就有两个Cb和Cr采样.)4:2:2视频用来构造高品质的视频彩色信号.

在流行的4:2:0采样格式中(常记为YV12)Cb和Cr在水平和垂直方向上有Y分辨率的一半.4:2:0有些不同,因为它并不是指在实际采样中使用4:2:0,而是在编码史中定义这种编码方法是用来区别于4:4:4和4:2:2方法的).4:2:0采样被广泛地应用于消费应用中,比如视频会议,数字电视和DVD存储中。因为每个颜色差别元素中包含了四分之一的Y采样元素量,那么4:2:0YCbCr视频需要刚好4:4:4或RGB视频中采样量的一半。

4:2:0采样有时被描述是一个"每像素12位"的方法。这么说的原因可以从对四个像素的采样中看出.使用4:

4:4采样,一共要进行12次采样,对每一个Y,Cb和Cr,就需要12*8=96位,平均下来要96/4=24位。使用4:2:0就需要6*8=48位,平均每个像素48/4=12位。

在一个4:2:0隔行扫描的视频序列中,对应于一个完整的视频帧的Y,Cb,Cr采样分配到两个场中。可以得到,隔行扫描的总采样数跟渐进式扫描中使用的采样数目是相同的。

2.5 视频格式
这本书中描述的视频压缩标准可以压缩很多种视频帧格式。实际中,捕捉或转化一个中间格式或一系列中间格式是很平常的事情。CIF就是一种常见的流行的格式,并由它衍生出了4CIF和Sub-QCif。帧分辨率的选择取决于应用程序,可使用的存储量以及传输带宽。比如说4CIF对于标准定义的电视和DVD视频来说是合适的,CIF和QCIF在视频会议中是常被使用的格式。QCIF和SQCIF对于移动设备的多媒体程序来说是合适的,在这样的情况下,显示分辨率和码率都是有限的。以下是各种格式的具体使用位数的需求(使用4:2:0采样,对于每个元素用8个位大小表示):

格式: Sub-QCIF 亮度分辨率: 128*96 每帧使用的位: 147456
格式: QCIF 亮度分辨率: 176*144 每帧使用的位: 304128
格式: CIF 亮度分辨率: 352*288 每帧使用的位: 1216512
格式: 4CIF 亮度分辨率: 704*576 每帧使用的位: 4866048


一种在电视信号中被应用的很广的数字视频信号编码格式就是ITU-R的BT.601-5 提案。亮度元素被在13.5MHz下采样,而亮度值则在6.75MHz下采样,这样就形成了一个4:2;2的Y:Cb:Cr采样结果。采样数字信号的参数取决于视频码率(对于NTSC来说是30Hz,对于PAL/SECAM来说是25Hz)。NTSC的30Hz是对低空间分辨率的补偿,这样总的码率就是216Mbps.实际显示的激活部分的区域要比总量小,因为它去掉了在一帧边缘处的水平和垂直空白间隔。
每一个采样都有0-255的采样范围。0和255两个等级被留作同步,而且激活的亮度信号被限制到26(黑色)到235(白色)之间.

2.6 质量
为了指定,评价和比较视频通信系统,我们需要决定向观察者显示的视频图像的质量。衡量视频信号的质量是一件困难的事情,通常也是不准确的,因为有太多的因素会影响到衡量的结果了。视觉质量与生俱来就是主观的因素,它被很多因素影响着,这就使对于这个衡量结果的准确性变得更难了。比如说,一个视频信号的质量对于一个观察者来说主要取决于任务本身,比如说,被动地观看一部DVD影片,主动地参与一个视频会议,用符号评议进行通信交流,或是试图从一个视频场景中认出一个人。衡量视频信号的客观分类给定了一个准确的可重复的结果,但是没有哪种客观的测量方法可以完全地模拟人类视觉主观的感受。

2.6.1 主观

质量测量
2.6.1.1 影响主观质量的因素
对于一个视频场景的感觉是由人类视觉系统对于不同元素复杂交互性决定的----眼睛和大脑.对于视频信号的感知是受空间保真度的影响的(不管有没有明显的失真,问题在于我们是否可以清楚地看到一个场景的各个部分)和时间保真度(运动是否自然平滑)。然而,一个观察者对于质量的看法经常会被观察环境,观察者的心情和观察者与场景的交互程序相关。一个执行特定任务的用户需要关注于视频场景的一部分。观察一个场景常与看一个电影时的对于“好”的概念是不同的。例如,一个观察者的对视频质量的看法在观察环境好的情况下会更好一些(而这一点不取决于视频信号本身的好坏)

其他的重要的影响因素包括视觉焦点(一个观察者通过一系列的观察点而不是同时观察所有的内容)和所谓的"最新效应"(我们对于一个视频序列的看法总是更多地受更新看到的内容的影响而不是老的内容)。所有的这些因素都让衡量一个视频的质量的好坏的任务变得极为困难。

2.6.1.2 ITU-R 500
很多的关于主观质量认下的测试过程都在ITU-R BT.500-11中被定义。一个常用的过程就是Double Stimulus Continuous Quality Scale(DSCQS)方法,评价者被展示了一系列的图片或两个视频序列A和B(一个接一个地),然后被要求给出A和B的质量评价值,方法是在五个分隔着的评价值(从"Excellent"到"Bad")画连续线来定。在一个典型的测试会话中,评价者被展示了一系列的序列,并被要求对它们进行评价。对于每对序列来说,一个是未受损的"参考“序列,另一个是同样的序列,它被在测试的系统或过程中修改了。

这两个序列的顺序,原始的和有损的,在测试地过程中被随机的给出,这样评价者就不知道哪个是原始的,哪个是改变过的序列。这样就防止了评价者带偏见地比交这两个测试序列。在结束的时候,评分被转化到一个规范化的范围内,最终的结果是用平均评价值来说的,用它来指明相应的帧的质量。

像DSCQS这样的测试被广泛地接受,并被用来评价主观的视频效果。然而,这样的测试受实际问题的影响。这样结果对于评价者来说差别会非常大。这个不同会被在重复测试的过程中被弥补过来。一个有经验的评价者(对视频压缩失真了解的比较多的)会比那些非有经验性的用户会给出一个更带偏见的评分。这就意味着一个很大的评价用户群是需要的,因为没有经验的用户很快会发现被改变的视频的一些特征。这些因素使得使用DSCQS方式的代价更大。

2.6.2 客观的质量测量
主观测量质量的方法的复杂性和消耗性让用算法自动测量质量要更加的吸

引人。视频压缩的开发者和视频处理系统很大程序上依赖于所谓的客观质量测量方法。最广泛应用的方法是PSNR方法,但是这种方法的局限性使人们不得不找更加复杂的方法来逼近人类视觉性。

2.6.2.1 PSNR
PSNR是用来在对数级上描述质量,并且依赖于原始信号和改变后信号的均方差(MSE):
PSNR(db) = 10log(10)(2^n-1)^2/MSE

PSNR可以很方便而快速地被计算出来,这样它就成为了一种很流行使用的方法,并用来测量压缩和解码视频图像的质量。

PSNR方法有几个局限性,PSNR需要一个原始的图像做为对比,但是这也许是无法在所有情况下都可以实现的,也难保所谓的原始图象没受过影响。PSNR不能准确地给出主观的视频质量值。对于给定的一个图象或一个图象序列来说,高的PSNR通常说明质量高,低PSNR说明质量低。然而,一个特定的PSNR值并不等于绝对的主观的质量。主观上感觉好的图象不一定PSNR值高。这种情况下,人类的观察敏感区中心让人感觉清晰度很好,但信嗓比不一定高。

2.6.2.2 其他的客观质量衡量方法
因为PSNR方法的局限性,最近有很多工作用来开发更加复杂的客观的测试过程,而且表示更准确的主观信息。很多不同的方法都被提出了。但是没有一个可以完全代替主观测试。所以还没有一个比较标准的,准确的,可用的方法。意识到这一点之后,ITU-T视频质量专家组(VQEG)就致力于提出一种客观的视频质量评价机制。每一步就是测试并比较隐藏的模型与测试模型。在2000年三月,VQEG宣布有10个这样的测试系统备选。不幸的是,没有一种被认为是适合的。VQED在2003年进行了第二次的评估。除非非常在自动质量评价中有一个非常大的突破,否则这个问题是很难被解决了。

2.7 结论
采样模拟信号会形成数字视频信号,它有准确,高质量和对于数字媒体的存储传递等各种优势,但是会占用比较在的空间。与生俱来的问题包括空间和时间分辨率,颜色表示和视频质量的测量问题。下一章会介绍视频压缩的一些其他的基本理论.

MPEG4 & H.264学习笔记之二 ------ 视频编码基本概念及时域模型
.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视频包括了一系列的工具来支持基于区域的补偿和编码。

MPEG4 & H.264学习笔记之三 ------ 图像模型(图像处理过程)
3.4 图像模型
一个自然的视频图像包括一格采样值.自然图像在它们原始的状态下通常很难于压缩,这是因为相邻图像采样值之间的很强的联系造成的.我们可以从一幅图像的自相关函数图中得到不同图像之间的相似程度.在中点处的最顶点表示图像未经移动时的图像.当空域移动拷贝被从原始图像的任一个方向移除的时候,这个函数值就会急骤下降,就这说明了一个图像采样值的邻域内是高度相关的.

一个运动补偿的剩余图象的自相关函数在当空域移动增加的时

候快速衰减,表明了相邻的采样点是弱相关的.有效的运动补偿在剩余帧中减少了本地相关性,这样就让图象比原始状态下的图象更易于压缩.图像模型的作用就是把图像或剩余图像的相关性去除掉,并把它转变为一种可以被熵编码器有效编码的数据形式.实际图像模型一般有三个主要的组成部分:变换(去相关和简化数据),量化(减小转换数据的相关性)和重组(组合数据来把大值分组到一起)。

3.4.1 预测图像编码
运动补偿是预测编码的一个实例,在这种补偿下,编码器基于上一帧创造了对于当前帧的一个区域的预测并从当前域中减去这个预测来形成一个剩余帧。如果预测是成功的,那和在剩余帧中的能量是比原始帧中的能量少得多的,而且剩余帧可以用更少的位来表示。

与之相似的是,同一个图像采样或区域的预测可以由前面传输的同样图象或帧中组成.预测性编码被用作是早期的压缩算法的基础,也是H.264的一个很重要的组成部分.帧内编码(应用在变换域中,见后).空域预测有时被描述为"差分脉冲编码调制"(DPCM)--从通信系统中引入的一个差分的PCM编码方法.


B C
A X

图中假设一个像素X是被编码的像素点,如果在光栅顺序下处理这帧的话,那么点A,B和C(在当前和之前行的邻近像素)在编码和解码器中都是可得的(因为他们已经在X之前被解码).编码器在根据一些在之前编码的像素的组合来得到对于X的预测,从X中减掉这个预测,然后编码剩余帧频(做差之后的结果).解压器形成相同的预测,然后把解码的剩余帧加进去来重建像素值.如果编码过程是有损的(比如说剩余帧被量化了)那么解码的像素值A,B,C也许与原始的A,B,C是不同的(因为编码过程的损失),这样的话上述的过程可能在编码器和解码器上引起累积的不匹配.这种情况下,编码器应该解码剩余帧中的R(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)

编码器使用解码的像素值A,B,C来构成重建,比如说,P(X)=(2A+B+C)/4.这样的话,编码器和解码器使用同样的P(X),这样就可以避免错位的发生.

这种方法的压缩的效率依赖于对于P(X)预测的准确性.如果预测是准确的(P(X)与X的值是相近的),那么剩余帧的能量就非常小了.然而,并不是经常都能选择一个对复杂图像来说那么理想的预测器的.编码器就有必要指出对解码端选择预测器,这样就有一个预测和需要的多余位来表示信号和预测器的一个折衷考虑了.

3.4.2 变换编码
3.4.2.1 总述
图像中或视频CODEC中的变换阶段是把图像或运动补偿剩余值转到另一个

域中(变换域中)。变换的选择依赖于以下几个分类
1. 在转换域中的数据是去相关性的(转换域中的数据的大多数能量都会聚集到很小的值中)
2. 转换应该是可逆的.
3. 转换的计算过程应该是易于处理的,

对图像和视频压缩以及很多的变换都建议使用以下两类方式:基于块的变换和基于图像的变换。基于块的变换的例子比如Karhunen-Loeve变换(KLT),单值分解(SVD)和余弦变换(DCT)。每一种变换都是对于N*N的图像块或剩余样本来说的,这样图像就被用块的单元来处理。块变换有很低的内存需求而且很适于基于块的运动补偿剩余帧的压缩,但是受边界区域的影响比较严重。基于图像的变换对于整个图像或帧来进行操作(或一个图像的一大段进行操作)。最常用的图像变换是离散小波变换(DWT或直接说小波变换)。像DWT这样的变换对于表态图像的压缩来说已经被证明是很有效的了,但是它们对内存的消耗都比较大(因为整个图像或段都以单个单元来进行处理)而且不适用于基于块的运动补偿方法。DCT和DWT在MPEG4视频部分中都得到了应用(而且一个DCT的变种在H.264中被使用)。它们将在下面几节被讨论。

3.4.2.2
余弦变换在X中进行运算(X是一个N*N的采样块,通常是指在预测之后的图像采样或剩余帧值)来构造Y,一个N*M的系数块。DCT的操作(及它的反变换IDCT),可以用变换矩阵A来描述。一个N*N采样块的DCT变换由如下式子得到:Y=AXA(T),反DCT变换:Y=AXA(T),A(T)表示A的对称矩阵

X是一个采样的矩阵,Y是一个系统的矩阵,A是一个N*N的变换矩阵。A的元素是:

A(i,j) = C(i) * cos [(2j+1)*i*PI]/2N
C(i)= N^(-1/2) i=0
(2/N)^(-1/2) i>0

一个二维DCT的输出是一组N*N的系数,它表示了图像在DCT域中的块数据,这些系数可以被想成是一组标准基的”权“值。任何图像块都可以由编合所有的N*N标准基来重组,通过这些基乘以相应的权因素值(系数)。

例2 图像块的DCT系数
一个选定的4*4的块,以及DCT系数。这种用DCT域表示块的方法的优点不是很明显的,因为并没有减少存储的空间,原来我们存16个像素值,我们现在成了需要存16个DCT系数。DCT的实用性当块被从系数的一个子集中构建出来的时候表现了出来:

把除去一些很大的值之外的所有的系数设为0,执行IDCT之后的结果如下图:在IDCT之前加入更多的系数可以形成渐近的更加准确的对原图的重建。这样,就可能从从一个子集的系数集中近似于原始的图像。删除系数中的小系数值(比如说通过量化)可以让图像数据在更少的系数表示位中表示出来,尽管这样做会影响图像的质量。


3.4.2.3 小波
流行的"小波变换"要(基于一系列系数与

离散小波函数相等的滤波器来进行图像压缩的一种广泛使用的方法).一个应用于有N个采样结果的离散信号的离散小波变换的基本运行过程如下.一对滤波器被用来把信号分解为一个低频部分(L)和一个高频部分(H).每个波段由因子2被子采样化,这样这两个频率波都含有N/2个采样点。如果正确选择了滤波器的话,这个操作过程是可逆的。

这种方法可以被扩展应用到一个二维的信号上,比如说灰度图中。一个2D图的每一行都被经过低通和高通的滤波(Lx和Hx),每个滤波器的输出被下采样用来制造中间图像L和H。L是原始图象的低通滤波,并通过在x方向进行下采样的结果.H是原图像的高通滤波并在x方向的下采样结果。接下来,这些新图的每一列都使用低和高通的滤波器(Ly和Hy),并经过下采样来制造出四个子图象(LL,LH,HL,HH)。这四个子图象可以被组合为与原图的采样数相同的图象。LL是原图通过在水平和垂直方向经过低通,并用因素2进行子采样的结果。HL是通过在垂直方向经过高通滤波并包含了剩余垂直频率的结果。LH是通过在水平方向高通滤波并包含了剩余的水平频的结果,而HH是通过在水平和垂直两个方向进行高通滤波的结果。它们之间,四个图像包含了所有的原始图像的信息,但是LH,HL,HH的稀疏性使它们更加容易压缩。

在图像压缩程序中,二维的小波分解被继续应用到LL图中,来组成四个新的子图。得到的新的低通图象继续被得到子图象。很多高频的采样结果都是接近0的,它就可以通过把小值来移除来达到更优化的传输。在解码端,原图像通过上采样,滤波和加值被重建。

3.4.3 量化
量化器把一个在值域X的信号量化减为到值域Y中。使用更小的位来表示量化后的信号是可行的,因为转换后的值域比原来更小了。一个标量的量化器把输入的信号映射到一个量化的输出值域中,而一个向量的量化器把一组输入采样值映射到一组量化值中。

3.4.3.1 标量量化
标量量化的一个简单的例子就是把小数近似到最近的整数上,比如,从R到Z的映射。这个过程是有损的(不可逆的)因为它是无法从被近似后的结果来恢复出原来的小数的。

一个量化的更加通用的例子就是:
FQ = round (X/QP)
Y=FQ * QP

这里QP是量化的步长。量化输出级间隔单一的QP间断值。

在图像或视频的CODEC中,量化操作通常由两部分构成:编码端的前向量化FQ,和解码端的反量化(IQ).(事实上量化是不可逆的,这样用一个更准确的叫法的话:标量器和重标量器。在两个标量值之间的QP步长是一个重要的参数。如果步长很长的话,那么量化值的范围就很小,这样的话就可以在传输过程中被更有效

地被表示(高压缩比地压缩).但是重量化值是原信号值的近似。如果步长很小的话,重量化值与原始信号更加匹配,但是量化值就落到一个更大的范围之内,就降低了压缩的效率。


量化可以被用来在像DCT或小波变换之后,除去了小系数之后降低图像数据的精确度。一个图像或视频的前向量化器设计为映射小系数值到0而保留一部分大系数值。前向量化器的输出通常是一个稀疏的量化系数的数组,大都为0。

3.4.3.2 向量量化
一个向量量化器把一系列的输入数据(比如一块图像采样)映射到一个单值(codeword),而在解码端,每个单值(codeword)都映射到一个对于原始输入数据的近似。这组向量保存在编码和解码端,被用来当作一个编码表。在图像压缩中一个典型的向量量化程序如下:

1. 把原始图像分区(比如M × N像素块)
2. 从编码表中选择一个与当前区域最相近的向量
3. 把选定的向量的序号传给解码器
4. 在解码端,用选定的向量来重建一个原始图像的拷贝。

量化是被用在空间域中(比如说用向量量化过的图像采样组),但是它也可以被用在运动补偿或变换数据中.向量量化设计中的关键问题包含编码表的设计和在编码表中有效都查找最优化的向量的问题。

3.4.4 重排列和零编码
量化过的变换系数需要被仔细编码来进行存储和传输。在基于变换的图像或视频编码器上,量化器的输出是一个稀疏的数组,它包含了一些非0的系数和很多的0值系数。重排(把非0系数进行重组)和有效地表示0系数要在熵编码前进行操作。这些过程在DCT和小波变换中被提到了。

3.4.4.1 DCT
系数分布
一块图像或剩余采样的大的DCT系数通常都是在DC(0,0)系数“低频”部分。DCT系数的非0系数都聚在上顶部系数,而分布在水平和垂直方向是大约对称的。对于剩余区域来说,聚集在DC位置的系数是歪斜的,比如说,更多的非0系数在左手边出现。这是因为区域图片在垂直方向有很强的高频成分(因为在垂直方向的子采样),这样因为垂直频率的原因得到了更大的DCT系数。

扫描
在量化之后,块的DCT系数被重排以把非0系数进行组合,以使对于剩余0值的表示方法更加有效。优化的重组方法(扫描方法)依赖于非0DCT系数的分布情况。对于经典的一帧来说,合适的扫描方式应该是zigzag法,它是从左上角的DC系数开始的.从DC系数开始,每一个量化的系数被拷贝到一维数组里面。非0系数在重排数列的最前端被重组,而在之后是很长序列的0值。

zigzag扫描扫描方式对于一个域块可能并不是理想的,因为系数是歪斜分布的,那么一个修改后的扫描顺序可会是有效的,比如说左边的系数在

右边系数扫描之前被扫描。


运行级编码
重排过程的输出是一个通常在开始端包含一个或多个簇的非0系数,后面的是一串0值系数。这些0值被编码而实现更优化的表示方法,比如说,通过表示一串0里面的数量来缩减表示位数等等。

例如:
输入数组:16,0,0,-3,5,6,0,0,0,0,-7, . . .
输出值: (0,16),(2,-3),(0,5),(0,6),(4,-7). . .

DCT系数高频部分常被量化为0,这样一个重排的块通常以一串0结尾。一个特殊情况是需要指出一个块中的最后一个非0系数。在所谓的二维运行级编码被使用。每一个运行级对被用上面的方式进行编码,而一个单独的编码符号"last",用来指出最后一个0值的位置。如果三维的运行级编码被使用的话,每个符号编码要编三个量化值:运行度,级数以及最后非0值。如上例就可以写为:
(0, 16, 0), (2,-3, 0), (0, 5, 0), (0, 6, 0), (4,-7, 1)

最后一个码中的1表示这是这个块中最后一个非0值。

3.4.4.2 小波
系数分布
很多在高子波中的系数(右下方的系数值)都是接近于0值的,可以被量化到0而不损失图像的质量。非0系数对应于图像的结构,比如说,在violin图中,弓就有很清晰的垂直结构。当低频中的系数是非0时,有很大的可能性在高频相应的系数也是0。这们设想一个非0的量化系数树,以在低频中根部开始。在第一层的一个单个LL的系数在其他的第一层有相应的系数值。第一层系数位置映射到四个相应的子段的同一位置的系数位置.

零树编码
在熵编码之前越好地编码非0小波系数就越好.达到这一点的一个有效的方法就是从最低层开始编码每个非0系数树.最低层的系数需要被编码,接着是它在高层的子系数,如此反复.编码过程在树达到0值系数的时候一直运行.之后的的全0值的层的子层值都为0.在解码端,重建过程从树根开始,非0系数被解码并重建,当遇到零树的时候,所有的剩余的子结点都被设为0.这嵌入零树(EZW)的小波系数编码方法.编码过程包含一种其他的可能性,0值系数可能跟着(a)一个零树(就像原来那样),或(b)一个非零的子系数阵.(b)不常发生,但是如果考虑到这些不常发生的情况的时候,重建图像的质量会被轻微地提高.

3.4 图像模型
一个自然的视频图像包括一格采样值.自然图像在它们原始的状态下通常很难于压缩,这是因为相邻图像采样值之间的很强的联系造成的.我们可以从一幅图像的自相关函数图中得到不同图像之间的相似程度.在中点处的最顶点表示图像未经移动时的图像.当空域移动拷贝被从原始图像的任一个方向移除的时候,这个函数值就会急骤下降,就这说明了一个图像采样值的邻域内是高度相关的.

一个运动补偿的剩余图象的

自相关函数在当空域移动增加的时候快速衰减,表明了相邻的采样点是弱相关的.有效的运动补偿在剩余帧中减少了本地相关性,这样就让图象比原始状态下的图象更易于压缩.图像模型的作用就是把图像或剩余图像的相关性去除掉,并把它转变为一种可以被熵编码器有效编码的数据形式.实际图像模型一般有三个主要的组成部分:变换(去相关和简化数据),量化(减小转换数据的相关性)和重组(组合数据来把大值分组到一起)。

3.4.1 预测图像编码
运动补偿是预测编码的一个实例,在这种补偿下,编码器基于上一帧创造了对于当前帧的一个区域的预测并从当前域中减去这个预测来形成一个剩余帧。如果预测是成功的,那和在剩余帧中的能量是比原始帧中的能量少得多的,而且剩余帧可以用更少的位来表示。

与之相似的是,同一个图像采样或区域的预测可以由前面传输的同样图象或帧中组成.预测性编码被用作是早期的压缩算法的基础,也是H.264的一个很重要的组成部分.帧内编码(应用在变换域中,见后).空域预测有时被描述为"差分脉冲编码调制"(DPCM)--从通信系统中引入的一个差分的PCM编码方法.


B C
A X

图中假设一个像素X是被编码的像素点,如果在光栅顺序下处理这帧的话,那么点A,B和C(在当前和之前行的邻近像素)在编码和解码器中都是可得的(因为他们已经在X之前被解码).编码器在根据一些在之前编码的像素的组合来得到对于X的预测,从X中减掉这个预测,然后编码剩余帧频(做差之后的结果).解压器形成相同的预测,然后把解码的剩余帧加进去来重建像素值.如果编码过程是有损的(比如说剩余帧被量化了)那么解码的像素值A,B,C也许与原始的A,B,C是不同的(因为编码过程的损失),这样的话上述的过程可能在编码器和解码器上引起累积的不匹配.这种情况下,编码器应该解码剩余帧中的R(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)

编码器使用解码的像素值A,B,C来构成重建,比如说,P(X)=(2A+B+C)/4.这样的话,编码器和解码器使用同样的P(X),这样就可以避免错位的发生.

这种方法的压缩的效率依赖于对于P(X)预测的准确性.如果预测是准确的(P(X)与X的值是相近的),那么剩余帧的能量就非常小了.然而,并不是经常都能选择一个对复杂图像来说那么理想的预测器的.编码器就有必要指出对解码端选择预测器,这样就有一个预测和需要的多余位来表示信号和预测器的一个折衷考虑了.

3.4.2 变换编码
3.4.2.1 总述
图像中或视频CODEC中的变换阶段是把

图像或运动补偿剩余值转到另一个域中(变换域中)。变换的选择依赖于以下几个分类
1. 在转换域中的数据是去相关性的(转换域中的数据的大多数能量都会聚集到很小的值中)
2. 转换应该是可逆的.
3. 转换的计算过程应该是易于处理的,

对图像和视频压缩以及很多的变换都建议使用以下两类方式:基于块的变换和基于图像的变换。基于块的变换的例子比如Karhunen-Loeve变换(KLT),单值分解(SVD)和余弦变换(DCT)。每一种变换都是对于N*N的图像块或剩余样本来说的,这样图像就被用块的单元来处理。块变换有很低的内存需求而且很适于基于块的运动补偿剩余帧的压缩,但是受边界区域的影响比较严重。基于图像的变换对于整个图像或帧来进行操作(或一个图像的一大段进行操作)。最常用的图像变换是离散小波变换(DWT或直接说小波变换)。像DWT这样的变换对于表态图像的压缩来说已经被证明是很有效的了,但是它们对内存的消耗都比较大(因为整个图像或段都以单个单元来进行处理)而且不适用于基于块的运动补偿方法。DCT和DWT在MPEG4视频部分中都得到了应用(而且一个DCT的变种在H.264中被使用)。它们将在下面几节被讨论。

3.4.2.2
余弦变换在X中进行运算(X是一个N*N的采样块,通常是指在预测之后的图像采样或剩余帧值)来构造Y,一个N*M的系数块。DCT的操作(及它的反变换IDCT),可以用变换矩阵A来描述。一个N*N采样块的DCT变换由如下式子得到:Y=AXA(T),反DCT变换:Y=AXA(T),A(T)表示A的对称矩阵

X是一个采样的矩阵,Y是一个系统的矩阵,A是一个N*N的变换矩阵。A的元素是:

A(i,j) = C(i) * cos [(2j+1)*i*PI]/2N
C(i)= N^(-1/2) i=0
(2/N)^(-1/2) i>0

一个二维DCT的输出是一组N*N的系数,它表示了图像在DCT域中的块数据,这些系数可以被想成是一组标准基的”权“值。任何图像块都可以由编合所有的N*N标准基来重组,通过这些基乘以相应的权因素值(系数)。

例2 图像块的DCT系数
一个选定的4*4的块,以及DCT系数。这种用DCT域表示块的方法的优点不是很明显的,因为并没有减少存储的空间,原来我们存16个像素值,我们现在成了需要存16个DCT系数。DCT的实用性当块被从系数的一个子集中构建出来的时候表现了出来:

把除去一些很大的值之外的所有的系数设为0,执行IDCT之后的结果如下图:在IDCT之前加入更多的系数可以形成渐近的更加准确的对原图的重建。这样,就可能从从一个子集的系数集中近似于原始的图像。删除系数中的小系数值(比如说通过量化)可以让图像数据在更少的系数表示位中表示出来,尽管这样做会影响图像的质量。


3.4.2.3 小波
流行的"

小波变换"要(基于一系列系数与离散小波函数相等的滤波器来进行图像压缩的一种广泛使用的方法).一个应用于有N个采样结果的离散信号的离散小波变换的基本运行过程如下.一对滤波器被用来把信号分解为一个低频部分(L)和一个高频部分(H).每个波段由因子2被子采样化,这样这两个频率波都含有N/2个采样点。如果正确选择了滤波器的话,这个操作过程是可逆的。

这种方法可以被扩展应用到一个二维的信号上,比如说灰度图中。一个2D图的每一行都被经过低通和高通的滤波(Lx和Hx),每个滤波器的输出被下采样用来制造中间图像L和H。L是原始图象的低通滤波,并通过在x方向进行下采样的结果.H是原图像的高通滤波并在x方向的下采样结果。接下来,这些新图的每一列都使用低和高通的滤波器(Ly和Hy),并经过下采样来制造出四个子图象(LL,LH,HL,HH)。这四个子图象可以被组合为与原图的采样数相同的图象。LL是原图通过在水平和垂直方向经过低通,并用因素2进行子采样的结果。HL是通过在垂直方向经过高通滤波并包含了剩余垂直频率的结果。LH是通过在水平方向高通滤波并包含了剩余的水平频的结果,而HH是通过在水平和垂直两个方向进行高通滤波的结果。它们之间,四个图像包含了所有的原始图像的信息,但是LH,HL,HH的稀疏性使它们更加容易压缩。

在图像压缩程序中,二维的小波分解被继续应用到LL图中,来组成四个新的子图。得到的新的低通图象继续被得到子图象。很多高频的采样结果都是接近0的,它就可以通过把小值来移除来达到更优化的传输。在解码端,原图像通过上采样,滤波和加值被重建。

3.4.3 量化
量化器把一个在值域X的信号量化减为到值域Y中。使用更小的位来表示量化后的信号是可行的,因为转换后的值域比原来更小了。一个标量的量化器把输入的信号映射到一个量化的输出值域中,而一个向量的量化器把一组输入采样值映射到一组量化值中。

3.4.3.1 标量量化
标量量化的一个简单的例子就是把小数近似到最近的整数上,比如,从R到Z的映射。这个过程是有损的(不可逆的)因为它是无法从被近似后的结果来恢复出原来的小数的。

一个量化的更加通用的例子就是:
FQ = round (X/QP)
Y=FQ * QP

这里QP是量化的步长。量化输出级间隔单一的QP间断值。

在图像或视频的CODEC中,量化操作通常由两部分构成:编码端的前向量化FQ,和解码端的反量化(IQ).(事实上量化是不可逆的,这样用一个更准确的叫法的话:标量器和重标量器。在两个标量值之间的QP步长是一个重要的参数。如果步长很长的话,那么量化值的范围就很小,这样

的话就可以在传输过程中被更有效地被表示(高压缩比地压缩).但是重量化值是原信号值的近似。如果步长很小的话,重量化值与原始信号更加匹配,但是量化值就落到一个更大的范围之内,就降低了压缩的效率。


量化可以被用来在像DCT或小波变换之后,除去了小系数之后降低图像数据的精确度。一个图像或视频的前向量化器设计为映射小系数值到0而保留一部分大系数值。前向量化器的输出通常是一个稀疏的量化系数的数组,大都为0。

3.4.3.2 向量量化
一个向量量化器把一系列的输入数据(比如一块图像采样)映射到一个单值(codeword),而在解码端,每个单值(codeword)都映射到一个对于原始输入数据的近似。这组向量保存在编码和解码端,被用来当作一个编码表。在图像压缩中一个典型的向量量化程序如下:

1. 把原始图像分区(比如M × N像素块)
2. 从编码表中选择一个与当前区域最相近的向量
3. 把选定的向量的序号传给解码器
4. 在解码端,用选定的向量来重建一个原始图像的拷贝。

量化是被用在空间域中(比如说用向量量化过的图像采样组),但是它也可以被用在运动补偿或变换数据中.向量量化设计中的关键问题包含编码表的设计和在编码表中有效都查找最优化的向量的问题。

3.4.4 重排列和零编码
量化过的变换系数需要被仔细编码来进行存储和传输。在基于变换的图像或视频编码器上,量化器的输出是一个稀疏的数组,它包含了一些非0的系数和很多的0值系数。重排(把非0系数进行重组)和有效地表示0系数要在熵编码前进行操作。这些过程在DCT和小波变换中被提到了。

3.4.4.1 DCT
系数分布
一块图像或剩余采样的大的DCT系数通常都是在DC(0,0)系数“低频”部分。DCT系数的非0系数都聚在上顶部系数,而分布在水平和垂直方向是大约对称的。对于剩余区域来说,聚集在DC位置的系数是歪斜的,比如说,更多的非0系数在左手边出现。这是因为区域图片在垂直方向有很强的高频成分(因为在垂直方向的子采样),这样因为垂直频率的原因得到了更大的DCT系数。

扫描
在量化之后,块的DCT系数被重排以把非0系数进行组合,以使对于剩余0值的表示方法更加有效。优化的重组方法(扫描方法)依赖于非0DCT系数的分布情况。对于经典的一帧来说,合适的扫描方式应该是zigzag法,它是从左上角的DC系数开始的.从DC系数开始,每一个量化的系数被拷贝到一维数组里面。非0系数在重排数列的最前端被重组,而在之后是很长序列的0值。

zigzag扫描扫描方式对于一个域块可能并不是理想的,因为系数是歪斜分布的,那么一个修改后的扫描顺序可会

相关文档