图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

DIP上机报告题目:数字图像处理上机报告(第4次)学校:中国地质大学(武汉)指导老师:傅华明姓名:龙勋班级序号:071112-06目录1图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算错误!未定义书签。2上机小结.........................................................................................10注:给定的文件夹中只需运行test脚本就可以得到结果,从workspace中看到相应的数据4.2图像的霍夫曼编码与解码题目要求:对图2实施哈夫曼编码和解码,计算图象熵,平均码长和冗余度;算法设计:1.遍历图像,统计各个像素灰度值的概率2.找出概率最小的两个,在最小概率所代表的灰度值编码中加1,在另一个较小的概率所代表的灰度值编码中加03.合并两个概率,成为一个新的元素,如此重复下去,直到最后剩两个元素4.进行编码的逆过程,即解码过程5.计算相应的数据程序代码:运行代码:clearin=[2,2,3,5,0,0,5,5,5,4,1,1,2,2,1,5,4,6,5,5,7,2,2,3,5,2,2,2,3,4,4,4,6,2,1,4,1,1,2,2,1,5,7,6,5,5,7,2,2,4,4,1,2,2,1,5,2,3,1,2,2,1,5,0];[p,out]=gailv(in);[code]=Huffman(0:7,p);%进行霍夫曼编码[Coded_Img]=Encode(in,code);%对图像进行编码[H,L,R]=GetInfo(code);%计算熵、平均码长、冗余度[Img]=Decode(Coded_Img,code);%对图像进行解码图像各像素灰度的概率计算:function[p,out]=gailv(in)[M,N]=size(in);out=zeros(4,8);p=zeros(1,8);fori=1:8out(1,i)=i-1;endfori=1:Mforj=1:Nfork=1:8ifin(i,j)==out(1,k)out(2,k)=out(2,k)+1;endendendendfori=1:8out(3,i)=out(2,i)/(M*N);p(1,i)=out(2,i)/(M*N);endend霍夫曼编码过程:function[code_out]=Huffman(s,p)[Ms,Ns]=size(s);if(Ms==1)sig=s';elsesig=s;end%s为各元素名称p为各元素概率[Ms,Ns]=size(sig);[Mp,Np]=size(p);if(Ms~=Np)return;endcode=cell(Ms,4);%建立编码cellcode_out=cell(Ms,3);%建立输出cellcoding=cell(Ms,2);%建立编码过程中用到的cellfori=1:Mscode{i,1}=sig(i,:);%第一列为元素名称code{i,2}=[];%第二列为编码code{i,3}=p(i);%第三列为元素概率code{i,4}=[];%第四列为元素概率排行coding{i,1}=p(i);%第一行为元素概率coding{i,2}=i;%第二行表示此概率由哪些元素组成end[m,l]=Cell_min(coding(:,1));%找出最小值while(m1)%若最小值小于1(编码尚未完成)[m1,l1]=Cell_min(coding(:,1));%找出最小值temp_p=coding{l1,1};%记录下最小概率coding{l1,1}=2;%将概率改为2,则以后不会再次取到[m2,l2]=Cell_min(coding(:,1));%找出次小值coding{l2,1}=coding{l2,1}+temp_p;%最小概率和次小概率相加得到新元素概率[k,mp]=size(coding{l1,2});%考虑最小概率包含了哪些元素fori=1:mpcode{coding{l1,2}(i),2}=[1,code{coding{l1,2}(i),2}];%在这些元素的编码前加1end[k,mp]=size(coding{l2,2});%考虑次小概率包含了哪些元素fori=1:mpcode{coding{l2,2}(i),2}=[0,code{coding{l2,2}(i),2}];%在这些元素的编码前加0endcoding{l2,2}=[coding{l2,2},coding{l1,2}];%新元素包含了次小和最小元素包含的所有元素[m,l]=Cell_min(coding(:,1));%找出当前最小值,继续循环endfori=1:Mscode_out(i,1:3)=code(i,1:3);%输出cell前3列等于编码cell前3列end求概率的最小值函数:function[mind,loc]=Cell_min(data)%找出cell中的某列元素的最小值和位置[M,N]=size(data);loc=-1;fori=1:Md(i)=data{i}(1,1);endturemin=min(d);%找出最小值fori=1:M%遍历矩阵,找出最小值所在位置if(d(i)==turemin)mind=d(i);loc=i;return;endendend图像编码代码:function[Coded_Img]=Encode(img,code)%遍历图像,查表确定码字[M,N]=size(img);[Mc,Nc]=size(code);Coded_Img=cell(M,N);fori=1:Mforj=1:Ndata=img(i,j);fork=1:Mcif(code{k,1}==data)Coded_Img{i,j}=code{k,2};endendendendend图像解码代码:function[img]=Decode(Coded_Img,code)%遍历编码图像,查表确定数值[M,N]=size(Coded_Img);[Mc,Nc]=size(code);fori=1:Mforj=1:Ndata=Coded_Img{i,j};fork=1:Mcif(size(data)==size(code{k,2}))if(code{k,2}==data)img(i,j)=code{k,1};endendendendendend相关数据的计算:function[H,L,R]=GetInfo(code)[M,N]=size(code);H=0;fori=1:MH=H+code{i,3}*log2(1/code{i,3});end%计算熵L=0;fori=1:M[m,n]=size(code{i,2});L=L+code{i,3}*n;end%计算平均码长R=L/H-1;%计算冗余度end运行结果:编码前图像:编码后图像:解码后图像:熵(H)、平均码长(L)、冗余度(R)至此,成功实现了图像矩阵的编码和解码以及相关参数的计算。上机小结:此次试验是对图像的矩阵进行霍夫曼编码和解码,编程的过程并不像平时做题一样很顺利。有很多平时认为很简单的编码过程用程序实现起来比较麻烦,但是也进一步了解到了霍夫曼编码的原理。在这次编程的过程中我还有一个比较棘手的问题没有解决,就是在霍夫曼编码的过程中,由于各个元素的概率是以double型的数据出现的,进行了四舍五入的处理。如果在编码过程中有几个概率都进行了四舍五入的处理,那么在计算它们的和的过程中数据有可能会与真实值有所差异,而这个结果有可能与较大的概率相差很小,那么在编码时系统会自动根据此时概率的大小进行排列,有可能出现错误。所以在计算机处理问题与我们平时做题时还是会有一点区别,这要求我在以后的学习中还要更加深入地感受这一方面。

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功