实验原理
JPEG简介
JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的压缩格式,文件格式是JPEG(联合图像专家组)标准的产物,该标准由ISO与CCI TT(国际电报电话咨询委员会)共同制定,是面向连续色调静止图像的一种压缩标准。其最初目的是使用64Kbps的通信线路传输720×576 分辨率压缩后的图像。
JPEG的压缩,分为四个步骤:
(1)颜色转换:由于JPEG只支持YUV颜色模式,而不支持RGB颜色模式,所以在将彩色图像进行压缩之前,必须先对颜色模式进据转换。转换完成之后还需要进行数据采样。一般采用的采样比例是2:1:1或4:2:2。由于在执行了此项工作之后,每两行数据只保留一行,因此,采样后图像数据量将压缩为原来的一半。
(2)DCT变换:DCT(DiscreteConsineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每一个矩阵作DCT变换(变换公式此略)。变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。
(3)量化:由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。
(4)编码:编码采用两种机制:一是0值的行程长度编码;二是熵编码(EntropyCoding)。在JPEG中,采用曲徊序列,即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。行程长度编码是非常简单和常用的编码方式,在此不再赘述。编码实际上是一种基于统计特性的编码方法。在JPEG中允许采用HUFFMAN编码或者算术编码。
JPEG文件格式
- 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
- 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
- Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
名称 | 含义 | 固定值 | 具体内容 |
SOI(Start of Image) | 图像开始 | 0xFFD8 | |
APP0(Application) | 应用程序保留标记0 | 0xFFE0 | 包含9个具体字段: |
DQT(Define Quantization Table) | 定义量化表 | 0xFFDB | 包含9个具体字段: a) 精度及量化表ID 1字节 高4位:精度,只有两个可选值 0:8位;1:16位 b) 表项 (64×(精度+1))字节 例如8位精度的量化表,其表项长度为64×(0+1)=64字节 本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次 |
SOF0(Start of Frame) | 帧图像开始 | 0xFFC0 | 包含9个具体字段: ④ 图像宽度 2字节 图像宽度(单位:像素) ⑤ 颜色分量数 1字节 只有3个数值可选 a)颜色分量ID 1字节 b)水平/垂直采样因子 1字节 高4位:水平采样因子 |
DHT(Define Huffman Table) | 定义哈夫曼表 | 0xFFC4 | 包含2个具体字段: ① 数据长度 2字节 ② huffman表 数据长度-2字节 表ID和表类型 1字节 高4位:类型,只有两个值可选 0:DC直流;1:AC交流 低4位:哈夫曼表ID 注意,DC表和AC表分开编码 不同位数的码字数量 16字节 编码内容 16个不同位数的码字数量之和(字节) |
SOS(Start of Scan) | 扫描开始 | 0xFFDA | 包含2个具体字段: ③颜色分量信息 高4位:直流分量使用的哈夫曼树编号 ④ 压缩图像数据 |
EOI(End of Image) | 图像结束 | 0xFFD9 |
1.读取文件
2.解析 Segment Marker
2.1 解析 SOI