⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fcm_color.m

📁 本程序为模糊聚类算法在图像分类中的应用。(图像的大小为30*30)。
💻 M
字号:
I=imread('D:\rsphoto\experiment.bmp');%i输入图像
I1=I(250:279,130:159);%%取一个30*30的矩阵
imshow(I),figure,imshow(I1)
NC=30*30; % number 
n1=zeros(1,NC);
n=zeros(1,NC);%%n是n1的双精度浮点的形式
for i=1:NC
    a=ceil(i/30);
    b=mod(i,30);
    if b==0
        b=30;
    end
    n1(1,i)=I1(a,b);
    n(1,i)=double(n1(1,i));
end %%该循环是把30*30矩阵转换成1*900的矩阵
n2=zeros(1,NC);
c=3;  %聚类数;
inicenter=256*rand(1,3);%%%初始随机聚类中心 
m=2;  %加权指数;
e=0.01;%叠代停止阈值;
diatance=zeros(c,NC);  %样本点到聚类中心的距离;
s=zeros(c,NC);
s1=zeros(1,NC);
iter=0;
s2=0;
s3=1;
sum0=0;
u=zeros(c,NC);
fenmu=0;
fenzi=0;
daoshu=0;
v=inicenter;
s=0;
aaa=0;
%%%%%%%%%%%%%%%  以上是初始化%%%%%%%%%  
for l=1:100
    v1=v;
    for k=1:NC
        for i=1:c 
            distance(i,k)=abs(n(k)-v(i));
        end
    end
    for j=1:c
        for k=1:NC
           if distance(j,k)==0
               aaa=1;
               for i=1:c
                   if i==j
                       u(i,k)=0;
                   else
                       u(i,k)=1;
                   end
               end
           end
       end
   end
    if aaa==0
        for k=1:NC
            for i=1:c
                for j=1:c
                    daoshu=daoshu+(distance(i,k)/distance(j,k))^(2/(m-1));
                end
                u(i,k)=1/daoshu;
                daoshu=0;
            end
        end
    end
    for i=1:c
        for k=1:NC
            fenmu=fenmu+(u(i,k))^m;
            fenzi=fenzi+n(k)*(u(i,k))^m;
        end
        v(i)=fenzi/fenmu;
        fenzi=0;
        fenmu=0;
    end
    for i=1:c
        s=s+(v(i)-v1(i))^2;
    end
    
    if sqrt(s)<0.5
        break;
    end
    s=0;
end
center=v
%%%%%%%%%%%%%%%%%  以上是FCM算法的核心部分 求出聚心%%%%%
j=1;
fenlei=zeros(c,NC);%%分类结果
oushijuli=zeros(NC,c);%%点到聚心得欧式距离
for m=1:NC
    for i=1:c
        oushijuli(m,i)=abs(n(m)-v(i));
    end
end
for i=1:NC
    [x,y]=min(oushijuli(i,:));%%取其每一行的最小值
    fenlei(y,j)=i;
    j=j+1;
end 
%%%%%%%%%   以上是分类过程        %%%%%%%%%%%%
for i=1:NC
    [x,y]=min(oushijuli(i,:));
    fenlei(y,i)=i;
    if fenlei(1,i)~=0
        n2(1,i)=v(1);
    end
    if fenlei(2,i)~=0
        n2(2,i)=v(2);
    end
    if fenlei(3,i)~=0
         n2(3,i)=v(3);
     end
end
%%%%%%%% 以上是把每一类用一个灰度值表示%%%%%%%%
for i=1:NC
    a=ceil(i/30);
    b=mod(i,30);
    if b==0
        b=30;
    end
     if n2(1,i)~=0
        I2(a,b,1)=1;
        I2(a,b,2)=0;
        I2(a,b,3)=0;
     end
     if n2(2,i)~=0
        I2(a,b,1)=1;
        I2(a,b,2)=1;
        I2(a,b,3)=0;
     end
     if n2(3,i)~=0
        I2(a,b,1)=0;
        I2(a,b,2)=0;
        I2(a,b,3)=1;
     end
end
%%%%%%%%把1*900的矩阵变成30*30的矩阵%%%%%%%%%%
figure,imshow(I2)
%%%%%%%%%显示图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%作者于2007年5月17日完成%%%%%%%%%%%%%%%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -