资源描述:
《Matlab程序代码》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Matlab程序代码function[seg]=MRMRF(w,class_number,potential,maxIter)%MRMRF图像分割算法%w-待分解图像的多尺度序列%class_number-分类数%potential-potts模型势函数%maxIter-最大迭代次数%多分辨率表达的尺度数L=size(w,1);%分割结果的多尺度序列seg=cell(L,1);%使用ICM算法计算最高尺度的分割结果seg{L}=ICM(w{L},class_number,potential,maxIter);%计算其他尺度的分割结果forn=(L-1
2、):-1:1 %获取初始分割结果 segn=myZoomOut(seg{n+1}); %获取尺度n上的最终分割结果 wn=w{n}; segn=ICMn(wn,segn,class_number,potential,maxIter); %保存尺度n上的分割结果 seg{n}=segn;endend function[seg]=ICMn(image,seg,class_number,potential,maxIter)%尺度n上已知初始结果的ICM分割[width,height,bands]=size(ima
3、ge);%将图像和初始分割结果分别转换为向量image=imstack2vectors(image);seg=imstack2vectors(seg);%ICM迭代iter=0;while(iter4、d(seg,potential,width,height,class_number); %计算新的分割结果 E=Ef+El; [tm,seg]=min(E,[],2); %更新迭代条件 iter=iter+1;endseg=reshape(seg,[widthheight]);end function[x]=myZoomOut(x)%放大x两倍[col,raw,B]=size(x);tm=zeros(2*col,2*raw,B);tm(1:2:2*col,1:2:2*raw,:)=x;tm(2:2:2*col,1:2:2
5、*raw,:)=x;tm(1:2:2*col,2:2:2*raw,:)=x;tm(2:2:2*col,2:2:2*raw,:)=x;x=tm;end %高斯模型参数估计function[mu,sigma]=GMM_parameter(image,seg,class_number)%image-已经向量化的图像数据,每一行表示一个像素%seg-与image对应的图像标记,每一个对应一个像素标记%class_number-图像的分类数[n,d]=size(image);mu=zeros(class_number,d);sigma=zeros(d,d,c
6、lass_number);fori=1:class_number Im_i=image(seg==i,:); [sigma(:,:,i),mu(i,:)]=covmatrix(Im_i);endend function[C,m]=covmatrix(X)[k,n]=size(X);X=double(X);ifk==1 C=0; m=X;else m=sum(X,1)/k; X=X-m(ones(k,1),:); C=(X'*X)/(k-1); m=m';endend function[E]=Ener
7、gyOfLabelField(seg,potential,width,height,class_number)%seg-向量化的像素标记矩阵%potential-Potts模型势函数取值%width,height-图像大小n=size(seg,1);seg=reshape(seg,[widthheight]);%计算领域nei8_image=neighbor8syn(seg);Nei8=imstack2vectors(nei8_image);%计算标记场能量E=zeros(n,class_number);fori=1:class_number
8、E(:,i)=sum(Nei8~=i,2);endE=E*potential;end functionnei