目录
二、以txt文件输出所有的量化矩阵和所有的HUFFMAN码表
(一)实验名称
JPEG原理分析及JPEG解码器的调试
(二)实验目的
掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。
(三)主要设备
安装Windows和Visual Studio软件的个人计算机
(四)实验内容
一、JPEG编解码原理
框图
JPEG编码的过程如下图所示。解码是编码的逆过程。
各环节的作用分别是:
1. 零偏置
对于灰度级为2n 的像素,通过减去2(n-1),将无符号整数变为有符号数,以将绝对值大的数出现的概率大大减小,提高编码效率。
2. 8*8DCT变换
对每个单独的彩色图像分量,把整个分量图像分成8*8的图像块,作为二维离散余弦变换DCT的输入,并进行DCT变换。以实现能量集中和去相关,便于去除空间冗余,提高编码效率。(若图像的宽或高不是8的整数倍的图像,使用图像边缘像素填充,以不改变频谱分布。)DCT是一种无损变换,也无法对图像进行压缩,这样做的目的是在为下一步的量化做准备。
3. 量化
量化是编码流程中唯一会引入误差也是唯一会带来压缩效果的步骤。 由于人眼对亮度信号比对色差信号更敏感,因此JPEG使用了两种量化表:亮度量化值和色差量化值。根据人眼对低频敏感,对高频不太敏感的视觉特性,对低频部分采取较细的量化,对高频部分采取较粗的量化,减少了视觉冗余。量化矩阵并不是固定的,可以根据要求的质量的不同而进行调整。但经过量化,子块中的大多数高频区域的系数的量化结果都为0。
4. DC系数差分编码
经过8*8DCT变换后,DC直流系数的数值都比较大,且相邻图像块之间的DC系数变化不大(容易造成冗余),因此JPEG算法使用了差分脉冲调制编码DPCM技术对相邻图像块之间的量化DC系数的差值DIFF进行编码。
5. AC系数Z字扫描及游程编码
经过DCT变换后,AC系数大多集中在左上角的低频分量区,因此采用Z字形按频率的高低顺序读出可以出现很多连零的情况,便于使用游程编码,若最后的数据均为0,则直接给出EOB。
6. Huffman编码
对DC系数DPCM的结果和AC系数RLE的结果进行Huffman编码,类别ID采用一元码编码,类内索引采用定长码编码。共有亮度DC、亮度AC、色差DC、色差AC四张码表。
二、JPEG文件格式
1. Segment的组织形式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
(1)均以 0xFF 开始,后跟1byte的Marker和2byte的Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF”+“Marker”所占用的2byte);
(2)采用 Motorola 序(相对于Intel 序),即保存时高位在前,低位在后;
(3) Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理。
2. JPEG 的 Segment Marker
3. 用测试图片理解jpeg格式
测试图像test.jpg图像如下:
用VS2019以二进制形式打开这张图片
(1)图像开始SOI标记(0xFFD8)和图像结束EOI标记(0xFFD9)
(2)APP0 segment(0xFFE0)
APP0块的长度:16字节(不含0xFFE0)
“JFIF”+“0”:共5字节。
Major version和Minor version:各1字节。
X和Y方向密度单位:1字节,此例为0,表示无单位。
水平方向和垂直方向像素密度:各2字节,此例值为1。
缩略图水平和垂直像素数目:各1字节。
(3)量化表DQT(0xFFDB)——亮度、色度各一张
两张量化表长度:67字节(不含0xFFDB)。
量化表信息:1字节。低四位表示QT号,只能取0~3;高四位表示QT精度,0为8比特,否则为16比特。此例为8比特。
实际数据:共64字节。
(4)帧图像开始SOF0(0xFFC0)
SOF长度:17字