发布网友 发布时间:2022-04-30 18:24
共1个回答
热心网友 时间:2022-06-29 03:24
H.264和MPEG4 的压缩算法 (一) 形成二进制I帧数据1、8×8的宏块经过DCT变化;2、经过quant量化系数处理;3、经过之字形(Zigzag)扫描;形成0101的二进制数据; (二) 形成帧间预测帧1、 I帧的二进制数据通过逆向dequant量化系数变化再通过逆向DCT变化形成下个P帧的参考帧;2、 P帧中的宏块进行运动匹配,在I帧中找到最相似的宏块;3、 记录这两个宏块的(level、run、last)等信息,然后这两个宏块进行残差运算(会形成很多0),然后在进行DCT、quant、之字形(Zigzag)扫描和双扫描后形成二进制可压缩数据;4、 然后P帧复原后在形成下一帧的参考帧; 以上是MPEG4和H.264的标准过程,H.264在此基础上更新了很多。一、帧内预测:帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性。因此,在对一给定宏块编码时,首先可以根据周围的宏块预测(典型的是根据左上角的宏块,因为此宏块已经被编码处理),然后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,可以大大减小码率。H.264提供6种模式进行4×4像素宏块预测,包括1种直流预测和5种方向预测,如图2所示。在图中,相邻块的A到I共9个像素均已经被编码,可以被用以预测,如果我们选择模式4,那么,a、b、c、d4个像素被预测为与E相等的值,e、f、g、h4个像素被预测为与F相等的值,对于图像中含有很少空间信息的平坦区,H.264也支持16×16的帧内编码。 图2 帧内编码模式二、小尺寸4×4的dct整数变换视频压缩编码中以往的常用单位为8×8块。在H.264中却采用小尺寸的4×4块,由于变换块的尺寸变小了,运动物体的划分就更为精确。这种情况下,图像变换过程中的计算量小了,而且在运动物体边缘的衔接误差也大为减少。 当图像中有较大面积的平滑区域时,为了不产生因小尺寸变换带来的块间灰度差异,H.264可对帧内宏块亮度数据的16个4×4块的DCT系数进行第二次4×4块的变换,对色度数据的4个4×4块的DC系数(每个小块一个,共4个DC系数)进行2×2块的变换。H.263不仅使图像变换块尺寸变小,而且这个变换是整数操作,而不是实数运算,即编码器和解码器的变换和反变换的精度相同,没有“反变换误差”。与浮点运算相比,整数DCT变换会引起一些额外的误差,但因为DCT变换后的量化也存在量化误差,与之相比,整数DCT变换引起的量化误差影响并不大。此外,整数DCT变换还具有减少运算量和复杂度,有利于向定点DSP移植的优点。 三、多种更好的运动估计高精度估计在H.263中采用了半像素估计,在H.264中则进一步采用1/4像素甚至1/8像素的运动估计。即真正的运动矢量的位移可能是以1/4甚至1/8像素为基本单位的。显然,运动矢量位移的精度越高,则帧间剩余误差越小,传输码率越低,即压缩比越高。在H.264中采用了6阶FIR滤波器的内插获得1/2像素位置的值。当1/2像素值获得后, 1/4像素值可通过线性内插获得,对于4:1:1的视频格式,亮度信号的1/4 像素精度对应于色度部分的1/8像素的运动矢量,因此需要对色度信号进行1/8像素的内插运算。理论上,如果将运动补偿的精度增加一倍(例如从整像素精度提高到1/2像素精度),可有0.5bit/Sample的编码增益,但实际验证发现在运动矢量精度超过1/8像素后,系统基本上就没有明显增益了,因此,在H.264中,只采用了1/4像素精度的运动矢量模式,而不是采用1/8像素的精度。多宏块划分模式估计在H.264的预测模式中,一个宏块(MB)可划分成7种不同模式的尺寸,这种多模式的灵活、细微的宏块划分,更切合图像中的实际运动物体的形状,于是,在每个宏块中可包含有1、2、4、8或16个运动矢量。多参数帧估计,安联锐视 http://www.raysharp.cn 是领先的DVR制造商,采用H.264编码,在H.264中,可采用多个参数帧的运动估计,即在编码器的缓存中存有多个刚刚编码好的参数帧,编码器从其中选择一个给出更好的编码效果的作为参数帧,并指出是哪个帧被用于预测,这样就可获得比只用上一个刚编码好的帧作为预测帧的更好的编码效果。 四、环路滤波:H.264/MPEG-4 AVC标准定义了一个对16X16宏块和4X4块边界的解块过滤过程。在宏块这种情况下,过滤的目的是消除由于相邻宏块有不同的运动估计类型(比如运动估计和内部估计)或者不同的量化参数导致的人工痕迹。在块边界这种情况下,过滤的目的是消除可能由于变换/量化和来自于相邻块运动矢量的差别引起的人工痕迹。环路滤波通过一个内容自适应的非线性算法修改在宏块/块边界的同一边的两个像素。 H.264抗块效应滤波器 一、对抗块效应滤波器的描述应用抗块效应滤波器的目的是为了减少块失真。抗块效应滤波器是在编码器和解码器的反变换之后应用的。滤波器有两种好处:(a)平滑块边缘,改善解码图像质量(特别是在较高的压缩比时);(b)为了在编码器中对后面的帧进行运动补偿预测,使用滤波宏块,造成预测后产生一个较小的残差。操作过程是这样的:对帧内编码宏块进行滤波,使用未滤波的重建宏块形成预测帧,进行帧内预测,但整幅图像边缘不被滤波。按下列顺序,对一个宏块中垂直或水平4×4的边缘块进行滤波:(1)对亮度分量的4个垂直边界进行滤波(在图1中按a,b,c,d的顺序);(2)对亮度分量的4个水平边界进行滤波(在图1中按e,f,g,h的顺序);(3)对每个色度分量2个垂直边界进行滤波(i,j);(4)对每个色度分量的2个水平边界进行滤波(k,l)。每个滤波运算影响到边界两侧的三个像素。图2显示了相邻块p和q(p0,p1,p2,p3和q0,q1,q2,q3)的垂直或水平边界两侧的4个像素。邻近的块编码模式和穿过图像抽样值边界的梯度,取决于目前的量化器,可能造成一些后果:(a)没有像素被滤波。(b)p0,p1,p2,q0,q1,q2被滤波,输出像素P0,P1,P2,Q0,Q1和Q2。 五、熵编码在熵编码之前,4X4的量化系数必须被重排序。根据这些系数原来采用的预测算法为运动估计或者内部估计的不同来选择不同的扫描类型创建一个重排序的串行化流。扫描类型按照从低频到高频的顺序排序这些系数。既然高频系数大多数趋向于零,那么利用游程编码就可以缩减零的数目,从而高效的达到熵编码的目的。在熵编码步骤通过映射符号的字节流来表示运动矢量,量化系数和宏块头。熵编码通过设计用一个较少的比特位数来表示频繁使用的符号,比较多的比特位数来表示不经常使用的符号。