1.目标函数:
2.一般采用拉格朗日乘子法来最小化FCM的目标函数,通过引入λ,将约束条件与目标函数结合形成新的函数如下:
通过对,,求偏导可得出
2.1隶属度公式:
2.2聚类中心公式:
3.具体算法流程如下:
(1)初始化:选取算法结束阈值ε,设置算法最大迭代次数T,初始化聚类中心,设置迭代次数 r=0。
(2)利用上述公式计算隶属度
(3)利用上述公式计算聚类中心。
(4)如果或者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处理图