12实验五:JPEG原理分析及JPEG解码器的调试

该博客详细介绍了JPEG的解码原理和流程,包括文件格式的组织形式、SegmentMarker解析、解码步骤等。实验内容涉及从读取文件到解码结束的完整过程,以及如何将解码后的数据转换并保存为YUV格式。此外,还计划输出量化矩阵和HUFFMAN码表至txt文件。
摘要由CSDN通过智能技术生成

一、实验目的

掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。

二、实验内容

1.JPEG编解码原理

在这里插入图片描述
JPEG编码的过程如上图所示。解码是编码的逆过程。

2.JPEG文件格式

2.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,则跳过此字节不予处理;

2.2JPEG 的 Segment Marker

在这里插入图片描述
在这里插入图片描述

2.3JPEG文件格式介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、JPEG 的解码流程

3.1 读取文件

3.2 解析 Segment Marker

3.2.1 解析 SOI

3.2.2 解析 APP0

检查标识“JFIF”及版本
得到一些参数

3.2.3 解析 DQT

得到量化表长度(可能包含多张量化表)
得到量化表的精度
得到及检查量化表的序号(只能是 0 —— 3)
得到量化表内容(64 个数据)

3.2.4 解析 SOF0

得到每个 sample 的比特数、长宽、颜色分量数
得到每个颜色分量的 ID、水平采样因子、垂直采样因子、使用的量化表
序号(与 DQT 中序号对应)

3.2.5 解析 DHT

得到 Huffman 表的类型(AC、DC)、序号
依据数据重建 Huffman 表

3.2.6 解析 SOS

得到解析每个颜色分量的 DC、AC 值所使用的 Huffman 表序号(与 DHT
中序号对应)

3.3 依据每个分量的水平、垂直采样因子计算 MCU 的大小,并得到每个 MCU 中 8*8宏块的个数

3.4 对每个 MCU 解码(依照各分量水平、垂直采样因子对 MCU 中每个分量宏块解码)

3.4.1 对每个宏块进行 Huffman 解码,得到 DCT 系数

3.4.2 对每个宏块的 DCT 系数进行 IDCT,得到 Y、Cb、Cr

3.4.3 遇到 Segment Marker RST 时,清空之前的 DC DCT 系数

3.5 解析到 EOI,解码结束

3.6 将 Y、Cb、Cr 转化为需要的色彩空间并保存。

四、实验步骤(代码调试不出来,有时间再写)

4.1逐步调试JPEG解码器程序。将输入的JPG文件进行解码,将输出文件保存为可供YUVViewer观看的YUV文件。

static void write_yuv(const char *filename, int width, int height, unsigned char **components)
{
  FILE *F;
  char temp[1024];

  snprintf(temp, 1024, "%s.Y", filename);
  F = fopen(temp, "wb");
  fwrite(components[0], width, height, F);
  fwrite(components[1], width*height/4, 1, F);
  fwrite(components[2], width*height/4, 1, F);
  fclose(F);
}

4.2以txt文件输出所有的量化矩阵和所有的HUFFMAN码表。

五、实验结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值