当前位置:文档之家› 图像无损压缩程序设计 霍夫曼编码

图像无损压缩程序设计 霍夫曼编码

成绩评定表 学生姓名 班级学号 ********** 专业 电子信息工程 课程设计题目 图像的无损压缩程序设计——霍夫曼编码

评 语 组长签字:

成绩 日期 2015年7月20日 课程设计任务书 学院 信息科学与工程 专业 电子信息工程 学生姓名 班级学号 1203030119 课程设计题目 图像的无损压缩程序设计——霍夫曼编码 实践教学要求与任务: 本课题通过MATLAB编写适当的函数,对一个随机信源进行哈夫曼编码,得出码字,平均码长和编码效率。从而理解信源编码的基本思想与目的以及哈夫曼编码方法的基本过程与特点,并且提高综合运用所学理论知识独立分析和解决问题的能力。

工作计划与进度安排: 2015年7月8日—11日:熟悉编程环境,查阅相关资料。 2015年7月11日—12日:图像的霍夫曼编码程序设计。 2015年7月12日—13日:编码、调试、实验与分析。 2015年7月13日—15日:撰写课程设计报告。 2015年7月15日—19日:准备答辩。

指导教师: 2015年7月2日 专业负责人: 2015年7月2日 学院教学副院长: 2015年7月2日 摘 要 哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。 本课题通过MATLAB编写适当的函数,对一个随机信源进行哈夫曼编码,得出码字,平均码长和编码效率。从而理解信源编码的基本思想与目的以及哈夫曼编码方法的基本过程与特点,并且提高综合运用所学理论知识独立分析和解决问题的能力。 关键字:哈夫曼;信源编码;MATLAB 目 录 1设计目的及相关知识 ............................................ 1 1.1设计目的 ................................................. 1 1.2图像的霍夫曼编码概念 ..................................... 1 1.3Matlab图像处理通用函数 ................................... 1

2课程设计分析 .................................................. 3 2.1 图像的霍夫曼编码概述 .................................... 3 2.2 图像的霍夫曼编码举例 .................................... 4

3仿真 .......................................................... 5 4结果及分析 .................................................... 8 5附录 ......................................................... 11 结束语 ......................................................... 14 参考文献 ....................................................... 15 1设计目的及相关知识 1.1设计目的 1)了解霍夫曼编码的原理。 2)理解图像的霍夫曼编码原理,了解其应用,掌握图像的霍夫曼编码的方法。 3)对图像编码程序设计进行较深入的认识,对知识牢固掌握。 4)掌握图像霍夫曼编码的整个过程及其中的注意事项。 5)了解图像无损压缩的目的及好处。

1.2图像的霍夫曼编码概念 所谓霍夫曼编码的具体方法:先按出现的概率大小排队,把两个最小的概率相加,作为新的概率和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。每次相加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”,将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的霍夫曼编码

1.3 Matlab图像处理通用函数 colorbar 显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ colorbar(h) \ h=colorbar(...) \ colorbar(...,'peer',axes_handle) getimage从坐标轴取得图像数据 语法:A=getimage(h) \ [x,y,A]=getimage(h) \ [...,A,flag]=getimage(h) \ [...]=getimage imshow显示图像 语法:imshow(I,n) \ imshow(I,[low high]) \ imshow(BW) \ imshow(X,map) \ imshow(RGB)\ imshow(...,display_option) \ imshow(x,y,A,...) \ imshow filename \ h=imshow(...) montage 在矩形框中同时显示多幅图像 语法:montage(I) \ montage(BW) \ montage(X,map) \ montage(RGB) \ h=montage(...) immovie创建多帧索引图的电影动画 语法:mov=immovie(X,map) \ mov=immovie(RGB) subimage在一副图中显示多个图像 语法:subimage(X,map) \ subimage(I) \ subimage(BW) \ subimage(RGB) \ subimage(x,y,...) \ subimage(...) truesize调整图像显示尺寸 语法:truesize(fig,[mrowsmcols]) \ truesize(fig) warp 将图像显示到纹理映射表面 语法:warp(X,map) \ warp(I ,n) \ warp(z,...) warp(x,y,z,...) \ h=warp(...) zoom 缩放图像 语法:zoom on \ zoom off \ zoom out \ zoom reset \ zoom \ zoom xon \ zoom yon\ zoom(factor) \ zoom(fig,option) 2课程设计分析 2.1 图像的霍夫曼编码概述 赫夫曼(Huffman)编码是1952年提出的,是一种比较经典的信息无损熵编码,该编码依据变长最佳编码定理,应用Huffman算法而产生。Huffman编码是一种基于统计的无损编码。 根据变长最佳编码定理,Huffman编码步骤如下: (1)将信源符号xi按其出现的概率,由大到小顺序排列。 (2)将两个最小的概率的信源符号进行组合相加,并重复这一步骤,始终将较大的概率分支放在上部,直到只剩下一个信源符号且概率达到1.0为止; (3)对每对组合的上边一个指定为1,下边一个指定为0(或相反:对上边一个指定为0,下边一个指定为1); (4)画出由每个信源符号到概率1.0处的路径,记下沿路径的1和0; (5)对于每个信源符号都写出1、0序列,则从右到左就得到非等长的Huffman码。 Huffman编码的特点是: (1)Huffman编码构造程序是明确的,但编出的码不是唯一的,其原因之一是两个概率分配码字“0”和“1”是任意选择的(大概率为“0”,小概率为“1”,或者反之)。第二原因是在排序过程中两个概率相等,谁前谁后也是随机的。这样编出的码字就不是唯一的。 (2)Huffman编码结果,码字不等长,平均码字最短,效率最高,但码字长短不一,实时硬件实现很复杂(特别是译码),而且在抗误码能力方面也比较差。 (3)Huffman编码的信源概率是2的负幂时,效率达100%,但是对等概率分布的信源,产生定长码,效率最低,因此编码效率与信源符号概率分布相关,故Huffman编码依赖于信源统计特性,编码前必须有信源这方面的先验知识,这往往限制了霍夫曼编码的应用。 (4)Huffman编码只能用近似的整数位来表示单个符号,而不是理想的小数,这也是Huffman编码无法达到最理想的压缩效果的原因。 2.2 图像的霍夫曼编码举例 假设一个文件中出现了8种符号S0,S1,S2,S3,S4,S5,S6,S7,那么每种符号要编码,至少需要3比特。假设编码成000,001,010,011,100,101,110,111那么符号序列S0S1S7S0S1S6S2S2S3S4S5S0S0S1编码后变成000001111000001110010010011100101000000001,共用了42比特。我们发现S0,S1,S2这三个符号出现的频率比较大,其它符号出现的频率比较小,如果我们采用一种编码方案使得S0,S1,S2的码字短,其它符号的码字长,这样就能够减少占用的比特数。例如,我们采用这样的编码方案:S0到S7的码字分别01,11,101,0000,0001,0010,0011,100,那么上述符号序列变成011110001110011101101000000010010010111,共用了39比特,尽管有些码字如S3,S4,S5,S6变长了(由3位变成4位),但使用频繁的几个码字如S0,S1变短了,所以实现了压缩。 可由下面的步骤得到霍夫曼码的码表 (1) 首先把信源中的消息出现的频率从小到大排列。 (2) 每一次选出频率最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。 (3) 重复(2),直到最后得到和为1的根节点。 (4) 将形成的二叉树的左节点标0,右节点标1。把从最上面的根节点到最下面的叶子节点途中遇到的0,1序列串起来,就得到了各个符号的编码。 上面的例子用Huffman编码的过程如图下图所示,其中圆圈中的数字是新节点产生的顺序。

相关主题