1数字图像处理上机实习报告(DIP4----DIP7)学生姓名:杜坤班级:071123学号:20121003699指导老师:傅华明2DIP-4图像编码一.题目要求对图实施费诺-香农编码和解码,计算图像熵,平均码长和冗余度。二.算法设计1.测试脚本的程序框图开始读入图像的数据为a统计各个灰度值的概率将码字初始化编码根据编码的码字对图像数据进行输出解码将解码后的数据data变行为8*8计算图像的熵计算图像的平均码长编码的编码效率计算冗余度校对编码前后的数据结束2.编码程序框图读入图像的直方图,将图像的灰度值按照概率大小排序,按照香农编码的规则编码。香农编码将概率由大到小,由上到下排成一排,然后分为两组。是将大的一组概率赋值为0,概率小的一组赋值为1,这是赋值的原则。然后依次的重复,直到每组只有一种输入元素为止。33.解码程序框图三.实现代码1.脚本文件clearallloadmatp=impr(a);%统计概率code=FanoCodeInit(p);%Fano编码初始化4code=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('编码冗余度为:');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,n]=size(p);fori=1:ncode(i).gray=i-1;code(i).p=p(i);code(i).str='';end5%冒泡法排序fori=1:nforj=1:n-iifcode(j).pcode(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-1ifisequal(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)的循环6endendendend5.输出码流function[outstream]=FanoCodeStream(data,code)[m,n]=size(data);len=length(code);outstream='';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='';elsestr=[str,instream(i)];endenddlen=length(data);data=data(2:dlen);end77.搜索码字function[data,flag]=LookUp(code,str)len=length(code);flag=0;data=0;fori=1:lenifisequal(str,code(i).str)data=code(i).gray;flag=1;break;endendend8.获得平均码长function[len_ave]=FanoCodeLength(code)len=length(code);len_ave=0;fori=1:lenlen_ave=len_ave+code(i).p*length(code(i).str);endend四.结果分析经过检验之后可以看出,将图像数据进行编码,然后再解码得到的数据和原图像数据完全一致,说明此程序成功编码解码,达到了题目的要求。算法改进:在编码的时候可以直接将灰度值作为码字的下标,提高编码的效率。8DIP-5图像分割一.题目要求对下图施加高斯噪声,采用LoG算子对含噪声的图象实施边缘分割,找出该图象的最佳边缘。二.算法设计在对图像处理的研究和应用中,人们往往仅对图像中的某些部分感兴趣,这些感兴趣的部分常称为目标或对象,它们一般对应图像中特定的、具有独特性质的区域。图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同,即在一幅图像中把目标从背景中分离出来,以便于进一步处理。图像分割就是指把图像分成互不重叠的区域并提取出感兴趣目标的技术。像的分割有很多种类,边缘分割也有很多种类,LoG算子是其中一类。由于在成像时,一个给定像素所对应的场景点,它的周围点对该点的贡献的光强大小呈正态分布,所以平滑函数应能反映不同远近的周围点对给定像素具有不同的平滑作用,因此,平滑函数采用正态分布的高斯函数,即式中,s是方差。用h(x,y)对图像f(x,y)的平滑可表示为g(x,y)=h(x,y)*f(x,y)如果令r是离原点的径向距离,即r2=x2+y2,转换,然后对图像g(x,y)采用拉普拉斯算子进行边缘检测,可得),(*),(),(*e)],(*),([),(224222222yxfyxhyxfryxfyxhyxgr2222e),(yxyxh9上式中的h2称为高斯—拉普拉斯滤波(LaplacianofGaussian,LoG)算子,也称为“墨西哥草帽”。它是一个轴对称函数,各向同性,它的一个轴截面如图所示。由图可见,这个函数在r=±s处有过零点,在|r|s时为正,在|r|s时为负;可以证明这个算子定义域内的平均值为零,因此将它与图像卷积并不会改变图像的整体动态范围。但由于它相当光滑,因此将它与图像卷积会模糊图像,并且其模糊程度是正比于s的。正因为h2的平滑性质能减少噪声的影响,所以当边缘模糊或噪声较大时,利用h2检测过零点能提供较可靠的边缘位置。在该算子中,s的选择很重要,s小时边缘位置精度高,但边缘细节变化多;s大时平滑作用大,但细节损失大,边缘点定位精度低。应根据噪声水平和边缘点定位精度要求适当选取s。LoG算子用到的卷积模板一般较大,不过这些模板可以分解为一维卷积来快速计算。通过判断零交叉点及其两侧像素符号的变化来确定边缘点。边缘点两侧的二阶微分是异号的,且正号对应边像点的暗侧,负号对应边像点的亮侧,两侧的符号指示着边缘的起伏走向。三.实现代码1.主函数clc;i=imread('D:\matlab2011\work\p5-03.tif');subplot(121);imshow(i);title('原图像');b=log_edge(i);subplot(122);imshow(b);title('原图像');102.LoG算子提取边缘点函数%下面的代码可以实现LoG算子提取边缘点的功能functione=log_edge(a)%该函数实现LoG算子提取边缘点%输入为图像a,输出为边缘图像e[m,n]=size(a);e=repmat(logical(uint8(0)),m,n);sigma=2;%产生同样大小的边缘图像e,初始化为0rr=2:m-1;cc=2:n-1;fsize=ceil(sigma*3)*2+1;%选择点数为奇数的滤波器的尺寸fsize6*sigma;op=fspecial('log',fsize,sigma);%产生LoG滤波器op=op-sum(op(:))/prod(size(op));%将LoG滤波器的均值变为0b=filter2(op,a);%利用LoG算子对图像滤波thresh=.75*mean2(abs(b(rr,cc)));%设置过零检测的门限%寻找滤波后的过零点:+-和-+表示水平方向从左到右和从右到左过零%[+-]'和[-+]'表示垂直方向从上到下和从下到上过零%这里我们选择边缘点为值为负的点[rx,cx]=find(b(rr,cc)0&b(rr,cc+1)0&abs(b(rr,cc)-b(rr,cc+1))thresh);%[-+]的情况e((rx+1)+cx*m)=1;[rx,cx]=find(b(rr,cc-1)0&b(rr,cc)0&abs(b(rr,cc-1)-b(rr,cc))thresh);%[+-]的情况e((rx+1)+cx*m)=1;[rx,cx]=find(b(rr,cc)0&b(rr+1,cc)0&abs(b(rr,cc)-b(rr+1,cc))thresh);%[-+]'的情况e((rx+1)+cx*m)=1;[rx,cx]=find(b(rr-1,cc)0&b(rr,cc)0&abs(b(rr-1,cc)-b(rr,cc))thresh);%[+-]'的情况e((rx+1)+cx*m)=1;%某些情况下LoG滤波结果可能正好为0,下面考虑这种情况:[rz,cz]=find(b(rr,cc)==0);if~isempty(rz)%寻找滤波后的过零%+0-和-0+表示水平方向从左到右和从右到左过零%[+0-]'和[-0+]'表示垂直方向从上到下和从下到上过零%边缘正好位于滤波值为零点上zero=(rz+1)+cz*m;%零点的线性坐标11zz=find(b(zero-1)0&b(zero+1)0&abs(b(zero-1)-b(zero+1))2*thresh);%[-0+]'情况e(zero(zz))=1;zz=find(b(zero-1)0&b(zero+1)0&abs(b(zero-1)-b(zero+1))2*thresh);%[+0-]'情况e(zero(zz))=1;zz=find(b(zero-m)0&b(zero+m)0&abs(b(zero-m)-b(zero+m))2*thresh);%[-0+]情况e(zero(zz))=1;zz=find(b(zero-m)0&b(zero+m)0&abs(b(zero-m)-b(zero+m))2*thresh);%[+0-]情况e(zero(zz))=1;end四.结果分析用LoG算子进行边缘检测的结果如图。Laplace算子对通过图像进行操作实现边缘检测的