资源描述:
《能够对 JEG 图形压缩有一定感性的认识, 但其数学.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、能够对JPEG图形压缩有一定感性的认识,但其数学原理不需要搞清.能够通过这, 开始写自己的编码/解码程序.或者看懂以有的代码.对有损图形压缩有进一步了解. 自己能够改良JPEG,比如增加透明色的支持,加快JPEG的解码速度.JPEG压缩简介-------------1.色彩模型 JPEG的图片使用的是YCrCb颜色模型,而不是计算机上最常用的RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb模型更适合图形压缩.因为人眼对图片上的亮度Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit的亮度
2、值,每2x2个点保存一个CrCb值,而图象在肉眼中的感觉不会起太大的变化.所以,原来用RGB模型,4个点需要4x3=12字节.而现在仅需要4+2=6字节;平均每个点占12bit.当然JPEG格式里允许每个点的C值都记录下来;不过MPEG里都是按12bit一个点来存放的,我们简写为YUV12.[RGB]->[YCbCr]转换-------------------------(R,G,B都是8bitunsigned)
3、Y
4、
5、 0.299 0.587 0.114
6、
7、R
8、
9、
10、0
11、
12、Cb
13、 =
14、-0.1687 -0.3313 0.5
15、*
16、G
17、 +
18、128
19、
20、Cr
21、
22、 0.5 -0.4187 -0.0813
23、
24、B
25、
26、128
27、Y=0.299*R+0.587*G+0.114*B (亮度)Cb= -0.1687*R-0.3313*G+0.5 *B+128Cr= 0.5 *R-0.4187*G-0.0813*B+128[Y,Cb,Cr]->[R,G,B]转换-------------------------R=
28、Y +1.402 *(Cr-128)G=Y-0.34414*(Cb-128)-0.71414*(Cr-128)B=Y+1.772 *(Cb-128) 一般,C值(包括CbCr)应该是一个有符号的数字,但这里被处理过了,方法是加上了128.JPEG里的数据都是无符号8bit的.2.DCT(离散余弦变换) JPEG里,要对数据压缩,先要做一次DCT变换.DCT变换的原理,涉及到数学知识,这里我们不必深究.反正和傅立叶变换(学过高数的都知道)是差不多了.经过这个变换,就把图片里点和
29、点间的规律呈现出来了,更方便压缩.JPEG里是对每8x8个点为一个单位处理的.所以如果原始图片的长宽不是8的倍数,都需要先补成8的倍数,好一块块的处理.另外,记得刚才我说的CrCb都是2x2记录一次吗?所以大多数情况,是要补成16x16的整数块.按从左到右,从上到下的次序排列(和我们写字的次序一样).JPEG里是对YCrCb分别做DCT变换的.这里进行DCT变换的Y,Cr,Cb值的范围都是-128~127.(Y被减去128) JPEG编码时使用的是ForwardDCT(FDCT)解码时使用的InverseDCT(I
30、DCT)下面给出公式:FDCT: 7 7 2*x+1 2*y+1F(u,v)=alpha(u)*alpha(v)*sumsumf(x,y)*cos(-------*u*PI)*cos(------*v*PI) x=0y=0 16 16u,v=0,1,...,7 {1/sqrt
31、(8) (u==0)alpha(u)={ {1/2 (u!=0)IDCT: 7 7 2*x+1 2*y+1f(x,y)=sumsumalpha(u)*alpha(v)*F(u,v)*cos(-------*u*PI)*cos(------*v*PI) u=0v=0 16 16
32、x,y=0,1...7 这个步骤很花时间,另外有种AA&N优化算法,大家可以去inet自己找一下.在Intel主页上可以找到AA&NIDCT的MMX优化代码.(Intel主页上的代码,输入数据为12.4的定点数,输入矩阵需要转置90度)3.重排列DCT结果 DCT将一个8x8的数组变换成另一个8x8的数组.但是内存里所有