




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
成绩评阅人 中国矿业大学2015-2016学年第二学期数字视频技术课程小设计考核图像的Huffman编码研究专业班级: 信息13-04班 学生姓名: 王振宇、龙航、王一鸣 学生学号: 04131407、04131403、04131406 本人郑重声明:本人认真、独立完成了查找资料、完成作业、编写程序等考核任务,无抄袭行为。签字: 日期:2016.05.171. 引言1.1 图像数据压缩的目的数字图像通常要求很大的比特数,这给图像的传输和存储带来相当大的困难。要占用很多的资源,花很高的费用。一般原始图像存在很大的冗余度。所以,对图像数据压缩显得非常重要。1.2 图像数据压缩的原理对数字图像压缩主要运用两个基本原理:一是图像的相关性。在图像同一相邻像素之间,活动图像的相邻帧的对应像素之间往往存在很强的相关性,去除或减少这些相关性,也就除去或减少图像信息中的冗余度,继而实现对数字图像的压缩。二是人的视觉心理特征,人的视觉对于边缘急剧变化不敏感,对颜色分辨力弱,利用这些特征在相应部分降低编码精度而使人从视觉上感觉不到图像质量的下降,从而达到对数字图像压缩的目的。1.3 Huffman编码Huffman编码是一种编码方式,是一种用于无损数据压缩的熵编码算法。它是Huffman在1952年根据Shannon在1948年和Fano在1949年阐述的这种编码思想下提出的一种不定长编码的方法,有时也称之为最佳编码。依据信源数据中各信号出现的频率分配不同长度的编码。其基本思想是在编码过程中,对出现频率越高的值,分配越短的编码长度,相应地对出现频率越低的值则分配较长的编码长度,完全依据字符出现概率来构造异字头的平均长度最短的码字。哈夫曼编码方法的实质是针对统计结果对字符本身重新编码,而不是对重复字符或重复子串编码,得到的单位像素的比特数最接近图像的实际熵值。2. 设计任务2.1 设计任务研究实现灰度图像的Huffman编码和解码恢复。2.2 设计目的(1) 了解Huffman编码的基本原理及其特点;(2) 理解并熟练对图像进行哈夫曼编码的算法;(3) 学习和熟悉MATLAB图像处理工具箱;(4) 熟悉和掌握MATLAB程序设计方法;2.3 设计要求现灰度图像的Huffman编码和解码恢复图像;处理结果要求最终图像显示,且计算图像的信息熵,平均码字长度,编码效率,压缩比。3. 总体设计方案3.1 系统运行环境Windows 8.1/10系统3.2 编程软件平台MATLAB R2013a/R2014a3.3 Huffman编码算法原理哈夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的哈夫曼码表。编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。(1) 计算信源符号出现的概率;(2) 将信源符号按其出现的概率,由小到大顺序排列,并从左至右排列为叶节点1;(3) 将两个概率最小的顶层节点进行组合相加,组成一个父节点,并在到左右子节点的两条连线上分别标记0和1;(4) 重复上一步骤,直到得到根节点,形成一颗二叉树;(5) 从根节点开始到相应于每个符号的叶节点的0/1串,就是该符号的二进制哈夫曼编码。3.4 Huffman编码算法的特点(1) 编出来的码都是异字头码,保证了码的唯一可译性。(2) 由于编码长度可变。因此译码时间较长,使得哈夫曼编码的压缩与还原相当费时。(3) 编码长度不统一,硬件实现有难度。(4) 对不同信源的编码效率不同,当信源的符号概率为2的负幂次方时,达到100的编码效率;若信源符号的概率相等,则编码效率最低。(5) 由于符号按概率大小排列既可以从右到左也可以从左到右,即0与1的指定是任意的,故最后的编码结果可能不唯一,但仅仅是分配的代码不同,其平均码长是一样的,故不影响编码效率与数据压缩性能。3.5 算法流程图设计3.5.1 主流程图开始加载图像,并将其灰度化将灰度图像转换成无符号的8位整数矩阵调用Huffman编码程序进行压缩调用Huffman解码程序进行解码显示原始图像、灰度图像和经编码解码后的图像结束显示平均码长、压缩比、信息熵及编码效率3.5.2 编码流程图开始计算各符号(灰度值)出现概率按照概率从小到大排序生成Huffman树得到二进制哈夫曼编码码字对图像(图像矩阵)进行编码计算编码参数(平均码长、信息熵等)计算二进制码字对应的十进制数,并存入矩阵中,得到码字与灰度值的对应关系表,即码表结束 3.5.3 解码流程图开始结束读取压缩矩阵,并存入行向量中解码后的矩阵按图像矩阵尺寸重排,得到解码矩阵解码,按位读取行向量中的编码并进行相应灰度值匹配3.6 组员任务分工王振宇:编写主要程序,编码解码函数程序及相关子程序,修改报告及演示文稿。龙航:编写部分主程序及部分函数程序,撰写报告。王一鸣:编写部分程序,进行程序调试完善,制作演示文稿。4. 程序实现4.1 函数主程序clc;clear;close all;X=imread(peppers.JPG);%图像灰度化R=X(:,:,1);G=X(:,:,2);B=X(:,:,3);Y=0.299*R+0.587*G+0.114*B;subplot(1,3,1);imshow(X);title(原始图像);data=uint8(Y);zipped,info=huffencode(data);%调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info);%调用Huffman编码程序进行解码%显示原始图像,灰度化图像和经编码解码后的图像subplot(1,3,2);imshow(data);title(灰度化图像);subplot(1,3,3);imshow(unzipped);title(Huffman编码并解码后图像);disp(平均码长);L=info.avalendisp(压缩比);CR=info.ratiodisp(信息熵);H=info.hdisp(编码效率);CE=info.ce4.2 编码程序%huffencode函数对输入矩阵vector进行Huffman编码,返回编码后的数据及相关信息function zipped,info=huffencode(vector)if isa(vector,uint8)%确定输入矩阵是uint8格式 error(input argument must be a uint8 vector);endm,n=size(vector);%求输入矩阵的行列数vector=vector(:);%将矩阵按列转换成一列后转至,成为一个行向量(其中存放灰度值)f=frequency(vector);%计算各符号出现的概率symbols=find(f=0);%返回概率矩阵中非零元素的位置向量,作为符号向量f=f(symbols);%非零概率位置上的概率值组成非零概率行向量f,sortindex=sort(f);%将符号按照出现的概率从小到大排序,并保留非零概率向量位置索引fs=f;symbols=symbols(sortindex);%读出原位置向量中的值(即概率向量中的位置),得到按概率排序后的符号向量len=length(symbols);%读取位置向量的长度symbols_index=num2cell(1:len);%生成从1开始以1递增,1行len列的细胞型矩阵codeword_tmp=cell(len,1);%创建一个len行1列的细胞型变量用于存放码字while length(f)1 %生成Huffman树,得到二进制码字编码表 index1=symbols_index1; index2=symbols_index2; codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0);%添加节点且该分支按0标记 codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1);%添加节点且该分支按1标记 f=sum(f(1:2) f(3:end);%求出两个最小概率之和,列出其他概率,组成一个新的行向量 symbols_index=index1,index2 symbols_index(3:end);%合并已编码的符号索引 f,sortindex=sort(f);%将新的概率向量按照概率从小到大排序 symbols_index=symbols_index(sortindex);%得到新的索引表endcodeword=cell(256,1);codeword(symbols)=codeword_tmp;%各符号二进制码字按原符号位存入细胞型矩阵len=0;for i=1:length(symbols)%得到各符号码长矩阵wordlen(i)=length(codeword_tmpi);endavawordlen=fs*wordlen;%计算平均码长Hlog=log2(fs);H=-(fs*Hlog);%计算信息熵for index=1:length(vector) %得到整个图像各点灰度值转化为二进制码字后的总比特数 len=len+length(codeworddouble(vector(index)+1);endstring=repmat(uint8(0),1,len);%创建元素数与总比特数一致的行向量pointer=1;%定义指针变量for index=1:length(vector) %对输入图像进行编码 code=codeworddouble(vector(index)+1;%对应符号的二进制码字给code len=length(code);%读取码字长度 string(pointer+(0:len-1)=code;%将二进制码字存入行向量中 pointer=pointer+len;%指针移移位end% 将二进制编码按照每8位生成一个新字符。len=length(string);zp=8-mod(len,8);if zp0 string=string uint8(zeros(1,zp);%不足8位的在后补零endcodeword=codeword(symbols);%码字按符号概率放入列向量中codelen=zeros(size(codeword);%创建与列向量元素数相同的列向量weights=2.(0:23);maxcodelen=0;for index=1:length(codeword) len=length(codewordindex);%读二进制码字长度 if len0 code=sum(weights(codewordindex=1);%计算二进制码字对应的十进制数 code=bitset(code,len+1);%将码字最高位的上一位置1 codewordindex=code; codelen(index)=len;%码字长度存入列向量中 endendcodeword=codeword:;%转化为行向量%计算压缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.(0:7);zipped=uint8(weights*double(string);%码表存储到一个稀疏矩阵huffcodes=sparse(1,1);for index=1:nnz(codeword) huffcodes(codeword(index),1)=symbols(index);end%返回编码参数info.zeropad=zp;%info.zeropad是添加的比特数info.huffcodes=huffcodes;%info.huffcodes是Huffman码字表info.length=length(vector);%info.length是灰度化图像矩阵长度info.rows=m;%info.rows是灰度化图像行数info.cols=n;%info.cols是灰度化图像列数info.avalen=avawordlen;%info.ratio是平均码长info.ratio=8/avawordlen;%info.ratio是压缩比info.h=H;%info.h是信息熵info.ce=H/avawordlen;%info.ce是计算编码效率%函数frequency计算各符号出现的概率function f=frequency(vector)ifisa(vector,uint8) %确定矩阵是uint8格式 error(input argument must be a uint8 vector);endf=zeros(1,256);%设置一个256个元素都为0的行向量len=length(vector);%读取输入矩阵元素个数for index=0:1:255 f(index+1)=sum(vector=index);%统计输入图像矩阵中0至255各值出现的个数,存入一个行向量中endf=f./len;%求各符号值出现的概率%函数addnode添加节点确定符号码字function codeword_new=addnode(codeword_old,item)codeword_new=cell(size(codeword_old);%前一步码字维数作为新细胞型变量的维数,用于存放码字for index=1:length(codeword_old)%确定符号对应码字 codeword_newindex=item codeword_oldindex;end4.3 译码程序%huffdecode函数对输入矩阵vector进行Huffman编码,返回解压后的图像数据function vector=huffdecode(zipped,info)ifisa(zipped,uint8)%确定压缩矩阵是uint8格式 error(input argument must be a uint8 vector);endlen=length(zipped);%读取压缩矩阵长度string=repmat(uint8(0),1,len*8);%创建全为0的行向量bitindex=(1:8);for index=1:lenstring(bitindex+8.*(index-1)=uint8(bitget(zipped(index),bitindex);%读取压缩矩阵中的值并转化为8位二进制按顺序放入string矩阵中endlen=length(string);%开始解码weights=2.(0:51);vector=repmat(uint8(0),1,info.length);%创建与灰度化图像行向量等长的行向量vectorindex=1;codeindex=1;code=0;for index=1:len-1 code=bitset(code,codeindex,string(index);%按位读编码码字 codeindex=codeindex+1;%移位 byte=decode(bitset(code,codeindex),info);%进行码字匹配,读取相对应符号 if byte0%若读取到对应符号则进行下面操作,无符号继续按位读取码字 vector(vectorindex)=byte-1;%将符号表示的灰度值放入容器矩阵中 codeindex=1;%重置 code=0;%重置 vectorindex=vectorindex+1;%容器指针移位 endendvector=reshape(vector,info.rows,info.cols);%将构成的灰度矩阵按原图矩阵行列数重构,解码完成%函数decode返回码字对应的符号functio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 狼疮肾炎课件
- 牵引变电站课件
- 农业废弃物资源化利用项目技术创新与产业协同创新研究报告
- 牧童的课件教学课件
- 辽宁工厂面试题库及答案
- 粮食储存面试题库及答案
- 乐清国企面试题库及答案
- 篮球教师面试题库及答案
- 跨境电商面试题库及答案
- 安全教育培训财务岗位课件
- 2025年箱变考试题库
- 2025年G2电站锅炉司炉理论考试试题(1000题)含答案
- 第3课 学习有方法 第2课时(课件)2025-2026学年道德与法治三年级上册统编版
- 2025年幼儿园膳食工作计划
- 2025年中国电信校招试题及答案
- 《建筑工程资料管理》高职土建类相关专业全套教学课件
- 消防队伍管酒治酒课件
- 2025年中铁特货物流股份有限公司招聘笔试参考题库附带答案详解
- 职业等级考评员培训课件
- 2025至2030全球及中国细胞培养行业产业运行态势及投资规划深度研究报告
- 2025年《党政机关厉行节约反对浪费条例》应知应会测试考试题库
评论
0/150
提交评论