模糊局部信息c均值聚类算法(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