资源描述:
《数字图像处理图像编码.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、数字图像处理上机实习报告(DIP4----DIP7)学生姓名:杜坤班级:071123学号:20121003699指导老师:傅华明22DIP-4图像编码一.题目要求对图实施费诺-香农编码和解码,计算图像熵,平均码长和冗余度。二.算法设计1.测试脚本的程序框图2.编码程序框图读入图像的直方图,将图像的灰度值按照概率大小排序,按照香农编码的规则编码。香农编码将概率由大到小,由上到下排成一排,然后分为两组。是将大的一组概率赋值为0,概率小的一组赋值为1,这是赋值的原则。然后依次的重复,直到每组只有一种输入元素为止。223.解码程序框图三.实现代码1.脚本文件clearallloadmatp=impr
2、(a);%统计概率code=FanoCodeInit(p);%Fano编码初始化22code=FanoEncoder(code);%Fano编码outstream=FanoCodeStream(a,code);%输出data=FanoDecoder(outstream,code);%解码data=reshape(data,8,8);%恢复8*8的形状data=data';%转置I=abs(p.*log2(p));disp('图像的熵为:');H=sum(I(:))%计算熵disp('图像的平局码长为:')B=FanoCodeLength(code);%求平均长度disp('编码冗余度为:')
3、;r=B/H-1%求冗余disp('编码效率为:')e=H/B%求编码效率ifisequal(a,data)msgbox('解码后的数据和输入的数据完全吻合');end2.统计灰度的概率function[p]=impr(f)%概率统计[m,n]=size(f);graymax=max(f(:));%找出灰度最大值,划定统计范围p=zeros(1,graymax+1);fori=1:mforj=1:nx=f(i,j)+1;p(x)=p(x)+1;endendp=p/(m*n);End3.码字的初始化function[code]=FanoCodeInit(p)%FanoShano码字初始化[m,
4、n]=size(p);fori=1:ncode(i).gray=i-1;code(i).p=p(i);code(i).str='';end22%冒泡法排序fori=1:nforj=1:n-iifcode(j).p>code(j+1).ptemp=code(j);code(j)=code(j+1);code(j+1)=temp;endendendend4.编码function[pin]=FanoEncoder(pin)%FanoShano编码[m,n]=size(pin);flag=1;while(flag)start=1;stop=1;temp=pin(1);fori=1:n-1ifiseq
5、ual(temp.str,pin(i+1).str)stop=stop+1;elseifstop==startstart=i+1;stop=start;temp=pin(i+1);elsebreak;endendifstop~=startpin=FanoCodeCat(pin,start,stop);elseifi==n-1flag=0;%退出while(flag)的循环22endendendend5.输出码流function[outstream]=FanoCodeStream(data,code)[m,n]=size(data);len=length(code);outstream='';
6、fori=1:mforj=1:nfork=1:lenifcode(k).gray==data(i,j);outstream=[outstream,code(k).str];break;endendendendend6.解码function[data]=FanoDecoder(instream,code)len=length(instream);str='';gray=0;flag=0;data=0;fori=1:len[gray,flag]=LookUp(code,[str,instream(i)]);ifflagdlen=length(data);data(dlen+1)=gray;str
7、='';elsestr=[str,instream(i)];endenddlen=length(data);data=data(2:dlen);end227.搜索码字function[data,flag]=LookUp(code,str)len=length(code);flag=0;data=0;fori=1:lenifisequal(str,code(i).str)data=code(i).gray;fl