资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JPEG图像格式详解JPEG压缩简介1. 色彩模型JPEG的图片使用的是 YCrCb颜色模型,而不是计算机上最常用的RGB.关于色彩模型, 这里不多阐述. 只是说明, YCrCb 模型更适合图形压缩. 因为人眼对图片上 的亮度 Y 的变化远比色度 C 的变化敏感. 我们完全可以每个点保存一个 8bit 的亮 度值, 每 2x2 个点保存一个 Cr Cb 值, 而图象在肉眼中的感觉不会起太大的变化. 所以,原来用RGB模型,4个点需要4x3=12字节.而现在仅需要 4+2=6字节;平 均每个点占12bit.当然JPEG格式里允许每个点的C值都记录下来; 不过MPEG里都是按 12bit 一个点来存放的, 我们简写为 YUV12.R G B - Y Cb Cr 转换(R,G,B都是 8bitunsigned)|Y| 0.2990.5870.114 |R|0| Cb |=|- 0.1687- 0.33130.5 | * |G|+ |128| Cr | 0.5- 0.4187- 0.0813|B|128|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 转换+ 1.402*(Cr-128)- 0.71414*(Cr-128)R= YG= Y - 0.34414*(Cb-128)B = Y + 1.772*(Cb-128)一般, C 值 (包括 Cb Cr) 应该是一个有符号的数字, 但这里被处理过了, 方法 是加上了 128. JPEG 里的数据都是无符号 8bit 的.2. DCT ( 离散余弦变换)JPEG里,要对数据压缩, 先要做一次 DCT变换.DCT变换的原理,涉及到数学 知识, 这里我们不必深究. 反正和傅立叶变换 (学过高数的都知道) 是差不多了. 经过 这个变换,就把图片里点和点间的规律呈现出来了,更方便压缩.JPEG里是对每8x8个点为一个单位处理的. 所以如果原始图片的长宽不是 8 的倍数, 都需要先补成 8 的倍数, 好一块块的处理. 另外, 记得刚才我说的 Cr Cb 都是 2x2 记录一次吗? 所 以大多数情况, 是要补成 16x16 的整数块 . 按从左到右, 从上到下的次序排列 (和我 们写字的次序一样).JPEG里是对 Y Cr Cb分别做 DCT变换的.这里进行 DCT变换 的 Y, Cr, Cb 值的范围都是 -128127. (Y 被减去 128)JPEG编码时使用的是面给出公式:Forward DCT (FDCT) 解码时使用的Inverse DCT(IDCT)FDCT:772*x+12*y+1F(u,v) =alpha(u)*alpha(v)*sum sum f(x,y)* cos ( *u*PI)* cos( *v*PI)x=0 y=01616u,v = 0,1,.,71/sqrt(8)(u=0)alpha(u)=1/2(u!=0)IDCT:772*x+12*y+1f(x,y) =sumsum alpha(u)*alpha(v)*F(u,v)*cos( *u*PI)* cos (-*v*PI)u=0v=01616x,y=0,1.7这个步骤很花时间, 另外有种 AA&N 优化算法, 大家可以去 inet 自己找一下.在Intel 主页上可以找到 AA&NIDCT的MMX优化代码.(Intel主页上的代码,输入数据为 12.4 的定点数, 输入矩阵需要转置 90 度)3. 重排列DCT结果DCT将一个8x8的数组变换成另一个8x8的数组.但是内存里所有数据都是线形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下行开始的点就 没有什么关系,所以JPEG规定按如下次序整理64个数字.0, 1, 5, 6,14,15,27,28,2, 4, 7,13,16,26,29,42,3, 8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20.22.33.38.46.51.55.60,21.34.37.47.50.56.59.61,35,36,48,49,57,58,62,63这样数列里的相邻点在图片上也是相邻的了.4. 量化对于前面得到的 64 个空间频率振幅值, 我们将对它们作幅度分层量化操作 . 方 法就是分别除以量化表里对应值并四舍五入.for (i = 0 ; i (5,10111)-30 - (5,00001)-8 - (4,0111)1 - (1,1)前面的那串数字就变成了:(0,6), 111001 ; (0,6), 101101 ; (4,5), 10111; (1,5), 00001; (0,4) , 0111 ; (2,1), 1 ; (0,0)括号里的数值正好合成一个字节. 后面被编码的数字表示范围是-32767.32767.合成的字节里, 高 4 位是前续 0 的个数, 低 4 位描述了后面数字的位数.继续刚才的例子, 如果 06 的 huffman 编码为 111000 ( 06 对应 111000 为查表所得. jpeg 文件里保存了压缩时所产生的 huffman 表, 将 0255 这 256 个 8 bits 定长数字,对应成 116 bits的不定长数值.出现频率高的数字小于 8bits, 频率低的大于 8bits,从而使整个的数据长度降低,关于huffman 压缩算法, 请查阅相关资料 )69= (4,5)-1111111110011001 ( 注: 69=4*16+5=0x45 )21= (1,5)-111111101104= (0,4)-101133= (2,1)-110110= EOB= (0,0)- 1010那么最后对于前面的例子表示的 写入 JPG 文件中就是这样的:63 个系数 ( 记得我们将第一个跳过了吗 ?) 按位流111000 111001 1110001
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号