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值图像并统计其概率分布。