一、实验目的
掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。
二、实验原理
JPEG简介
JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种标准,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。
JPEG编码原理
JPEG编码过程如上图所示。解码是编码的逆过程。
(1)零偏置
目的:使像素的绝对值出现3位10进制的概率大大减少。
对于灰度级是2^n 的像素,通过减去2^n-1 ,将无符号的整数值变成有符号数。
对于n=8,即将0~255的值域,通过减去128,转换为值域在-128~127之间的值。
(2)DCT变换
对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,如图所示,并作为两维离散余弦变换DCT的输入。
DCT变换计算式:
逆变换计算式:
其中
(3)量化
量化表可以选用建议量化表,也可以对建议量化表进行缩放,当然也可以根据实际情况与需求自定义。
因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。
根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化。
- 如果原始图象中细节丰富,则去掉的数据较多,量化后的系数与量化前差别
- 反之,细节少的原始图象在压缩时去掉的数据少些
(4)DC系数差分编码
8×8图像块经过DCT变换之后得到的DC直流系数有两个特点:
- 系数的数值比较大
- 相邻8×8图像块的DC系数值变化不大:冗余
根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值DIFF进行编码:
(5)AC系数Z形扫描和游程编码
由于经DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低
顺序读出,可以出现很多连零的机会。可以使用游程编码。尤其在最后,如果都是零,给出EOB (End of Block)即可。
游程编码
在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文件格式
1.Segment 的组织形式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
(1)均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
(2)采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
(3)Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
JPEG有一些典型的标记码,如下:
SOI,Start Of Image, 图像开始,标记代码为固定值0XFFD8,用2字节表示;
EOI,End Of Image,图像结束,标记代码为0XFFD9;
APP0,Application 0, 应用程序保留标记0,标记代码为固定值0XFFE0,用2字节表示。
该标记码之后包含了9个具体的字段:
(1)数据长度:2个字节,用来表示(1)~(9)的9个字段的总长度,即不包含标记代码但包含本字段;
(2)标示符:5个字节,固定值0X4A6494600,意为字符串“JFIF0”;
(3)版本号:2个字节,一般为0X0102,表示JFIF的版本号为1.2;但也可能为其它数值,从而代表了其它版本号;
(4)X,Y方向的密度单位:1个字节,只有三个值可选,0:无单位;1:点数每英寸;2:点数每厘米;
(5)X方向像素密度:2个字节,取值范围未知;
(6)Y方向像素密度:2个字节,取值范围未知;
(7)缩略图水平像素数目:1个字节,取值范围未知;
(8)缩略图垂直像素数目:1个字节,取值范围未知;
(9)缩略图RGB位图:长度可能是3的倍数,保存了一个24位的RGB位图;如果没有缩略位图(这种情况更常见),则字段(7)(8)的取值均为0;
DQT,Define Quantization Table, 定义量化表;标记代码为固定值0XFFDB;包含9个具体字段:
(1)数据长度:2个字节,表示(1)和多个(2)字段的总长度;即,不包含标记代码,但包含本字段;
(2)量化表:数据长度-2个字节,其中包括以下内容:
(a)精度及量化表ID,1个字节,高4位表示精度,只有两个可选值,0:8位;1:16位;低4位表示量化表ID,取值范围为0--3;
(b)表项,64*(精度取值+1)个字节,例如,8位精度的量化表,其表项长度为64*(0+1)=64字节;
SOF0,Start Of Frame, 帧图像开始,标记代码为固定值0XFFC0;包含9个具体字段:
(1)数据长度:2个字节,(1)--(6)共6个字段的总长度;即,不包含标记代码,但包含本字段;
(2)精度:1个字节,代表每个数据样本的位数;通常是8位;
(3)图像高度:2个字节,表示以像素为单位的图像高度,如果不支持DNL就必须大于0;
(4)图像宽度:2个字节,表示以像素为单位的图像宽度,如果不支持DNL就必须大于0;
(5)颜色分量个数:1个字节,由于JPEG采用YCrCb颜色空间,这里恒定为3;
(6)颜色分量信息:颜色分量个数*3个字节,这里通常为9个字节;并依此表示如下一些信息:
(a)颜色分量ID: 1个字节;
(b)水平/垂直采样因子:1个字节,高4位代表水平采样因子,低4位代表垂直采样因子;
(c)量化表:1个字节,当前分量使用的量化表ID;
DHT,Define Huffman Table定义Huffman表,标记码为0XFFC4;包含2个字段:
(1)数据长度,2个字节,表示(1)--(2)的总长度,即,不包含标记代码,但包含本字段;
(2)Huffman表,数据长度-2个字节,包含以下字段:
(a)表ID和表类型,1个字节,高4位表示表的类型,取值只有两个;0:DC直流;1:AC交流;低4位,Huffman表ID;需要提醒的是,DC表和AC表分开进行编码;
(b)不同位数的码字数量,16个字节;
(c)编码内容,16个不同位数的码字数量之和(字节);
SOS,Start Of Scan,扫描开始;标记码为0XFFDA,包含2个具体字段:
(1)数据长度:2个字节,表示(1)--(4)字段的总长度;
(2)颜色分量数目:1个字节,只有3个可选值,1:灰度图;3:YCrCb或YIQ;4:CMYK;
(3)颜色分量信息:包括以下字段,
(a)颜色分量ID:1个字节;
(b)直流/交流系数表ID,1个字节,高4位表示直流分量的Huffman表的ID&#x