数据压缩实验报告5 JPEG原理分析及JPEG解码器的调试

《数据压缩》实验报告五·JPEG编解码 一.JPEG编解码实验原理 JPEG是第一个国际图像压缩标准,用于连续色调静态图像(即包括灰度图像和彩色图像)。JPEG是联合图像专家组(Joint Photographic Experts Group)的缩写,这个图像压缩标准是国际电信联盟(International Telecommunication Union,ITU)、国际标准化组织(International Organiza 阅读详情

一、实验原理
1.JPEG编码原理
JPEG编码的过程如下图所示。解码是编码的逆过程。
在这里插入图片描述
(1)零偏置:即把[0,255]的像素值减128变为[-128,127];
(2)8×8DCT变换:能量集中和去相关,减小空间冗余;
(3)量化:根据人眼视觉特性,低频细量化,高频粗量化,减小视觉冗余;
(4)编码:直流系数进行差分和VLC编码,交流系数进行之字形扫描、游程编码和VLC编码,减少数据冗余。

2.JPEG文件格式
(1)Segment 的组织形式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示
Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
(2)JPEG 的 Segment Marker
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.JPEG 的解码流程
(1)读取文件
(2)解析 Segment Marker
(i)解析 SOI
(ii)解析 APP0
检查标识“JFIF”及版本
得到一些参数
(iii)解析 DQT
得到量化表长度(可能包含多张量化表)
得到量化表的精度
得到及检查量化表的序号(只能是 0 —— 3)
得到量化表内容(64 个数据)
(iv)解析 SOF0
得到每个 sample 的比特数、长宽、颜色分量数
得到每个颜色分量的 ID、水平采样因子、垂直采样因子、使用的量化表序号(与 DQT 中序号对应)
(v)解析 DHT
得到 Huffman 表的类型(AC、DC)、序号
依据数据重建 Huffman 表
(vi)解析 SOS
得到解析每个颜色分量的 DC、AC 值所使用的 Huffman 表序号(与 DHT中序号对应)
(3) 依据每个分量的水平、垂直采样因子计算 MCU 的大小,并得到每个 MCU 中 8*8宏块的个数
(4)对每个 MCU 解码(依照各分量水平、垂直采样因子对 MCU 中每个分量宏块解码)
(i) 对每个宏块进行 Huffman 解码,得到 DCT 系数
(ii) 对每个宏块的 DCT 系数进行 IDCT,得到 Y、Cb、Cr
(iii)遇到 Segment Marker RST 时,清空之前的 DC DCT 系数
(5)解析到 EOI,解码结束
(6)将 Y、Cb、Cr 转化为需要的色彩空间并保存

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

  snprintf(temp, 1024, "%s.YUV", 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);

在write_yuv函数中加入如上代码,即可输出yuv文件,用yuvviewer打开后的图像如下
在这里插入图片描述

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

struct huffman_table
{
  /* Fast look up table, using HUFFMAN_HASH_NBITS bits we can have directly the symbol,快速查找表,使用HUFFMAN_HASH_NBITS个比特可以直接找到符号
   * if the symbol is <0, then we need to look into the tree table *如果符号小于0,那么需要在慢速查找表中查找/
  short int lookup[HUFFMAN_HASH_SIZE];
  /* code size: give the number of bits of a symbol is encoded *码长对应的权值/
  unsigned char code_size[HUFFMAN_HASH_SIZE];
  /* some place to store value that is not encoded in the lookup table 
   * FIXME: Calculate if 256 value is enough to store all values给出在慢速查找表中没有出现的码字
   */
  uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
};

struct component

struct component 
{
  unsigned int Hfactor;//水平采样
  unsigned int Vfactor;//垂直采样
  float *Q_table;		/* Pointer to the quantisation table to use 指向量化表*/
  struct huffman_table *AC_table;//指向交流Huffman查找表
  struct huffman_table *DC_table;//指向直流Huffman查找表
  short int previous_DC;	/* Previous DC coefficient 前一个直流系数*/
  short int DCT[64];		/* DCT coef DCT系数*/
#if SANITY_CHECK
  unsigned int cid;
#endif
};

struct jdec_private

struct jdec_private
{
  /* Public variables */
  uint8_t *components[COMPONENTS];
  unsigned int width, height;	/* Size of the image */
  unsigned int flags;

  /* Private variables */
  const unsigned char *stream_begin, *stream_end;
  unsigned int stream_length;

  const unsigned char *stream;	/* Pointer to the current stream */
  unsigned int reservoir, nbits_in_reservoir;

  struct component component_infos[COMPONENTS];
  float Q_tables[COMPONENTS][64];		/* quantization tables 三个通道的量化表*/
  struct huffman_table HTDC[HUFFMAN_TABLES];	/* DC huffman tables  直流Huffman表 */
  struct huffman_table HTAC[HUFFMAN_TABLES];	/* AC huffman tables  交流Huffman表 */
  int default_huffman_table_initialized;
  int restart_interval;
  int restarts_to_go;				/* MCUs left in this restart interval 剩余的MCU*/
  int last_rst_marker_seen;			/* Rst marker is incremented each time 上一个marker*/

  /* Temp space used after the IDCT to store each components */
  uint8_t Y[64*4], Cr[64], Cb[64];//解码后三个分量的值

  jmp_buf jump_state;
  /* Internal Pointer use for colorspace conversion, do not modify it !!! 用于彩色空间转换*/
  uint8_t *plane[COMPONENTS];

};

理解在视音频编解码调试中TRACE的目的和含义
会打开和关闭TRACE

#define  snprintf _snprintf//add by nxn
#define TRACE 1//add by nxn trace设置1为打开,0为关闭
#define  TRACEFILE "trace_jpeg.txt"//add by nxn

会根据自己的要求修改TRACE
在process_Huffman_data_unit函数最后添加以下代码

#if TRACE
	fprintf(p_trace, "%d ", DCT[0]);
#endif

3.以txt文件输出所有的量化矩阵和所有的HUFFMAN码表。
在这里插入图片描述
4.输出DC图像并统计其概率分布。
在这里插入图片描述
在这里插入图片描述
5.输出某一个AC值图像并统计其概率分布。
在这里插入图片描述
在这里插入图片描述

[数据压缩]实验五 JPEG编码及原理分析 目录一、实验框架二、JPED编解码原理三、实现框架四、实验执行编码原理:解码原理 存储Huffman码表,获取权值对应的码字和码长,根据表进行快速查找。 图像块结构体,用于参与霍夫曼解码,反量化,IDCT 以及彩色空间变换,Hfactor和 Vfactor 用于说明水平与垂直的采样情况 解码信息结构体,此部分包含前两个结构体的内容,保存了图像的基本信息。量化矩阵输出,并使用Huffman表 交流直流对比图,实验完成。... 阅读详情

相关推荐

数据压缩(十一)——JPEG原理分析及JPEG解码器调试

文章目录一、JPEG编码原理二、JPEG解码原理三、调试JPEG解码器程序2.1 理解程序设计的整体框架2.2 理解三个结构体的设计目的2.2.1 struct huffman_table2.2.2 struct component2.2.3 struct jdec_private2.3 理解在视音频编解码调试中TRACE的目的和含义四、修改JPEG解码器将输出文件保存为YUV文件以TXT文件输出所有量化矩阵和HUFFMAN码表输出DC图像并统计其概率分布输出某一个AC值图像并统计其概率分布 一、JPEG

CRR的博客 2769

数字图像编码

1、基本概念2、无损图像压缩编码3、有损图像压缩编码4、图像压缩标准。

大冬瓜qdq的博客 965

【数据压缩】实验:JPEG原理分析及JPEG解码器的调试

JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。JPEG主要采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,从而去除冗余的图像和彩色数据,属于有损压缩格式,在获得极高的压缩率的同时能展现十分丰富生动的图像。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。(1)图像预处理(2)零偏置电平下移对输入图片做零偏置电平下移

weixin_48946798的博客 2157

实验报告5_JPEG编解码原理及程序调试

一.实验原理 JPEG是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。 JPEG编码流程: JPEG编解码流程: 1.编码过程详解: (1)零偏置: 对于灰度级是2n的像素,通过减去2n-1,将无符号的整

qq_36315119的博客 2327

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

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

Alfred512的博客 1503

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

目录实验目的二级目录三级目录一、实验目的二、JPEG编解码原理 实验目的 二级目录 三级目录 一、实验目的 掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。 二、JPEG编解码原理 JPEG是一种针对数字图像的有损压缩标准方法,由于JPEG编码算法可以在提供较大的压缩比的同时,保持较好的显示质量,所以该算法逐渐成为最为熟知和广泛使用的数字图像格式和通用标准。 ...

weixin_46393626的博客 824

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

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

spadeK2020的博客 2484

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

一、实验目的 掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。 二、实验原理 JPEG编码原理(解码是编码的逆过程) JPEG文件格式 (1)Segment的组织形式 JPEG 在文件中以 Segment 的形式组织,它具有以下特点: a. 均以 0xFF 开始,后跟1byte的Marker和2byte的Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF”+“Marker”所占用的2byte); b

Abigailiar的博客 449

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

数据压缩原理实验5 JPEG原理分析及JPEG解码器的调试 班级:17广电工方向三 姓名:利满雯 学号:201710413068 一、实验原理 1. JPEG编码原理(解码是编码的逆过程) (1)图像预处理 将输入图像分成若干个8×8的小块。在此过程中需对图像的宽和高进行剪裁剪,使其都为8的倍数,不足的部分复制与其最近的像素值。目的是方便进行8×8 DCT变换。 (2)零偏置(Level Offset) 对于灰度级是2n的像素,通过减去2n-1,将无符号的整数值变成有符号数。例如对于n=8,即0255的值

ManWen_Li的博客 1679

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

实验原理概述JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。 在ISO公布的JPEG标准方案中,包含了两种压缩方式。一种是基于DCT变换的有损压缩编码方式,它包含了基本功能和扩展系统两部分。有损压缩编码去除冗余的图

willshant的博客 915

图像压缩综合实验报告

实验目的 及实验要求 (1)进一步熟悉DCT的概念和原理; (2)掌握对灰度和彩色图像作离散余弦变换和反变换的方法;

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

文章目录1.实验名称2.实验目的3.主要设备4.实验内容4.1 JPEG文件格式4.2 JPEG编解码原理 1.实验名称 JPEG原理分析及JPEG解码器的调试 2.实验目的 掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。 3.主要设备 安装Windows和Visual Studio软件的个人计算机 4.实验内容 4.1 JPEG文件格式 依次 文件格式 标记代码 具体字段 ① SOI(图像开始) 0xFFD8 ---------

qq_45639597的博客 926

数字图像处理A_实验报告_图像压缩.pdf

该文档包含数字图像处理(冈萨雷斯第三版)中的图像压缩实验(图像基本压缩、霍夫曼编码、霍夫曼解码)实验,包含整个实验过程和原理解释,以及详细的执行代码。代码复制后可在matlab中直接运行。

数据压缩8 | 实验5 | JPEG原理分析及JPEG解码器的调试

目录一、内容概述1. JPEG编解码原理2. JPEG文件格式二、实验思路三、调试过程四、分析总结 一、内容概述 1. JPEG编解码原理 2. JPEG文件格式 二、实验思路 逐步调试JPEG解码器程序。将输入的JPG文件进行解码,将输出文件保存为可供YUVViewer观看的YUV文件。 程序调试过程中,应做到: ①理解程序设计的整体框架;理解三个结构体的设计目的:struct huffman_table struct component struct jdec_private ②理解在视音频编解码调试

月婵婵的程序媛生涯 1446

Jpeg显示程序实验报告.doc

Jpeg显示程序实验报告.doc

JPEG图像编解码(MFC)

本资源包含:源码、可执行程序、测试数据、实验报告 本程序实现了将bmp文件转换为jpeg文件,将jpeg文件解压并显示在MFC界面上

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

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

m0_59620643的博客 510

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3084
上一篇: 数据压缩作业 最小二乘法、梯度下降法、牛顿法、高斯牛顿法
下一篇: 数据压缩作业 QMF滤波器
タン
博客等级 码龄8年 15粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值