Matlab程序代码
- 格式:docx
- 大小:18.04 KB
- 文档页数:4
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):-1:1
%获取初始分割结果
segn=myZoomOut(seg{
n+1
});
%获取尺度n上的最终分割结果
wn=w{
n
};
segn=ICMn(wn,segn,class_number,potential,maxIter);
%保存尺度n上的分割结果
seg{
n
}=segn;
end
end
function [seg]=ICMn(image,seg,class_number,potential,maxIter)
%尺度n上已知初始结果的ICM分割
[width,height,bands]=size(image);
%将图像和初始分割结果分别转换为向量
image=imstack2vectors(image);
seg=imstack2vectors(seg);
%ICM迭代 iter=0;
while(iter %估计特征场参数 [mu,sigma]=GMM_parameter(image,seg,class_number); %计算特征场能量 Ef=EnergyOfFeatureField(image,mu,sigma,class_number); %计算标记场能量 El=EnergyOfLabelField(seg,potential,width,height,class_number); % 计算新的分割结果 E=Ef+El; [tm,seg]=min(E,[],2); % 更新迭代条件 iter=iter+1; end seg=reshape(seg,[width height]); 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*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,class_number); fori=1:class_number Im_i=image(seg==i,:); [sigma(:,:,i),mu(i,:)]=covmatrix(Im_i); end end 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'; end end function [E]=EnergyOfLabelField(seg,potential,width,height,class_number) % seg-向量化的像素标记矩阵 % potential-Potts模型势函数取值 % width,height-图像大小 n=size(seg,1); seg=reshape(seg,[width height]); %计算领域 nei8_image=neighbor8syn(seg); Nei8=imstack2vectors(nei8_image); %计算标记场能量 E=zeros(n,class_number); fori=1:class_number E(:,i)=sum(Nei8~=i,2); end E=E*potential; end function nei=neighbor8syn(Y) [s,t,P]=size(Y); Yul=zeros(s,t,P); Yul(2:s,2:t,:)=Y(1:s-1,1:t-1,:); Yu=zeros(s,t,P); Yu(2:s,:,:)=Y(1:s-1,:,:); Yur=zeros(s,t,P); Yur(2:s,1:t-1,:)=Y(1:s-1,2:t,:); Yr=zeros(s,t,P); Yr(:,1:t-1,:)=Y(:,2:t,:); Ydr=zeros(s,t,P); Ydr(1:s-1,1:t-1,:)=Y(2:s,2:t,:); Yd=zeros(s,t,P); Yd(1:s-1,:,:)=Y(2:s,:,:); Ydl=zeros(s,t,P); Ydl(1:s-1,2:t,:)=Y(2:s,1:t-1,:); Yl=zeros(s,t,P); Yl(:,2:t,:)=Y(:,1:t-1,:); nei=cat(3,Yul,Yu,Yur,Yr,Ydr,Yd,Ydl,Yl); end function [E]=EnergyOfFeatureField(image,mu,sigma,class_number) % mu-均值矩阵 % sigma-方差矩阵 n=size(image,1); E=zeros(n,class_number); % 计算能量 fori=1:class_number mu_i=mu(i,:); sigma_i=sigma(:,:,i); diff_i=image-repmat(mu_i,[n,1]); E(:,i)=sum(diff_i*inv(sigma_i).*diff_i,2)+log(det(sigma_i)); end end