jpeg压缩简介(1) (2006-04-24 20:02:24)
0赞
jpeg压缩是一种有损压缩,它是将人眼不敏感的图像的高频部分去除。
jpeg压缩常用硬件采集到的YCbCr4:1:1数据,或者是将BMP图像的RGB数据读出转成的YCbCr4:1:1数据。RGB转YCbCr的公式:
Y=0.299R+0.587G+0.114B
Cb=-0.1687R-0.3313G+0.5B+128
Cr=0.5R-0.4187G-0.0813B+128
一张图像的YCbCr4:1:1数据得到之后要将其分为16*16的象素块作为一个单元进行处理。又因每2*2的象素点采4个Y值,1个Cb值,1个Cr 值,所以16*16的块有4个Y的8*8的数据、1个Cb的8*8的数据、1个Cr的8*8的数据,然后再对这6个8*8的数据块进行分别处理。处理的过程为FDCT、量化、Z型排列(量化和Z型排列可以交换)、RLE、huffman编码(huffman编码又分为DC编码和AC编码)。下面分别介绍:
1、FDCT(Forward DCT)
DCT是离散余弦变换,将时间域的数据转到频率域,这样就可将高频的部分去除。
DCT在程序实现时如不加修改的使用公式,程序的效率会很低,压缩Winxp默认的桌面Bliss.bmp需要将近1分钟(赛扬 1.7G,winxp,DEV-C++,以下运行环境同)。现在网上有很多快速算法,如LLM、AA&N,我在程序中使用的是AA&N,同样一张图片只要240ms。可是在ARM2440的板子上运行程序时,因为板子上没有协处理器,做浮点运算很慢,整个压缩需要40多秒。将浮点乘用整数乘法和右移位代替速度应该会有一些提高(明天在板子上测试)。但是AA&N算法的系数不适于用整数乘法和右移位代替,得出的结果不是很精确,使用 LLm算法,则系数可以用整数乘法和右移位精确的代替。
2、量化
量化是用FDCT计算出的频率域的数据除以一个量化表,得到的新的数据中就没有高频部分了,量化表的选择对图像的质量很重要。根据不同的要求可选择不同的量化表,在一张图像中Y和 CbCr的量化表不一样,往往是Y的量化表值小一些,保留的Y值的高频部分多一些,因为人眼对Y更敏感。
因为每次量化需要64次除法,在2440的上运行占用了大量的时间,可以先使用一个判断,当被除数小于除数的1/2时,商赋值0,不用再做除法。这样可以节省一多半的量化时间。
3、Z型排列
既将量化得到的8*8的二维数据按照Z型排列成一维的数组。Z型排列的顺序:
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、RLE(Run-length Encoding)行程编码
例如数据串:12,25,0,0,26,0,0,0,0,5,0.....0
用RLE编码为(0,12);(0,25);(2,26);(4,5);(0,0)
解释(m,n)m是n与前一个不为0的数之间0的个数,编码结尾要用(0,0)结束。
(待续...)
