77范文网 - 专业文章范例文档资料分享平台

基于MATLAB的图像Huffman编码研究(2)

来源:网络收集 时间:2018-12-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

codeword_tmp=cell(len,1);%创建一个len行1列的细胞型变量用于存放码字 while length(f)>1 %生成Huffman树,得到二进制码字编码表 index1=symbols_index{1}; index2=symbols_index{2};

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);%得到新的索引表 end

codeword=cell(256,1);

codeword(symbols)=codeword_tmp;%各符号二进制码字按原符号位存入细胞型矩阵 len=0;

for i=1:length(symbols)%得到各符号码长矩阵 wordlen(i)=length(codeword_tmp{i}); end

avawordlen=fs*wordlen';%计算平均码长 Hlog=log2(fs)';

H=-(fs*Hlog);%计算信息熵

for index=1:length(vector)%得到整个图像各点灰度值转化为二进制码字后的总比特数 len=len+length(codeword{double(vector(index))+1}); end

string=repmat(uint8(0),1,len);%创建元素数与总比特数一致的行向量 pointer=1;%定义指针变量

for index=1:length(vector) %对输入图像进行编码

code=codeword{double(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 zp>0

string=[string uint8(zeros(1,zp))];%不足8位的在后补零 end

codeword=codeword(symbols);%码字按符号概率放入列向量中 codelen=zeros(size(codeword));%创建与列向量元素数相同的列向量 weights=2.^(0:23);

maxcodelen=0;

for index=1:length(codeword)

len=length(codeword{index});%读二进制码字长度 if len>0

code=sum(weights(codeword{index}==1));%计算二进制码字对应的十进制数 code=bitset(code,len+1);%将码字最高位的上一位置1 codeword{index}=code;

codelen(index)=len;%码字长度存入列向量中 end end

codeword=[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)

if~isa(vector,'uint8')%确定矩阵是uint8格式

error('input argument must be a uint8 vector'); end

f=zeros(1,256);%设置一个256个元素都为0的行向量 len=length(vector);%读取输入矩阵元素个数 for index=0:1:255

f(index+1)=sum(vector==index);%统计输入图像矩阵中0至255各值出现的个数,存入一个行向量中 end

f=f./len;%求各符号值出现的概率

%函数addnode添加节点确定符号码字

function codeword_new=addnode(codeword_old,item)

codeword_new=cell(size(codeword_old));%前一步码字维数作为新细胞型变量的维数,用于存放码字

for index=1:length(codeword_old)%确定符号对应码字 codeword_new{index}=[item codeword_old{index}]; end

4.3 译码程序

%huffdecode函数对输入矩阵vector进行Huffman编码,返回解压后的图像数据 function vector=huffdecode(zipped,info)

if~isa(zipped,'uint8')%确定压缩矩阵是uint8格式

error('input argument must be a uint8 vector'); end

len=length(zipped);%读取压缩矩阵长度

string=repmat(uint8(0),1,len*8);%创建全为0的行向量 bitindex=(1:8); for index=1:len

string(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex));%读取压缩矩阵中的值并转化为8位二进制按顺序放入string矩阵中 end

len=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 byte>0%若读取到对应符号则进行下面操作,无符号继续按位读取码字 vector(vectorindex)=byte-1;%将符号表示的灰度值放入容器矩阵中 codeindex=1;%重置 code=0;%重置

vectorindex=vectorindex+1;%容器指针移位 end end

vector=reshape(vector,info.rows,info.cols);%将构成的灰度矩阵按原图矩阵行列数重构,解码完成

%函数decode返回码字对应的符号

function byte=decode(code,info) byte=info.huffcodes(code);

5.测试和调试

运行结果:

平均码长L=7.6057;压缩比CR=1.0518;信息熵H=7.5789;编码效率CE=0.9965

平均码长L =6.9685;压缩比CR =1.1480;信息熵H =6.9427;编码效率CE =0.9963

经过多次测试和调整,最终编码结果正确,解码结果正确,程序运行正确。

6.总结

感谢李雷达老师教授《数字视频技术》课程并为我们安排了这次课程设计。通过这次课设,我们更深地熟悉和掌握了MATLAB 程序设计方法和灰度图像Huffman的编码解码过程,学会了运用MATLAB平台对图像进行处理和分析。提高我们编程能力的同时,也让我们对编解码算法有了更深入的理解。

课程设计是我们专业课程知识综合应用的实践训练,是我们迈向社会,从事职业工作前一个必不少的过程。在这次的课程设计中不仅检验了我们所学习的知识,也引发了我们对如何去把握一件事情,如何去做一件事情,如何完成一件事情等问题的思考。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督,提高了团队合作能力,学到了平时在课上学不到的知识,每个人都得到了很大的进步。

通过这次数字视频技术课程设计,我们在多方面都有所提高。这次课程设计中,综合运用了本专业所学课程的理论知识。学会了在图像处理过程中,运用编程思维去实现某种功能或效果。在这次设计过程中,体现出自己的能力以及综合运用知识的能力,体会到了学有所用、学以致用的兴奋感和成就感,同时也暴露出了自己平时学习的不足和薄弱环节,进而加以弥补和改正。 参考文献:

[1] 戴辉,卢益民.数字视频技术[M].北京:北京邮电大学出版社,2012.

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于MATLAB的图像Huffman编码研究(2)在线全文阅读。

基于MATLAB的图像Huffman编码研究(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/359551.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: