数据压缩实验五——JPEG原理分析及JPEG解码器的调试

该实验旨在理解和掌握JPEG编解码系统,包括解码原理、文件格式、解码流程。实验中,通过调试JPEG解码器程序,将JPG文件解码为YUV格式,并分析解码过程中的关键步骤,如 Segment Marker、Huffman 解码和IDCT。同时,强调了程序设计框架的理解,如结构体设计和TRACE调试的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

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

二、实验设备

安装Windows和Visual Studio软件的个人计算机

三、实验内容

1.jpeg解码原理
在这里插入图片描述

解码是编码的逆过程

2.jpeg文件格式

2.1Segment 的组织形式

JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
· 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
·采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
·Data部分中,0xFF后若为0x00,则跳过此字节不予处理;

2.2JPEG 的 Segment Marker

在这里插入图片描述在这里插入图片描述
2.3jpeg解码流程

(1)读取文件
(2)解析segmentmarker:依次解析出SOI、APPO、DCT、SCF0、DHT、SOS、EOI
(3)依据每个分量的水平采样、垂直采样因子计算MCU(微控制单元,即RAM,即要开辟的图像内存?)的大小,并得到每个MCU中8*8宏块的个数。
(4)对每个MCU解码:对每个宏块进行huffman解码得到DCT系数,进行IDCT得到变换之前的数据。
(5)解析到EOI,解码结束
(6)将得到的Y、Cb、Cr转换成需要的色彩空间并保存。

四、编码过程

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

1)加入yuv格式
在这里插入图片描述
2)loadjpeg.c中加入判断输出格式—YUV
在这里插入图片描述
3)loadjpeg.c的main函数中增加判断yuv代码
在这里插入图片描述
4)在tinyjpeg.c中加入case TINYJPEG_FMT_YUV项
在这里插入图片描述

输出yuv文件如图:

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

2、 程序调试过程中,应做到:
2.1理解程序设计的整体框架
理解三个结构体的设计目的

1)理解struct_huffman

struct huffman_table
{
  /*快速查表,用哈夫曼散列比特查看符号,如果符号<0,那么我们需要查看树表 */
  short int lookup[HUFFMAN_HASH_SIZE];
  /* 给出编码符号的位数 */
  unsigned char code_size[HUFFMAN_HASH_SIZE];
  /*用于存储未在查找表中编码的值的位置,计算256值是否足以存储所有值
   */
  uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
};

2)理解struct component

struct component 
{
  unsigned int Hfactor;//水平采样//
  unsigned int Vfactor;//垂直采样//
  float *Q_table;		/* 指向要使用的量化表的指针*/
  struct huffman_table *AC_table;//交流huffman结构体//
  struct huffman_table *DC_table;//直流huffman结构体//
  short int previous_DC;	/*输入前直流系数 */
  short int DCT[64];		/* 输入dct系数 */
#if SANITY_CHECK
  unsigned int cid;
#endif
};

3)理解 struct jdec_private

struct jdec_private
{
  /* 公有变量 */
  uint8_t *components[COMPONENTS];
  unsigned int width, height;	/* 图像大小 长宽 */
  unsigned int flags;

  /*私有变量 */
  const unsigned char *stream_begin, *stream_end;//数据流开始、结束指针//
  unsigned int stream_length;//数据流长度//

  const unsigned char *stream;	/* 指向当前流的指针 */
  unsigned int reservoir, nbits_in_reservoir;

  struct component component_infos[COMPONENTS];
  float Q_tables[COMPONENTS][64];		/* 量化表 */
  struct huffman_table HTDC[HUFFMAN_TABLES];	/* 直流霍夫曼表  */
  struct huffman_table HTAC[HUFFMAN_TABLES];	/* 交流霍夫曼表   */
  int default_huffman_table_initialized;
  int restart_interval;//开始//
  int restarts_to_go;				/* MCU在此重新启动间隔内离开 */
  int last_rst_marker_seen;			/*Rst标记每次递增 */

  /* IDCT之后用于存储每个组件的临时空间 */
  uint8_t Y[64*4], Cr[64], Cb[64];

  jmp_buf jump_state;
  /*内部指针用于颜色空间转换,请勿修改 */
  uint8_t *plane[COMPONENTS];

};

2.2理解在视音频编解码调试中TRACE的目的和含义

• 会打开和关闭TRACE
在这里插入图片描述
在这里插入图片描述
tracef写入txt代码
在这里插入图片描述

• 会根据自己的要求修改TRACE

加入水平采样和垂直采样
在这里插入图片描述

在这里插入图片描述

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

输入以下代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(截取部分)
在这里插入图片描述
在这里插入图片描述

4. 输出DC图像并统计其概率分布。

5. 输出某一个AC值图像并统计其概率分布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值