数据压缩实验五——JPEG原理分析及JPEG解码器的调试
【超给力恋爱干货】【抠:10⒈⒍.x.9⒌26】 实验原理
JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。
在ISO公布的JPEG标准方案中,包含了两种压缩方式。一种是基于DCT变换的有损压缩编码方式,它包含了基本功能和扩展系统两部分。有损压缩编码去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像;一种是基于空间DPCM(差分脉冲编码调制,是预测编码的一种)方法的无损压缩编码方式,但并不在产品中有广泛支持。本次实验主要学习有损压缩编解码系统。
JPEG编码 压缩编码原理
根据人眼的视觉特性,人眼对亮度信息比色度信息敏感,对低频信息比高频信息敏感。首先对色度信息进行下采样。另外,将空间域的亮度色度信息经DCT变换到频域,对亮度信息细量化、色彩信息粗量化,对低频信息细量化、高频信息粗量化。再对量化结果进行变长编码,达到压缩图片的目的,同时主观上图片质量不甚下降。
编码流程 色彩空间转换
为了减少色度通道包含的大量的冗余信息,JPEG编码采用YCbCr色彩空间。首先需要进行从RGB到YCbCr的色彩空间变换:
Y = 0.299000R + 0.587000G + 0.114000B Cb = -0.168736R - 0.331264G + 0.500002B Cr = 0.500000R - 0.418688G - 0.081312B 其中Y是亮度分量Cb、Cr是色度分量。 2. 下采样
为实现压缩,对色度信息进行下采样,由原4:4:4的格式变为4:2:2或4:2:0格式或不进行下采样。
3. 块分割
下采样后,每个通道都要分割成很多个8x8的块,因为它是后续变换量化编码的基本单位。根据下采样格式,决定原图像上MCU(Minimum Coded Unit)块的大小:8x8(4:4:4)、16x8(4:2:2)、16x16(4:2:0),经过分割后,每个MCU三个通道都为8x8的块。
4. DCT变换
DCT(DiscreteCosineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。对每个通道的每个8x8矩阵块作DCT变换,变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。
图为标准亮度量化表,通过高频粗量化去除冗余。由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之
转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是除下采样外,造成图像压缩后失真的唯一原因。
6. 熵编码
首先进行之字形扫描(Zig-zag ordering)。即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。
之后利用相邻块之间DC系数的空间相关性,对DC系数进行DPCM编码,即当前块的DC系数减去前一块的DC系数后编码。
对AC系数进行游程编码(Run-Length Ecoding)。RLE的原理是检测每个非零的AC系数,及其前面0的个数,这需要两个符号来表示:
(RUNLENGTH, SIZE) (AMPLITUDE)
RUNLENGTH表示0的个数,SIZE表示表示这个为零系数所需的比特数,这两个信息公用一个字节。AMPLITUDE表示非零系数的值。
需要注意的是,AC系数的之字形序列编码中有两个特殊符号——(0,0)和(15,0)。第一个特殊符号指的是块的结束(end-of-block,EOB),用来表明在之字形块中剩余的元素都是零。另一个特殊符号是指零游程长度(zero-run-length,ZRL),用来表明16个零游程。基线(baseline sequential)JPEG算法允许的零游程最大长度是16个。如果这里的零超过16个,那么这个游程分成几个长度为16的零游程。
经过RLE编码的AC系数可以映射成两个标志(RUNLENGTH,CATEGORY)和(AMPLITUDE),前者采用的是霍夫曼编码,而后者采用的是VLI编码(直接二进制编码)。同理经过DPCM编码的DC系数同样可以映射成两个标志(CATEGORY)和(AMPLITUDE),,前者采用霍夫曼编码,后者采用VLI编码。
JPEG解码
Segment的组织形式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点: ? 均以0xFF开始,后跟1byte的Marker和2byte的Segment length(包含表示Length本身所占用的2byte,不含”0xFF”+”Marker”所占用的2byte)
采用Motorola序(相对于Intel序),即保存时高位在前,低位在后 Data 部分中,0xFF后若为0x00,则跳过此字节不予处理 标记字节 Start of Image 图像开始 Application 应用程序标记
Define Quantization Table 定义量化表 Start of Frame 帧图像开始
Define Huffman Table
定义霍夫曼表 Start of Scan 扫描开始 End of Image 图像结束 JPEG解码流程 读取文件
解析Segment Marker 解析APP0
检查标识”JFIF”及版本 得到一些参数
得到量化表长度(可能包含多张量化表) 得到量化表的精度
得到及检查量化表的序号(只能是0~3) 得到量化表内容(64个数据) 解析SOF0
得到每个sample的比特数、长宽、颜色分量数
得到每个颜色分量的ID、水平采样因子、垂直采样因子、使用的量化表 序号(与DQT中序号对应)
得到 Huffman 表的类型(AC、DC)、序号 依据数据重建 Huffman 表
得到解析每个颜色分量的DC、AC值所使用的Huffman表序号(与DHT