1、JPEG编码基本流程
(1)JPEG规定了4种运行模式,以满足不同需要。
(2)8×8的块编码,将一个宏块作为基本编码单元(MCU),这样可提高编码效率和实时性。
(3)零偏置:JPEG编码时,输入的YUV信号由于都是unsigned char类型,取值为0~255,所以需要先进行下拉128操作,让其以0为中心。
(4)DCT变换:对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,作为两维离散余弦变换DCT的输入。
(5)量化:由于DCT变换后零值会有很多,尤其在高频成分中,所以选用了中平量化器。量化步距是按照系数所在的位置和所在颜色分量来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化;如果原始图象中细节丰富,则去掉的数据较多,量化后的系数与量化前差别较大,反之,细节少的原始图象在压缩时去掉的数据少些。进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。
(6)DC、AC系数分别编码:经过量化后,DCT的第一个系数为直流DC系数,由于一般图像中的DC系数之间相关性较强,相邻的DC系数之间应该差别不是很大。所以将每个宏块的DC系数取出后做DPCM差分编码,对于差值进行Huffman编码,以达到压缩效果。
而对AC系数,由于一般数值都集中在左上角,而之后基本上都是零值,所以采用之字形扫描的方法,按照低频到高频的顺序将数值取出,当后边都是零的时候给出一个EOB代替。而当高频偶尔有值的时候就很有可能出现很多连零,所以在将AC的系数提出后,先要进行游程化,再进行熵编码,实现压缩效果。
之字形排序优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。
2、JPEG文件格式
SOI ,Start of Image, 图像开始 标记代码2字节固定值0xFFD8
EOI,End of Image, 图像结束2字节 标记代码2字节