【数据压缩作业7】JPEG原理分析及JPEG解码器的调试

本文详细介绍了JPEG编码原理,包括零偏置、DCT变换、量化、DC系数差分编码和AC系数的Z形扫描与游程编码。此外,还探讨了JPEG文件格式,如Segment的组织形式和典型标记码。实验内容涉及代码调试,包括结构体、运行逻辑和TRACE的目的。实验结果展示了解码器的输出和量化矩阵、HUFFMAN码表的txt文件输出,以及DC和AC图像的概率分布统计。
摘要由CSDN通过智能技术生成

一、实验目的

掌握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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值