实验原理
概述
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变换,变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。
5. 量化
图为标准亮度量化表,通过高频粗量化去除冗余。由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是除下采样外,造成图像压缩后失真的唯一原因。
6. 熵编码
首先进行之字形扫描(Zig-zag ordering)。即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。
之后利用相邻块之间DC系数的空间相关性,对DC系数进行DPCM编码,即当前块的DC系数减去前一块的DC系数后编码。
对AC系数进行游程编码(Run-Length Ecoding)。RLE的原理是检测每个非零的AC系数,及其前面0的个数,这需要两个符号来表示:
| Symbol 1 | Symbol 2 |
|---|---|
| (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,则跳过此字节不予处理
| 标记名 | 全称 | 标记字节 | 含义 |
|---|---|---|---|
| SOI | Start of Image | 0xFFD8 | 图像开始 |
| APPn | Application | 0xFFEn | 应用程序标记 |
| DQT | Define Quantization Table | 0xFFDB | 定义量化表 |
| SOF | Start of Frame | 0xFFC0 | 帧图像开始 |
| DHT | Define Huffman Table | 0xFFC4 | 定义霍夫曼表 |
| SOS | Start of Scan | 0xFFDA | 扫描开始 |
| EOI | End of Image | 0xFFD9 | 图像结束 |
JPEG解码流程
- 读取文件
- 解析Segment Marker
- 解析SOI
- 解析APP0
检查标识”JFIF”及版本
得到一些参数 - 解析DQT

该博客深入探讨了JPEG图像压缩标准,包括其有损压缩原理、编码和解码流程。重点讲解了DCT变换、量化、熵编码等关键步骤,并详细阐述了JPEG文件的Segment组织形式和解码过程。此外,还涉及了JPEG解码器的调试,包括结构体理解、代码修改和实验结果分析。
最低0.47元/天 解锁文章
723

被折叠的 条评论
为什么被折叠?



