JPEG原理分析及JPEG解码器的调试

一插代码块网页就卡,所以代码都用截图来了
一实验原理
1.JPEG原理及编码流程

JPEG是常见的一种图像格式,由ISO与CCITT建立并开发,是一个国际数字图像压缩标准。JPEG文件的扩展名为.jpg或.jpeg,用有损方式去除冗余的图像与彩色数据,在获取极高的压缩率同时能展现十分生动的静态图像,JPEG被认为是目前压缩比最高的静态图像,它被广泛地应用于多媒体与网络程序中。 JPEG编码流程如图,解码为逆过程 :

在这里插入图片描述

(1)零偏置(level offset)

对于灰度级是2^n 的像素,通过减去2^(n-1),将无符号的整数值变成有符号数;可使像素的绝对值出现3位10进制的概率大大减少。

(2)8x8 DCT变换

DCT变换是指对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,再以8x8的图像块为一个单位进行量化和编码处理。可以利用DCT变换去相关的特性,去除冗余信息,提高编码效率。

(3)量化

使用根据人眼视觉特性设计的量化的量化矩阵对DCT变换之后的结果进行量化,从而进而减少视觉冗余。

(4)DC系数差分编码

8×8图像块经过DCT变换之后得到的DC直流系数有两个特点:系数的数值比较大和相邻8×8图像块的DC系数值变化不大:冗余;根据这个特点, JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值DIFF进行编码:DIFFk=DCK−DCK−1,再对DIFF进行Huffman编码。

(5)AC系数的之字形扫描与游程编码

由于经DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低顺序读出,可以出现很多连零的机会。可以使用游程编码。尤其在最后,如果都是零,给出EOB (End of Block)即可。 在经过之字形扫描排序后的AC系数,存在很多连0。为了进一步提高编码效率,因此对AC系数进行游程编码(RLC)处理之后,再进一步进行Huffman编码。

(6)AC和DC系数分别进行Huffman编码

JPEG中共采用了四张Huffman码表:亮度DC、亮度AC、色度DC、色度AC,即分别对图像的亮度和色度,直流和交流数据进行编码处理。
  
2.JPEG文件格式分析
JPEG文件的存储格式有很多种,但最常用的是JFIF格式,即JPEG File Interchange Format。大体可以分为两个部分:

(1)标记码:由两个字节构成,其中,前一个字节是固定值0XFF代表了一个标记码的开始,后一个字节不同的值代表着不同的含义。
注意:连续的多个0XFF可以理解为一个0XFF,并表示一个标记码的开始。另外,标记码在文件中一般是以标记代码的形式出现的。例如,SOI的标记代码是0XFFD8,即如果JPEG文件中出现了0XFFD8,则代表此处是一个SOI标记。

(2)压缩数据:一个完整的两字节标记码的后面,就是该标记码对应的压缩数据了,它记录了关于文件的若干信息。

3.JPEG解码流程

1 .读取文件
2. 解析 SegmentMarker
(1)解析 SOI
(2)解析 APP0:检查标识“ JFIF”及版本,得到一些参数
(3)解析 DQT: 得到量化表长度,量化表的精度,检查量化表的序号, 量化表内容
(4)解析 SOF0:得到每个 sample 的比特数、长宽、颜色分量数 ,每个颜色分量的 ID、水平采样因子、垂直采样因子、使用的量化表序号。
(5)解析 DHT:得到 Huffman 表的类型和序号。依据数据重建 Huffman 表
(6)解析 SOS:得到解析每个颜色分量的 DC、 AC 值所使用的
Huffman 表序号(与 DHT中序号对应)
3. 依据每个分量的水平、垂直采样因子计算 MCU 的大小,并得到每个 MCU 中8*8宏块的个数
4. 对每个 MCU 解码:依照各分量水平、垂直采样因子对 MCU 中每个分量宏块解码。对每个宏块进行 Huffman 解码,得到 DCT 系数 。对每个宏块的 DCT 系数进行 IDCT,得到 Y、 Cb、 Cr 。遇到 Segment Marker RST 时,清空之前的 DC DCT 系数
5. 解析到 EOI,解码结束
6. 将 Y、 Cb、 Cr 转化为需要的色彩空间并保存。

二实验步骤

1.逐步调试JPEG解码器程序。将输入的JPG文件进行解码,将输出文件保存为可供YUVViewer观看的YUV文件。
在这里插入图片描述
在这里插入图片描述
2.三个结构体的设计目的
struct huffman_table
在这里插入图片描述
struct component
在这里插入图片描述
struct jdec_private
在这里插入图片描述
3.理解在视音频编解码调试中TRACE的目的和含义,调试trace

TRACE文件中包含了很多程序运行过程中的中间变量等信息和解析的情况,可以非常方便得查看程序运行是否顺利。
trace_jpeg.txt文件如下图所示(截取部分):在这里插入图片描述

要关闭TRACE功能,只要把“tinyjpeg.h中的#define TRACE 1”中的1改为0:在这里插入图片描述

3.以txt文件输出所有的量化矩阵和所有的HUFFMAN码表。
在这里插入图片描述在这里插入图片描述

4.输出DC图像并统计其概率分布。
在这里插入图片描述
在这里插入图片描述
5.输出某一个AC值图像并统计其概率分布。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值