混合高斯模型用于图像分割

http://download.csdn.net/detail/dayenglish/8384547

代码下载请到上面的资源页面。

整个代码的思想是利用混合高斯模型计算出每个像素属于K个高斯模型中某一个的概率值,利用这个概率值取代原来的像素值达到分割图像的目的,实质是通过像素的聚类达到分割的目的。因为需要根据高斯模型求得某一个像素的概率值,因此第一步就是建立高斯模型。至于建多少个高斯模型需要手工指定,建立的高斯模型混合起来用于拟合像素原来的直方图分布——以类似于核密度估计的方式进行拟合。不过由于是多个高斯模型对直方图进行拟合,因此涉及到求每一个高斯模型的平均值和方差的问题,以及每个高斯模型对一个像素的概率位多少。(如果只有一个高斯模型,直接求得平均值和方差就对图像直方图进行了很好的拟合)。

function[h]=histogram(datos)
datos=datos(:);
ind=find(isnan(datos)==1);
datos(ind)=0;
ind=find(isinf(datos)==1);
datos(ind)=0;
tam=length(datos);
m=ceil(max(datos))+1;
h=zeros(1,m);
for i=1:tam,
    f=floor(datos(i));    
    if(f>0 & f<(m-1))        
        a2=datos(i)-f;
        a1=1-a2;
        h(f)  =h(f)  + a1;      
        h(f+1)=h(f+1)+ a2;                          
    end;
end;
h=h/sum(h);
上面是一个直方图的统计过程,实际上没有这么复杂,直接对图像中的数据进行统计就可以了,只是上面考虑到浮点数的统计问题,最后的归一化表明直方图是一个概率统计。计算得到直方统计图之后就需要根据手工指定的高斯模型的个数来建立高斯模型了。
function y=distribution(m,v,g,x)
x=x(:);
m=m(:);
v=v(:);
g=g(:);
for i=1:size(m,1)
   d = x-m(i);
   amp = g(i)/sqrt(2*pi*v(i));
   y(:,i) = amp*exp(-0.5 * (d.*d)/v(i));
end
高斯分布的建立很简单,由于考虑了K个高斯模型的平均,所以需要在建立的模型前面乘以一个权值。就是代码中的g。建立的高斯模型对图像的直方图的拟合过程是一个不断调整高斯模型参数的过程,也就是常说的EM过程。

prb = distribution(mu,v,p,x);%prb等于每一个像素值在三个类别上的分布概率
        scal = sum(prb,2)+eps;%每一个像素值的类别概率和
        loglik=sum(h.*log(scal));%求似然估计
        
        %Maximizarion
        for j=1:k
                pp=h.*prb(:,j)./scal;%求新的每一个像素值在每一个类别上的平均值
                p(j) = sum(pp);%求得新的类别的平均值,作为权重
                mu(j) = sum(x.*pp)/p(j);
                vr = (x-mu(j));
                v(j)=sum(vr.*vr.*pp)/p(j)+sml;
        end
        p = p + 1e-3;
        p = p/sum(p);%进行归一化

        % Exit condition
        prb = distribution(mu,v,p,x);
        scal = sum(prb,2)+eps;
        nloglik=sum(h.*log(scal)); %求新的似然函数               
        if((nloglik-loglik)<0.0001) break; end;
根据分布函数计算得到的prb是一个256*K的矩阵,其中每一行,是一个像素值在K类中相对应的概率。

上面的M步中,pp是一个256*1的向量,得到的是第j类中每一个像素值的概率,而p在归一化之后得到的则是每一个类的权重;mu则是一个加权平均之后得到的每一个类的平均值,v则是加权平均之后得到的每一个类的方差,利用得到的权重,平均值和方差重新估计高斯分布函数,并根据重新得到的高斯分布函数计算出似然函数值,看看似然函数值是否变化较小,若变化较小则直接退出。然后根据像素值计算得到概率值,利用概率值代替原来的像素值就实现了图像的分割。


展开阅读全文

没有更多推荐了,返回首页