• matlab下利用K-Means进行图像分类


     FIRST & BEST SOLUTION

    clear all;
    clc;
    I_rgb=imread('dog.jpg');
    figure();imshow(I_rgb);title('原始图像');
    %去噪
    filter=ones(5,5);
    filter=filter/sum(filter(:));
    denoised_r=conv2(I_rgb(:,:,1),filter,'same');
    denoised_g=conv2(I_rgb(:,:,2),filter,'same');
    denoised_b=conv2(I_rgb(:,:,3),filter,'same');
    denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
    D_rgb=uint8(denoised_rgb);
    figure();imshow(D_rgb);title('去噪后图像');%去噪后的结果
    %将彩色图像从RGB转化到lab彩色空间
    C =makecform('srgb2lab'); %设置转换格式
    I_lab= applycform(D_rgb, C);
    %进行K-mean聚类将图像分割成2个区域
    ab =double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量
    nrows= size(ab,1);
    ncols= size(ab,2);
    ab =reshape(ab,nrows*ncols,2);
    nColors= 4; %分割的区域个数为4
    [cluster_idx,cluster_center] =kmeans(ab,nColors,'distance','sqEuclidean','Replicates',2); %重复聚类2次
    pixel_labels= reshape(cluster_idx,nrows,ncols);
    %显示分割后的各个区域
    segmented_images= cell(1,4);
    rgb_label= repmat(pixel_labels,[1 1 3]);
    for k= 1:nColors
    color = I_rgb;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
    end
    figure(),imshow(segmented_images{1}),title('分割结果——区域1');
    figure(),imshow(segmented_images{2}),title('分割结果——区域2');
    figure(),imshow(segmented_images{3}),title('分割结果——区域3');
    figure(),imshow(segmented_images{4}),title('分割结果——区域4');%使分割后的图像在一个图中显示
    m=uint8(rgb_label);
    for i=1:69  
         for j=1:97       
              if m(i,j,1)==1          
                 m(i,j,1)=255;        
                 m(i,j,2)=0;          
                 m(i,j,3)=0;    
              end 
              if m(i,j,1)==2   
                 m(i,j,1)=256;
                 m(i,j,2)=256;
                 m(i,j,3)=0;
             end
             if m(i,j,1)==3   
                m(i,j,1)=0;   
                m(i,j,2)=0;
                m(i,j,3)=255;  
             end
           if m(i,j,1)==4       
              m(i,j,1)=0;  
              m(i,j,2)=128;
              m(i,j,3)=0;
           end
     end
    end
    figure(),imshow(m)

    将 调用k-means算法的那句更换成下面代码,自己实现k-means
    
    
    cluster_idx=zeros(6693,1);
    ct11=90;
    ct12=90;
    ct21=110;
    ct22=110;
    ct31=130;
    ct32=130;
    ct41=150;
    ct42=150;
    %初始分类
    sum1=[0,0];
    sum2=[0,0];
    sum3=[0,0];
    sum4=[0,0];
    f1=0;
    f2=0;
    f3=0;
    f4=0;
    for k=1:20 for i=1:6693 d1=(ab(i,1)-ct11).^2+(ab(i,2)-ct12).^2; d2=(ab(i,1)-ct21).^2+(ab(i,2)-ct22).^2; d3=(ab(i,1)-ct31).^2+(ab(i,2)-ct32).^2; d4=(ab(i,1)-ct41).^2+(ab(i,2)-ct42).^2;
              Z=[d1,d2,d3,d4];                m
    =min(Z); if m==d1 cluster_idx(i)=1;
                 f1=1+f1; sum1
    =sum1+ab(i,:); end if m==d2 cluster_idx(i)=2;
                 f2=f2+1; sum2
    =sum2+ab(i,:); end if m==d3 cluster_idx(i)=3;
                 f3=f3+1; sum3
    =sum3+ab(i,:); end if m==d4 cluster_idx(i)=4;
                 f4=f4+1; sum4
    =sum4+ab(i,:); end end ct11=sum1(1,1)/f1; ct12=sum1(1,2)/f1; ct21=sum2(1,1)/f2; ct22=sum2(1,2)/f2; ct31=sum3(1,1)/f3; ct32=sum3(1,2)/f3; ct41=sum4(1,1)/f4; ct42=sum4(1,2)/f4; end ct1=[ct11,ct12]; ct2=[ct21,ct22]; ct3=[ct31,ct32]; ct4=[ct41,ct42];
    
    

     ANOTHER SOLUTION

    RGB= imread ('dog.jpg'); %读入图像
    [m n]=size(RGB);   %m是数据个数,n是数据维度
    figure(),imshow(RGB);title(' 图一 彩色原图像')
    hold off;
    RGB=double(RGB); 
    filter=ones(5,5);
    filter=filter/sum(filter(:));
    denoised_r=conv2(RGB(:,:,1),filter,'same');
    denoised_g=conv2(RGB(:,:,2),filter,'same');
    denoised_b=conv2(RGB(:,:,3),filter,'same');
    denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
    RGB=uint8(denoised_rgb);
    figure();imshow(RGB);title('去噪后图像');%去噪后的结果
    RGB=double(RGB);
    img1= RGB(:,:,1);
    img2=RGB (:,:,2);
    img3= RGB (:,:,3);
    t=0;
    c11(1)=4; c12(1)=4; c13(1)=4;
    c21(1)=70; c22(1)=67; c23(1)=71;
    c31(1)=100; c32(1)=100; c33(1)=100;
    c41(1)=200; c42(1)=200; c43(1)=200;%选四个初始聚类中心
    cluster_idx=zeros(69,97);
    class1_num=0;
    class2_num=0;
    class3_num=0;
    class4_num=0; 
    sum_class11=0;
    sum_class21=0;
    sum_class31=0;
    sum_class41=0;
    sum_class12=0;
    sum_class22=0;
    sum_class32=0;
    sum_class42=0;
    sum_class13=0;
    sum_class23=0;
    sum_class33=0;
    sum_class43=0;
    for k=1:20
        if t==0
           for i=1:69
                for j=1:97
                    r=sqrt((img1(i,j)-c11(k))^2+(img2(i,j)-c12(k))^2+(img3(i,j)-c13(k))^2);
                    g=sqrt((img1(i,j)-c21(k))^2+(img2(i,j)-c22(k))^2+(img3(i,j)-c23(k))^2);
                    b=sqrt((img1(i,j)-c31(k))^2+(img2(i,j)-c32(k))^2+(img3(i,j)-c33(k))^2);
                    q=sqrt((img1(i,j)-c41(k))^2+(img2(i,j)-c42(k))^2+(img3(i,j)-c43(k))^2); %计算各像素灰度与聚类中心的距离
                    Z=[r,g,b,q];
                    d=min(Z);
                    if d==r
                       class1_num=class1_num+1;
                       cluster_idx(i,j)=1;
                       sum_class11=sum_class11+img1(i,j);
                       sum_class12=sum_class12+img2(i,j);
                       sum_class13=sum_class13+img3(i,j);
                    end
                    if d==g
                       class2_num=class2_num+1;
                       cluster_idx(i,j)=2;
                       sum_class21=sum_class21+img1(i,j);
                       sum_class22=sum_class22+img2(i,j);
                       sum_class23=sum_class23+img3(i,j);
                    end
                    if d==b
                       class3_num=class3_num+1;
                       cluster_idx(i,j)=3;
                       sum_class31=sum_class31+img1(i,j);
                       sum_class32=sum_class32+img2(i,j);
                       sum_class33=sum_class33+img3(i,j);
                    end
                    if d==q
                       class4_num=class4_num+1;
                       cluster_idx(i,j)=4;
                       sum_class41=sum_class41+img1(i,j);
                       sum_class42=sum_class42+img2(i,j);
                       sum_class43=sum_class43+img3(i,j);
                    end
                end
           end
           c11(k+1)=sum_class11/class1_num;
           c21(k+1)=sum_class21/class2_num;
           c31(k+1)=sum_class31/class3_num;
           c41(k+1)=sum_class41/class4_num;%将所有低灰度求和取平均,作为下一个低灰度中心  
           c12(k+1)=sum_class12/class1_num;
           c22(k+1)=sum_class22/class2_num;
           c42(k+1)=sum_class42/class4_num;
           c32(k+1)=sum_class32/class3_num;%将所有低灰度求和取平均,作为下一个中间灰度中心
           c13(k+1)=sum_class13/class1_num;
           c23(k+1)=sum_class23/class2_num;
           c43(k+1)=sum_class43/class4_num;
           c33(k+1)=sum_class33/class3_num;%将所有低灰度求和取平均,作为下一个高灰度中心
           d11=abs(c11(k+1)-c11(k));
           d12=abs(c12(k+1)-c12(k));
           d13=abs(c13(k+1)-c13(k));
           d21=abs(c21(k+1)-c21(k));
           d22=abs(c22(k+1)-c22(k));
           d23=abs(c23(k+1)-c23(k));
           d31=abs(c31(k+1)-c31(k));
           d32=abs(c32(k+1)-c32(k));
           d33=abs(c33(k+1)-c33(k));
           d41=abs(c41(k+1)-c41(k)); 
           d42=abs(c42(k+1)-c42(k));
           d43=abs(c43(k+1)-c43(k));
           if(d11<=0.001&&d12<=0.001&&d13<=0.001&&d21<=0.001&&d22<=0.001&&d23<=0.001&&d31<=0.001&&d32<=0.001&&d33<=0.001&&d41<=0.001&&d42<=0.001&&d43(k)<=0.001)
              t=1;
           end
        end
    end
    for i=1:69
        for j=1:97
            if cluster_idx(i,j)==1
               img1(i,j)=255;
               img2(i,j)=0;
               img3(i,j)=0;
            end
            if cluster_idx(i,j)==2
               img1(i,j)=256;
               img2(i,j)=256;
               img3(i,j)=0;
            end
            if cluster_idx(i,j)==3
               img1(i,j)=0;
               img2(i,j)=0;
               img3(i,j)=255;
            end
            if cluster_idx(i,j)==4
               img1(i,j)=0;
               img2(i,j)=128;
               img3(i,j)=0;
            end
        end
    end
    Img1=uint8(img1);
    Img2=uint8(img2);
    Img3=uint8(img3);
    R=cat(3,Img1,Img2,Img3);
    figure(),imshow(R);title('图二 聚类后的图像')
     





     
  • 相关阅读:
    产生6位的随机码
    用户输入注册的小程序
    进度条的小程序
    文件的相关操作---读写与修改
    字符串分割(C++) 转载
    C++ Stream与编码转换
    wxWidgets界面设计工具DialogBlocks(转载)
    WIN32窗口模板
    WTL对话框应用程序响应键盘消息
    常用网站
  • 原文地址:https://www.cnblogs.com/HelloDreams/p/5346849.html
Copyright © 2020-2023  润新知