一、JPEG编解码原理
JPEG编码的过程如上图所示。解码是编码的逆过程。
以下是编码具体说明:
1、零偏置(Level Offset)
对于灰度级是2的n次方的像素,通过减去2的n-1次方,将无符号的整数值变成有符号数。例如:对于n=8,即将0~255的值域,通过减去128,转换为值域在-128~127之间的值。这样做的目的是:使像素的绝对值出现3位10进制的概率大大减少。
2、8*8DCT
将输入图像分为8*8的小块, 每个块里有64个像素。若边缘未满8*8,则用边缘像素进行填充。
总体来说,图像的低频部分集中在每个8*8块的左上角,高频部分在右下角。DCT变化可以做到以下三点:1、能量守恒 2、能量集中 3、去相关。
3、量化
根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化。 由于上面的人眼视觉特性,量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。
4、DC系数的差分编码
8X8图像块经过DC丁变换之后得到的DC直流系数有两个特点:1.系数的数值比较大2.相邻8X8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值DIFF进行编码:DIFFk =DCk - DCk-1。
5、AC系数的Z字扫描
由于经DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低顺序读出,可以出现很多连零的机会。可以使用游程编码。尤其在最后,如果都是零,给出EOB (End of Block)即可。
6、AC系数的游程编码
在JPEG和MPEG编码中规定为:(run, level),表示连续run个0,后面跟值为level的系数。
如:0,2,0,0,3,0,-4,0,0,0,-6,0,0,5,7表示为(1, 2), (2, 3) ,…
编码:
Run: 最多15个,用4位表示RRRR。
Level:类似DC:分成16个类别,用4位表示SSSS表示类别号;类内索引。对(RRRR, SSSS)联合用Huffman编码;对类内索引用定长码编码
AC系数的游程编码
在JPEG和MPEG编码中规定为:(run, level),表示连续run个0,后面跟值为level的系数。
如:0,2,0,0,3,0,-4,0,0,0,-6,0,0,5,7表示为(1, 2), (2, 3) ,…
编码:
Run: 最多15个,用4位表示RRRR。
Level:类似DC:分成16个类别,用4位表示SSSS表示类别号;类内索引。对(RRRR, SSSS)联合用Huffman编码;对类内索引用定长码编码
二、JPEG文件格式
- SOI,Start of Image,图像开始
- APP0,Application,应用程序保留标记0