模糊c-均值聚类算法(FCM)

1.目标函数:

J_{FCM}=\sum_{i=1}^{c}\sum_{j=1}^{n}\left ( u_{ij} \right )^{m}d^{2}\left ( x^{_{j}} ,v^{_{i}}\right )

2.一般采用拉格朗日乘子法来最小化FCM的目标函数,通过引入λ,将约束条件与目标函数结合形成新的函数如下:

L\left ( u_{ij} ,v_{i},\lambda _{j}\right )=\sum_{i=1}^{c}\sum_{j=1}^{n}\left ( u_{ij} \right )^{m}d^{2}\left ( x^{_{j}} ,v^{_{i}}\right )+\sum_{j=1}^{n}\lambda _{j}\left ( 1-\sum_{i=1}^{c}u_{ij} \right )

通过对u^{_{ij}},v_{i},\lambda _{j}求偏导可得出

2.1隶属度公式:

u_{ij}=\sum_{r=1}^{c}\left [ \frac{d\left ( x_{j},v_{i} \right ) }{d\left ( x_{j},v_{r} \right ) } \right ]^{-2/\left ( m-1 \right )}

2.2聚类中心公式:

v_{i}=\frac{\sum_{j=1}^{n}u_{ij}^{m}*x_{j}}{\sum_{j=1}^{n}u_{ij}^{m}}

3.具体算法流程如下:

(1)初始化:选取算法结束阈值ε,设置算法最大迭代次数T,初始化聚类中心,设置迭代次数      r=0。

(2)利用上述公式计算隶属度

(3)利用上述公式计算聚类中心。

(4)如果\left \| V_{i} ^{\left ( k+1 \right )}-\| V_{i} ^{\left ( k\right )}\right \|< \xi或者r>T,则算法结束;否则r=r+1,返回步骤(2)。

4.代码

clc
clear
close all
image=imread('E:\matlab\bin\picture\2.png');
figure(1)
imshow(image);
image=double(image);
[m,n]=size(image);
c=2;%聚类中心
V1=zeros(1,c);
U=zeros(m,n,c);
r=0;%初始迭代次数
m1=2;%加权指数
d=zeros(m,n,c);
err=0.1;
V1(1)=90;
V1(2)=190;
while err>0.0001 && r<10
    V=V1;
    for i=1:m
        for j=1:n
            for k=1:c
                d(i,j,k)=(image(i,j)-V(k))^2+0.0001;%欧氏距离
            end
            tp1=0.0;
            for k=1:c
                tp1=tp1+d(i,j,k)^(-1/(m1-1));
            end
            for k=1:c
                U(i,j,k)=d(i,j,k)^(-1/(m1-1))/(tp1+0.0001);%计算隶属度
            end
         end
    end
    for k=1:c
        tp2=0.0;
        tp3=0.0;
         for i=1:m
            for j=1:n
                 tp2=tp2+U(i,j,k)^m1*image(i,j);
                 tp3=tp3+U(i,j,k)^m1;
            end
         end
         V1(k)=tp2/(tp3+0.0001);%计算聚类中心
    end
    %%终止条件
    a=0.0;
    for k=1:c
        a=a+(V(k)-V1(k))^2;
    end
    if   a < 0.0001
         err=0.0001;
    end
    r=r+1;
end

image2=zeros(m,n);
for i=1:m
    for j=1:n
        if c==2
            if U(i,j,1)>U(i,j,2)
                image2(i,j)=0;%255白色
            else 
                image2(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)
                image2(i,j)=0;
            elseif U(i,j,2)>U(i,j,1)&&U(i,j,2)>U(i,j,3)
                image2(i,j)=125;
            elseif U(i,j,3)>U(i,j,1)&&U(i,j,3)>U(i,j,2)
                image2(i,j)=255;
            end
        end         
    end
end
figure(2)
imshow(uint8(image2));


4.结果展示:

 图1  原图 

 图2  fcm处理图

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值