模糊局部信息c均值聚类算法(flicm)

该博客主要介绍了模糊局部信息c均值聚类算法(flicm)的实现过程,包括初始化、距离计算、隶属度更新和聚类中心更新等步骤。flicm算法在图像分割中表现出色,通过迭代优化达到精确聚类。同时,文章还提供了flicm和基础fcm算法的matlab实现代码,用于演示如何处理不同颜色通道的图像数据。
摘要由CSDN通过智能技术生成

模糊局部信息c均值聚类算法(flicm)

flicm的目标函数
在这里插入图片描述

flicm.m

function [u_flicm,vi_flicm,out_flicm]=flicm(m,n,c,vi,img,mc)

[ui,vi]=fcm(m,n,c,vi,img,mc);%%使用fcm对隶属度U以及聚类中心进行初始化
ee=0.1;kk=0;
G=zeros(m,n,c);
d2=zeros(m,n,c);
u=ui;
while  ee>0.0001 && kk<1000     %终止条件
    v=vi; 

    %% d
        for i=1:m
            for j=1:n
                for k=1:c
                    d2(i,j,k)=(img(i,j)-v(k))^2+0.0001;
                end
            end
        end
    %% G
    for k=1:c
        for x=2:m-1
            for y=2:n-1
                tp1=0.0;
                for i=-1:1
                    for j=-1:1 
                        if ((i+x)~=x)||((j+y)~=y)
%                            tp1=tp1+(1/(sqrt(i^2+j^2)+1))*(1-u(i+x,j+y,k))^mc*d2(i+x,j+y,k);
                           tp1=tp1+(1-u(i+x,j+y,k))^mc*d2(i+x,j+y,k)/(1+sqrt(i^2+j^2));
%                            tp1=tp1+(1-u(i+x,j+y,k))^mc*(img(i+x,j+y)-v(k))^2/(1+sqrt(i^2+j^2));
                        end
                    end
                end
                G(x,y,k)=tp1;
            end
        end
    end
    %% new u
    for i=1:m
        for j=1:n
            tp2=0.0;
            for k=1:c
                tp2=tp2+(d2(i,j,k)+G(i,j,k)+0.0001)^(-1/(mc-1));
            end
            for k=1:c
                u(i,j,k)=(d2(i,j,k)+G(i,j,k)+0.0001)^(-1/(mc-1))/(tp2);
            end
        end
    end
    %% v
    for k=1:c
        tp3=0.0;
        tp4=0.0;
        for i=1:m
            for j=1:n
                tp3=tp3+u(i,j,k)^mc*img(i,j);
                tp4=tp4+u(i,j,k)^mc;
            end
        end
        vi(k)=tp3/tp4;
    end
    %% 终止条件
       temp=0.0;
       for k=1:c
             temp=temp+(v(k)-vi(k))^2;
       end
       if   temp <0.0001
            ee=0.0001;
       end
       kk=kk+1;
end
data1=zeros(m,n);
    for i=1:m
        for j=1:n
           if c==2
                if u(i,j,1)>u(i,j,2)
                    data1(i,j)=0;
                else
                    data1(i,j)=255;
                end
            end
            if c==3
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3)
                    data1(i,j)=0;
                end
                if u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3)
                    data1(i,j)=125;
                end
                if u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2)
                    data1(i,j)=255;
                end
            end
            if c==4
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3) && u(i,j,1)>u(i,j,4)
                    data1(i,j)=50;
                end
                if u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3) && u(i,j,2)>u(i,j,4)
                    data1(i,j)=150;
                end
                if u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2) && u(i,j,3)>u(i,j,4)
                    data1(i,j)=255;
                end
                if u(i,j,4)>u(i,j,1) && u(i,j,4)>u(i,j,2) && u(i,j,4)>u(i,j,3)
                    data1(i,j)=0;
                end
            end
            if c==5
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3) && u(i,j,1)>u(i,j,4) && u(i,j,1)>u(i,j,5)
                    data1(i,j)=0;
                end
                if u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3) && u(i,j,2)>u(i,j,4) && u(i,j,2)>u(i,j,5)
                    data1(i,j)=46;
                end
                if u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2) && u(i,j,3)>u(i,j,4) && u(i,j,3)>u(i,j,5)
                    data1(i,j)=105;
                end
                if u(i,j,4)>u(i,j,1) && u(i,j,4)>u(i,j,2) && u(i,j,4)>u(i,j,3) && u(i,j,4)>u(i,j,5)
                    data1(i,j)=176;
                end
                if u(i,j,5)>u(i,j,1) && u(i,j,5)>u(i,j,2) && u(i,j,5)>u(i,j,3) && u(i,j,5)>u(i,j,4)
                    data1(i,j)=255;
                end
            end
        end
    end
 
%   figure(3);imshow(uint8(data1));title('flicm分割图');
u_flicm=u;
vi_flicm=vi;
out_flicm=data1;
end
  

fcm.m

function [u_fcm,vi_fcm,out_fcm]=fcm(m,n,c,vi,img,m1)

u=zeros(m,n,c);
d=zeros(m,n,c);
ee=0.1;kk=0;
t1=clock;
while  ee>0.0001 && kk<1000     %终止条件
    v=vi;
    for i=1:m
        for j=1:n
            for k=1:c
                d(i,j,k)=(img(i,j)-v(k))^2+0.0001;% 算距离:样本data(i,j)到第k类的距离
            end
            % 算隶属度
            tp=0.0;
            for k1=1:c
                tp=tp+d(i,j,k1)^(-1/(m1-1));
            end
            for k=1:c
                u(i,j,k)=d(i,j,k)^(-1/(m1-1))/tp;
            end
        end
    end

     % 计算聚类中心
    for k=1:c
        tp1=0.0;
        tp2=0.0;
        for j=1:n
            for i=1:m
                tp1=tp1+u(i,j,k)^m1*img(i,j);
                tp2=tp2+u(i,j,k)^m1;
            end
        end
        vi(k)=tp1/(tp2+0.0001); %聚类中心
    end
    %终止条件
     temp=0.0;
       for k=1:c
             temp=temp+(v(k)-vi(k))^2;
       end
       if   temp < 0.0001
            ee=0.0001;
       end
       kk=kk+1;
end
    disp(['运行时间:',num2str(etime(clock,t1))]);
 data1=zeros(m,n);
    for i=1:m
        for j=1:n
            if c==2
                if u(i,j,1)>u(i,j,2)
                    data1(i,j)=0;
                else
                    data1(i,j)=255;
                end
            end
            if c==3
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3)
                    data1(i,j)=0;
                elseif u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3)
                    data1(i,j)=125;
                elseif u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2)
                    data1(i,j)=255;
                end
            end
            if c==4
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3) && u(i,j,1)>u(i,j,4)
                    data1(i,j)=50;
                end
                if u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3) && u(i,j,2)>u(i,j,4)
                    data1(i,j)=150;
                end
                if u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2) && u(i,j,3)>u(i,j,4)
                    data1(i,j)=255;
                end
                if u(i,j,4)>u(i,j,1) && u(i,j,4)>u(i,j,2) && u(i,j,4)>u(i,j,3)
                    data1(i,j)=0;
                end
            end
            if c==5
                if u(i,j,1)>u(i,j,2) && u(i,j,1)>u(i,j,3) && u(i,j,1)>u(i,j,4) && u(i,j,1)>u(i,j,5)
                    data1(i,j)=0;
                end
                if u(i,j,2)>u(i,j,1) && u(i,j,2)>u(i,j,3) && u(i,j,2)>u(i,j,4) && u(i,j,2)>u(i,j,5)
                    data1(i,j)=46;
                end
                if u(i,j,3)>u(i,j,1) && u(i,j,3)>u(i,j,2) && u(i,j,3)>u(i,j,4) && u(i,j,3)>u(i,j,5)
                    data1(i,j)=105;
                end
                if u(i,j,4)>u(i,j,1) && u(i,j,4)>u(i,j,2) && u(i,j,4)>u(i,j,3) && u(i,j,4)>u(i,j,5)
                    data1(i,j)=176;
                end
                if u(i,j,5)>u(i,j,1) && u(i,j,5)>u(i,j,2) && u(i,j,5)>u(i,j,3) && u(i,j,5)>u(i,j,4)
                    data1(i,j)=255;
                end
            end
        end
    end
  

%   figure;imshow(uint8(data1));title('pfcm分割图'); 
 

u_fcm=u;
vi_fcm=vi;
out_fcm=data1;
end
  

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值