分类:
2011-06-02 02:41:06
原文地址:H.264视频压缩编码学习笔记 作者:xn_liu
原文地址:
H.264视频压缩编码学习笔记
一幅图片是由一个个的像素点组成的,作为有色光的三基色,红绿蓝(RGB)可以以一定的比例混合出任何颜色,所以一幅彩色图片的每个像素都可以用RGB三个分量来表现自己,常见的每个分量用8位,这样一个像素需要3×8=24位,而一幅图片就是一个每元素24位的二维数组。但是研究发现人眼对颜色的敏感比不上对亮度的敏感,因此可以将亮度分量从色度分量中提取出来而以较少的位来表示色度信息,从而更加有效的表示彩色空间。
因此与RGB相对,另一种颜色空间为Y:Cr:Cb,这里Y为亮度分类,即一幅彩色图片的黑白版本,由RGB加权平均得出。Cr,Cb是R,B与Y之差,为色差信息,因Cr+Cb+Cg为常数,所以Cg无需传输。
RGB与Y:Cr:Cb转换公式
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
利用人眼对亮度敏感的优势,在一幅彩色图片中,我们可以交叉地使一些点只有亮度分量没有色度分量,而不被人眼察觉。
4:2:2采样(YUY2):对于图像数组每隔一列只采样Y分量。
4:2:0采样(YV12):每隔一列和一行只采样Y分量。
因此4:2:0采样的图像只有1/4的像素是24位的,其余3/4的像素只有Y分量的8位,即平均每像素1/4×24+3/4×8=12位,这也是为什么它在FOURCC代码中的表示为YV12。
一个视频编码器的主要功能有:
1,滤波。消除视频源中的干扰信号。
2,源模型编码。把视频变换成一种易于压缩的格式。
3,熵编码。无损压缩上一步得到的数据。
最关键的是第二步了。在这里视频编码被分为帧内编码(Intra-frame Coding)和帧间编码(Inter-frame coding),视频无非是一张张连续的图片,帧内编码就相当于压缩一张图片,因为组成一段视频的图片有一定的相似性,据此我们可以只完全编码压缩某一帧图片,该帧称为I帧,其后的帧只保存那一帧与I帧或基于I帧的某种运动预测后的图片的差别,如果是连续的场景,物体的运动预测又足够准确的话,这种差别是很小的,因此我们只需保存很小的数据量就能恢复出原图像。运动预测的一般方法:把当前帧的某个区块向各个方向移动几格,并与下一帧的对应区块进行比较(通过计算两个图像数组的均方差),保留均方差最小的那个方向做为运动矢量,用于解编码。这个过程会用到各种不同的搜索方式和大量的比较运算,是衡量一个编码器好坏的关键。
编码步骤
变换编码。因为一幅图像的各个部分的空间相关性很高,不利于直接压缩。变换编码就是把图像用一种各部分相关性弱的形式表示,这样就可以去掉一些不重要的点,来进行有损压缩。其实质就是一个24位二进制数的二维数组,从一个各值很平均的形式变到另一种各值落差很大的形式,当然这个过程应该是可逆的。通常落差很大意味着有很多值在零值附近,通过量化就可以变成一个有很多零值的稀疏矩阵。
量化过程可以理解为把数组中所有的值除以一个数N,这样小于N的数就变成了0,而那些大数需要被传输的位数也降低了,其恢复过程为整个数组乘以N,那些在除法过程中被舍弃的位数就成了不可恢复的误差了。
常见的变换编码有DCT和小波变换。
熵编码,根据统计信息将频繁出现的符号用较少的比特表示,不经常出现的符号用较多的比特表示,进而达到对数据压缩的目的,而在此之前往往会通过游程编码重新排列数组,以使更多的零排在一起。这些排在一起的零将通过(run,level)编码,用一个符号表示。
显然最直接的熵编码算法是哈夫曼编码,但实际应用中的熵编码会更加复杂。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/houdiney/archive/2009/03/09/3974429.aspx