【图像分割】基于GMM-HMRF图像分割【含Matlab源码 459期】

一、简介

基于GMM-HMRF图像分割

二、源代码

%%  The EM algorithm
%---input---------------------------------------------------------
%   X: initial 2D labels
%   Y: image
%   GMM: Gaussian mixture model parameters
%   k: number of labels
%   g: number of components of each GMM
%   EM_iter: maximum number of iterations of the EM algorithm
%   MAP_iter: maximum number of iterations of the MAP algorithm
%---output--------------------------------------------------------
%   X: final 2D labels
%   GMM: Gaussian mixture model parameters

%   Copyright by Quan Wang, 2012/12/16
%   Please cite: Quan Wang. GMM-Based Hidden Markov Random Field for 
%   Color Image and 3D Volume Segmentation. arXiv:1212.4527 [cs.CV], 2012.

function [X GMM]=HMRF_EM(X,Y,GMM,k,g,EM_iter,MAP_iter,beta)

sum_U=zeros(1,EM_iter);

for it=1:EM_iter
    fprintf('Iteration: %d\n',it);
    %% update X
    [X sum_U(it)]=MRF_MAP(X,Y,GMM,k,g,MAP_iter,beta,0);

    %% update GMM
    GMM=get_GMM(X,Y,g);
    
    if it>=3 && std(sum_U(it-2:it))<0.01
        break;
    end
end

figure;
plot(1:it,sum_U(1:it),'LineWidth',2);
hold on;
plot(1:it,sum_U(1:it),'.','MarkerSize',20);
title('sum of U in each EM iteration');
xlabel('EM iteration');
ylabel('sum of U');
%% Fitting Gaussian mixture model to data 

%   Copyright by Quan Wang, 2012/12/16
%   Please cite: Quan Wang. GMM-Based Hidden Markov Random Field for 
%   Color Image and 3D Volume Segmentation. arXiv:1212.4527 [cs.CV], 2012.

function GMM=get_GMM(X,Y,g)

k=max(X(:));
GMM=cell(k,1);

for i=1:k
    index=(X==i);
    GMM{
     i} = gmdistribution.fit(Y(index),g,'Regularize',1);
end
%%  The MAP algorithm
%---input---------------------------------------------------------
%   X: initial 3D labels
%   Y: 3D image
%   GMM: Gaussian mixture model parameters
%   k: number of labels
%   g: number of components of each GMM
%   MAP_iter: maximum number of iterations of the MAP algorithm
%   show_plot: 1 for showing a plot of energy in each iteration
%       and 0 for not showing
%---output--------------------------------------------------------
%   X: final 3D labels
%   sum_U: final energy

%   Copyright by Quan Wang, 2012/12/16
%   Please cite: Quan Wang. GMM-Based Hidden Markov Random Field for 
%   Color Image and 3D Volume Segmentation. arXiv:1212.4527 [cs.CV], 2012.

function [X sum_U]=MRF_MAP(X,Y,GMM,k,g,MAP_iter,beta,show_plot)

[m n z]=size(Y);

sum_U_MAP=zeros(1,MAP_iter);
for it=1:MAP_iter % iterations
    fprintf('  Inner iteration: %d\n',it);
    
    U=zeros(m*n*z,k);
    U1=U;
    U2=U;
    y=Y(:);

    for l=1:k % all labels
        for c=1:g
            mu=GMM{
     l}.mu(c,:);
            Sigma=GMM{
     l}.Sigma(:,:,c);
            p=GMM{
     l}.PComponents(c);
            
            yi=y-mu;
            temp1=yi.*yi/Sigma/2;
            temp1=temp1+log(sqrt(Sigma));
            U1(:,l)=U1(:,l)+temp1*p;
        end
     
        for ind=1:m*n*z % all pixels
            [i j q]=ind2ijq(ind,m,n);
            u2=0;
            if i-1>=1
                u2=u2+(l ~= X(i-1,j,q))/2;
            end
            if i+1<=m
                u2=u2+(l ~= X(i+1,j,q))/2;
            end
            if j-1>=1
                u2=u2+(l ~= X(i,j-1,q))/2;
            end
            if j+1<=n
                u2=u2+(l ~= X(i,j+1,q))/2;
            end
            if q-1>=1
                u2=u2+(l ~= X(i,j,q-1))/2;
            end
            if q+1<=z
                u2=u2+(l ~= X(i,j,q+1))/2;
            end
            U2(ind,l)=u2;
        end
    end
    U=U1+U2*beta;
    [temp x]=min(U,[],2);
    sum_U_MAP(it)=sum(temp(:));
    X=reshape(x,[m n z]);
    
    if it>=3 && std(sum_U_MAP(it-2:it))<0.01
        break;
    end
end

sum_U=0;
for ind=1:m*n*z % all pixels
    sum_U=sum_U+U(ind,x(ind));
end

三、备注

版本:2014a

你可能感兴趣的:(matlab,图像处理)