
2022年王鸣哈夫曼编码图像编解码系统方案及实现.pdf
24页个人资料整理仅限学习使用课程设计任务书学生姓名:王鸣专业班级:信息sy1001 班指导教师:魏洪涛工作单位:信息工程学院题目:基于哈夫曼编码的图像编解码系统设计及实现初始条件:计算机Windows8 操作系统MATLAB7.8.0 软件要求完成的主要任务 : 设计哈夫曼编码的图像编解码系统、利用软件编写程序、仿真实现时间安排:第 1-18 周:理论讲解第 19 周:理论设计,实验室安装调试以及撰写设计报告答辩:时间:7 月 2 日地点: 鉴主 15 楼通信实验室四指导教师签名:年月日系主任 或责任教师)签名:年月日精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 24 页个人资料整理仅限学习使用目录目录 I摘要 IIABSTRACTIII1 引言 11.1 图像数据压缩的目的11.2 图像数据压缩的原理11.3 常用的压缩编码方法32 哈夫曼编码 32.1 哈夫曼编码简介32.2 哈夫曼编码步骤 32.3 哈夫曼编码的缺点53 基于哈夫曼编码的图像编解码系统的程序设计63.1 分块程序设计分析63.2 主程序 83.3 程序函数 83.3.1编码函数 83.3.2解码函数 123.3.3符号概率计算函数133.3.4节点添加函数 143.3.5解码返回符号函数144 系统仿真结果 154.1 程序运行结果 154.2 程序运行结果分析165.总结 18参考文献 19精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 24 页个人资料整理仅限学习使用摘要本论文首先介绍了图像压缩相关知识。
随后,分析概述了哈夫曼压缩编码的原理及方法,并采用 MATLAB 软件对两幅图片进行压缩编码程序设计,获得压缩信息及哈夫曼编码表,分析压缩后的图像像素数据及压缩比关键词: 图像压缩; MATLAB ;哈夫曼编码无损压缩编码精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 24 页个人资料整理仅限学习使用ABSTRACT This paper firstly introduces the theoretical knowledgeof image compression. Then, it analyses the principle and method of Huffman codingand using Huffman coding principle and methods, compression coding design is made for two images on the MATLAB software.Also gain the compression information and Huffman coding table.What s more,compressed image pixel data and compression ratio are analyzed. Key words:Image compression 。
MATLAB Huffman encodingLossless compression coding精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 24 页个人资料整理仅限学习使用1引言1.1图像数据压缩的目的数字图像通常要求很大的比特数,这给图像的传输和存储带来相当大的困难要占用很多的资源,花很高的费用一般原始图像中存在很大的冗余度例如 1;一幅 512x512的灰度图象的比特数为512x512x8=256k 例如 2;一部 90 分钟的彩色电影,每秒放映24帧把它数字化,每帧512x512象素,每象素的 R、G、B 三分量分别占 8 bit,总比特数为 90 x60 x24x3x512x512x8bit=97,200M例如 3:一张 CD 光盘可存 600兆字节数据,这部电影光图像,对颜色分辨力弱,利用这些特征可以在相应部分适当降低编码精度而使人从视觉上并不感觉到图像质量的下降,从而达到对数字图像压缩的目的图像压缩是通过删除图像数据中冗余的或者不必要的部分来减小图像数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程。
压缩技术分为无损压缩和有损压缩两大精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 24 页个人资料整理仅限学习使用类,前者在解码时可以精确地恢复原图像,没有任何损失;后者在解码时只能近似原图像,不能无失真地恢复原图像假设有一个无记忆的信源,它产生的消息为 ai,1 iN,其出现的概率是已知的 ,记为 P(ai则其信息量定义为 :由此可见一个消息出现的可能性越小,其信息量就越多,其出现对信息的贡献量越大,反之亦然信源的平均信息量称为“熵”entropy),可以表示为:对上式取以 2 为底的对数时,单位为比特bits):根据香农 Shannon)无噪声编码定理,对于熵为H 的信号源,对其进行无失真编码所可能达到的最低比特数为,这里为一任意小的正数,因此可能达到的最大压缩比:其中 B 是原始图像的平均比特率在图像压缩中,压缩比是一个重要的衡量指标可以定义压缩比为:图像的平均码字长度R 为:编码效率 定义为 : 信息冗余度为:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 24 页个人资料整理仅限学习使用1.3常用的压缩编码方法图 1-1 常用的压缩编码方法2哈夫曼编码2.1 哈夫曼编码简介哈夫曼编码是哈夫曼博士在1952 年根据可变长最佳编码定理提出的,它依据信源数据中各信号出现的频率分配不同长度的编码。
即,对于出现概率大的信息符号编以短字长的码,对于出现概率小的信息符号编以长字长的码采用哈夫曼编码方法的实质是针对统计结果对字符本身重新编码,而不是对重复字符或重复子串编码,得到的单位像素的比特数最接近图像的实际熵值它是一种无损编码方法2.2哈夫曼编码步骤其具体步骤如下:1.将信源符号按出现概率从大到小排成一列,然后把最末两个符号的概率相加,合成一个概率2.把这个符号的概率与其余符号的概率按从大到小排列,然后再把最末两个符号的概率加起来,合成一个概率精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 24 页个人资料整理仅限学习使用3.重复上述做法,直到最后剩下两个概率为止4.从最后一步剩下的两个概率开始逐步向前进行编码每步只需对两个分支各赋予一个二进制码,如对概率大的赋予码0,对概率小的赋予码1例如:假设信源符号为【a、b、c、d、e、f、g】,其出现的概率相应的为【0.25、0.025、0.025、0.05、0.35、0.25、0.05】,一共 7 个字符,对其进行哈夫曼编码,算法如下:首先按照每个字符出现的频率大小从左到右排列:0.35、0.25、0.25、0.05、0.05、0.025、0.025;选出最小的两个值作为叶子节点构成一棵二叉树,值较大的叶子节点在左,两个叶子节点对应的频率之和作为根节点。
把原排列中最小的两个节点删除,新的根节点插入排列保持大小从左到右的排列顺序不变;重复执行2),直到最后得到值为1 的根节点得到一棵哈夫曼树,如下图所示:图 2.1哈夫曼编码树在得到的哈夫曼树上左分支标记1,右分支标记 0,所有的字符根据其频率标记到对应的叶子节点上,从根节点到叶子节点路径上遇到的0、1 字符串即为对应叶子节点所在字符的编码 a、b、c、d、e、f、g七个字符的哈夫曼编码分别是:10、0001、0000、0011、精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 24 页个人资料整理仅限学习使用11、01、0010,可以看到 ,符号只能出现在树叶上 ,任何一个字符的路径都不会是另一字符路径的前缀路径2.3 哈夫曼编码的缺点哈夫曼编码虽然是最佳编码,但存在一些缺点,具体如下:1)对于过短的文件进行编码,意义不大因为存储哈夫曼树的信息需要一定的存储空间;2)利用哈夫曼编码,若用于通信网络,会引起较大的延时;3)对较大文件进行编码,会出现频繁的磁盘读写访问,降低了数据编码的速度精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 24 页个人资料整理仅限学习使用3基于哈夫曼编码的图像编解码系统的程序设计3.1 分块程序设计分析1)首先,寻找出现的所有元素,接着计算各元素出现的概率,并将元素按照出现概率排列,产生码字。
部分程序如下:function huffcode,info=codeingvector)p=probabilityvector); %计算各元素出现的概率simbols=findp); %寻找出现的所有元素p=psimbols);p,sortindex=sortp); %概率从小到大排列simbols=simbolssortindex);%将元素按照出现概率排列len=lengthsimbols);%产生码字2)把出现的元素概率最小的两个相加合并成新的概率,与剩余的概率组成新的概率集合,直到剩下最后两个概率部分程序如下:while length1;index1=simbols_index1 ;index2=simbols_index2 ;codeword_tmp index1) =addnode codeword_ tmpindex1),uint80);codeword_tmp index2) =addnode codeword_ tmpindex2),uint81);p=sump1:2) p3:end);simbols_index =index1 index2 simbols_index3:end );p,sortindex=sortp);%将数据重新排列simbols_index=simbols_indexsortindex);3)从最后一步开始反向进行分配码字,对于每次相加的两个概率,给大的赋“0”,小的赋“1”,存储到一个稀疏矩阵,最后写出01 序列的哈夫曼编码。
部分程序如下:pad=8-mod0;string=string uint8zeros1,pad);end cols=lengthstring)/8;%计算压缩后的向量string=reshapestring ,8,cols);weights=2.0:7);huffcode =uint8 weights*double string); % 编码字符串凑成一个%字节一个字节存在huffcode codeword=codewordsimbols);%保存实际有出现元素对应的码字4)把整字节存储的 huffcode 一位一位取出,转为字符串,去掉原来为凑整字节数所添加的零进行解码部分解码程序如下:vector=zeros1,info.length,uint8);%解码vectorindex=1;codeindex=1;code=0;for index=1:len;code=bitsetcode ,codeindex,stringindex);codeindex=codeindex+1 ;byte =info.codetable bitset 0;vectorvectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;5)显示编码的压缩信息 如压缩率、最大码长等),部分程序如下所示:whos data huffcode huffdecode % 显示压缩效果fprintfpad=%dn,info.pad); %info.pad=为凑整字节数,编码字符串最后添。
