FIRST & BEST SOLUTION

  1. clear all;
  2. clc;
  3. I_rgb=imread('dog.jpg');
  4. figure();imshow(I_rgb);title('原始图像');
  5. %去噪
  6. filter=ones(5,5);
  7. filter=filter/sum(filter(:));
  8. denoised_r=conv2(I_rgb(:,:,1),filter,'same');
  9. denoised_g=conv2(I_rgb(:,:,2),filter,'same');
  10. denoised_b=conv2(I_rgb(:,:,3),filter,'same');
  11. denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
  12. D_rgb=uint8(denoised_rgb);
  13. figure();imshow(D_rgb);title('去噪后图像');%去噪后的结果
  14. %将彩色图像从RGB转化到lab彩色空间
  15. C =makecform('srgb2lab'); %设置转换格式
  16. I_lab= applycform(D_rgb, C);
  17. %进行K-mean聚类将图像分割成2个区域
  18. ab =double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量
  19. nrows= size(ab,1);
  20. ncols= size(ab,2);
  21. ab =reshape(ab,nrows*ncols,2);
  22. nColors= 4; %分割的区域个数为4
  23. [cluster_idx,cluster_center] =kmeans(ab,nColors,'distance','sqEuclidean','Replicates',2); %重复聚类2
  24. pixel_labels= reshape(cluster_idx,nrows,ncols);
  25. %显示分割后的各个区域
  26. segmented_images= cell(1,4);
  27. rgb_label= repmat(pixel_labels,[1 1 3]);
  28. for k= 1:nColors
  29. color = I_rgb;
  30. color(rgb_label ~= k) = 0;
  31. segmented_images{k} = color;
  32. end
  33. figure(),imshow(segmented_images{1}),title('分割结果——区域1');
  34. figure(),imshow(segmented_images{2}),title('分割结果——区域2');
  35. figure(),imshow(segmented_images{3}),title('分割结果——区域3');
  36. figure(),imshow(segmented_images{4}),title('分割结果——区域4');%使分割后的图像在一个图中显示
  37. m=uint8(rgb_label);
  38. for i=1:69
  39. for j=1:97
  40. if m(i,j,1)==1
  41. m(i,j,1)=255;
  42. m(i,j,2)=0;
  43. m(i,j,3)=0;
  44. end
  45. if m(i,j,1)==2
  46. m(i,j,1)=256;
  47. m(i,j,2)=256;
  48. m(i,j,3)=0;
  49. end
  50. if m(i,j,1)==3
  51. m(i,j,1)=0;
  52. m(i,j,2)=0;
  53. m(i,j,3)=255;
  54. end
  55. if m(i,j,1)==4
  56. m(i,j,1)=0;
  57. m(i,j,2)=128;
  58. m(i,j,3)=0;
  59. end
  60. end
  61. end
  62. figure(),imshow(m)
  1. 调用k-means算法的那句更换成下面代码,自己实现k-means
  1.  
  1. cluster_idx=zeros(6693,1);
  2. ct11=90;
  3. ct12=90;
  4. ct21=110;
  5. ct22=110;
  6. ct31=130;
  7. ct32=130;
  8. ct41=150;
  9. ct42=150;
  10. %初始分类
  11. sum1=[0,0];
  12. sum2=[0,0];
  13. sum3=[0,0];
  14. 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];               
  15. m=min(Z);
  16. if m==d1
  17. cluster_idx(i)=1;
                 f1=1+f1;
  18. sum1=sum1+ab(i,:);
  19. end
  20. if m==d2
  21. cluster_idx(i)=2;
                 f2=f2+1;
  22. sum2=sum2+ab(i,:);
  23. end
  24. if m==d3
  25. cluster_idx(i)=3;
                 f3=f3+1;
  26. sum3=sum3+ab(i,:);
  27. end
  28. if m==d4
  29. cluster_idx(i)=4;
                 f4=f4+1;
  30. sum4=sum4+ab(i,:);
  31. end
  32. end
  33. ct11=sum1(1,1)/f1;
  34. ct12=sum1(1,2)/f1;
  35. ct21=sum2(1,1)/f2;
  36. ct22=sum2(1,2)/f2;
  37. ct31=sum3(1,1)/f3;
  38. ct32=sum3(1,2)/f3;
  39. ct41=sum4(1,1)/f4;
  40. ct42=sum4(1,2)/f4;
  41. end
  42. ct1=[ct11,ct12];
  43. ct2=[ct21,ct22];
  44. ct3=[ct31,ct32];
  45. ct4=[ct41,ct42];
  1.  

ANOTHER SOLUTION

  1. RGB= imread ('dog.jpg'); %读入图像
  2. [m n]=size(RGB); %m是数据个数,n是数据维度
  3. figure(),imshow(RGB);title(' 图一 彩色原图像')
  4. hold off;
  5. RGB=double(RGB);
  6. filter=ones(5,5);
  7. filter=filter/sum(filter(:));
  8. denoised_r=conv2(RGB(:,:,1),filter,'same');
  9. denoised_g=conv2(RGB(:,:,2),filter,'same');
  10. denoised_b=conv2(RGB(:,:,3),filter,'same');
  11. denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
  12. RGB=uint8(denoised_rgb);
  13. figure();imshow(RGB);title('去噪后图像');%去噪后的结果
  14. RGB=double(RGB);
  15. img1= RGB(:,:,1);
  16. img2=RGB (:,:,2);
  17. img3= RGB (:,:,3);
  18. t=0;
  19. c11(1)=4; c12(1)=4; c13(1)=4;
  20. c21(1)=70; c22(1)=67; c23(1)=71;
  21. c31(1)=100; c32(1)=100; c33(1)=100;
  22. c41(1)=200; c42(1)=200; c43(1)=200;%选四个初始聚类中心
  23. cluster_idx=zeros(69,97);
  24. class1_num=0;
  25. class2_num=0;
  26. class3_num=0;
  27. class4_num=0;
  28. sum_class11=0;
  29. sum_class21=0;
  30. sum_class31=0;
  31. sum_class41=0;
  32. sum_class12=0;
  33. sum_class22=0;
  34. sum_class32=0;
  35. sum_class42=0;
  36. sum_class13=0;
  37. sum_class23=0;
  38. sum_class33=0;
  39. sum_class43=0;
  40. for k=1:20
  41. if t==0
  42. for i=1:69
  43. for j=1:97
  44. r=sqrt((img1(i,j)-c11(k))^2+(img2(i,j)-c12(k))^2+(img3(i,j)-c13(k))^2);
  45. g=sqrt((img1(i,j)-c21(k))^2+(img2(i,j)-c22(k))^2+(img3(i,j)-c23(k))^2);
  46. b=sqrt((img1(i,j)-c31(k))^2+(img2(i,j)-c32(k))^2+(img3(i,j)-c33(k))^2);
  47. q=sqrt((img1(i,j)-c41(k))^2+(img2(i,j)-c42(k))^2+(img3(i,j)-c43(k))^2); %计算各像素灰度与聚类中心的距离
  48. Z=[r,g,b,q];
  49. d=min(Z);
  50. if d==r
  51. class1_num=class1_num+1;
  52. cluster_idx(i,j)=1;
  53. sum_class11=sum_class11+img1(i,j);
  54. sum_class12=sum_class12+img2(i,j);
  55. sum_class13=sum_class13+img3(i,j);
  56. end
  57. if d==g
  58. class2_num=class2_num+1;
  59. cluster_idx(i,j)=2;
  60. sum_class21=sum_class21+img1(i,j);
  61. sum_class22=sum_class22+img2(i,j);
  62. sum_class23=sum_class23+img3(i,j);
  63. end
  64. if d==b
  65. class3_num=class3_num+1;
  66. cluster_idx(i,j)=3;
  67. sum_class31=sum_class31+img1(i,j);
  68. sum_class32=sum_class32+img2(i,j);
  69. sum_class33=sum_class33+img3(i,j);
  70. end
  71. if d==q
  72. class4_num=class4_num+1;
  73. cluster_idx(i,j)=4;
  74. sum_class41=sum_class41+img1(i,j);
  75. sum_class42=sum_class42+img2(i,j);
  76. sum_class43=sum_class43+img3(i,j);
  77. end
  78. end
  79. end
  80. c11(k+1)=sum_class11/class1_num;
  81. c21(k+1)=sum_class21/class2_num;
  82. c31(k+1)=sum_class31/class3_num;
  83. c41(k+1)=sum_class41/class4_num;%将所有低灰度求和取平均,作为下一个低灰度中心
  84. c12(k+1)=sum_class12/class1_num;
  85. c22(k+1)=sum_class22/class2_num;
  86. c42(k+1)=sum_class42/class4_num;
  87. c32(k+1)=sum_class32/class3_num;%将所有低灰度求和取平均,作为下一个中间灰度中心
  88. c13(k+1)=sum_class13/class1_num;
  89. c23(k+1)=sum_class23/class2_num;
  90. c43(k+1)=sum_class43/class4_num;
  91. c33(k+1)=sum_class33/class3_num;%将所有低灰度求和取平均,作为下一个高灰度中心
  92. d11=abs(c11(k+1)-c11(k));
  93. d12=abs(c12(k+1)-c12(k));
  94. d13=abs(c13(k+1)-c13(k));
  95. d21=abs(c21(k+1)-c21(k));
  96. d22=abs(c22(k+1)-c22(k));
  97. d23=abs(c23(k+1)-c23(k));
  98. d31=abs(c31(k+1)-c31(k));
  99. d32=abs(c32(k+1)-c32(k));
  100. d33=abs(c33(k+1)-c33(k));
  101. d41=abs(c41(k+1)-c41(k));
  102. d42=abs(c42(k+1)-c42(k));
  103. d43=abs(c43(k+1)-c43(k));
  104. 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)
  105. t=1;
  106. end
  107. end
  108. end
  109. for i=1:69
  110. for j=1:97
  111. if cluster_idx(i,j)==1
  112. img1(i,j)=255;
  113. img2(i,j)=0;
  114. img3(i,j)=0;
  115. end
  116. if cluster_idx(i,j)==2
  117. img1(i,j)=256;
  118. img2(i,j)=256;
  119. img3(i,j)=0;
  120. end
  121. if cluster_idx(i,j)==3
  122. img1(i,j)=0;
  123. img2(i,j)=0;
  124. img3(i,j)=255;
  125. end
  126. if cluster_idx(i,j)==4
  127. img1(i,j)=0;
  128. img2(i,j)=128;
  129. img3(i,j)=0;
  130. end
  131. end
  132. end
  133. Img1=uint8(img1);
  134. Img2=uint8(img2);
  135. Img3=uint8(img3);
  136. R=cat(3,Img1,Img2,Img3);
  137. figure(),imshow(R);title('图二 聚类后的图像')
  1.  
  1.  
  1.  
  1.  

matlab下利用K-Means进行图像分类的更多相关文章

  1. matlab下K-means Cluster 算法实现

    一.概念介绍 K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧 ...

  2. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  3. win7下利用ftp实现华为路由器的配置文件上传和下载

    win7下利用ftp实现华为路由器的配置文件上传和下载 1.  Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...

  4. (转载)Mac系统下利用ADB命令连接android手机并进行文件操作

    Mac系统下利用ADB命令连接android手机并进行文件操作 标签: Mac adb android 2016-03-14 10:09 5470人阅读 评论(1) 收藏 举报  分类: Androi ...

  5. SMTP协议--在cmd下利用bat命令行发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 选择‘开始’-‘运行’,输入cmd,进入命令提示符窗口. Windows7默认没有开始Telnet服务,请在运 ...

  6. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  7. Windows环境下利用github快速配置git环境

    在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的win ...

  8. Mac下利用(xcode)安装git

    Mac下利用(xcode)安装git 一.AppStore 最安全途径:搜索下载Xcode,(需要AppleID). 其他:直接百度Xcode下载. 二.Xcode 打开Xcode-->Pref ...

  9. 介绍linux下利用编译bash设置root账号共用的权限审计设置

    在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...

随机推荐

  1. centos7下使用yum安装mysql数据库

    CentOS7的yum源中默认是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1.下载并安装MySQL官方的 Yum Repository wget -i -c http: ...

  2. Java常用的几种线程池

    常用的几种线程池 5.1 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 这种类型的线程池特点是: 工作线程的创 ...

  3. jQuery全局冲突案例,解决$.noConflict()

    如图:犹豫$在js中可以作为一个变量去定义,所以在引入jQuery包之前定义了$对象,那么,在引入jQuery包之后就不能使用$对象了 解决:使用$.noConflict()她可以返回一个对象,这个对 ...

  4. WebAPI项目 IHttpActionResult不识别解决办法

    转自:http://blog.csdn.net/nnnnnbody/article/details/16945253 使用ASP.NET Web API构造基于restful风格web service ...

  5. C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例

    1.复制构造函数.及new空间申请 复制构造函数,也是构造函数.只在初始化时调用,如果定义对象后赋值,比如,t1=t2,则只是运算符重载,没有调用构造函数. #include <iostream ...

  6. day20 project+查看新闻列表 + 点赞 + 图片验证码 + 评论和多级评论 + 后台管理 + webSocket + kindEditor

    Day20回顾: 1. 请求生命周期 2. 中间件 md = [ "file_path.classname" ] process_request[可有可无] process_res ...

  7. 使用libimobiledevice + ifuse提取iOS沙盒文件

    简介 libimobiledevice:一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备. Git仓库: https://github.com/libimobiled ...

  8. ffmpeg 命令小记

    指定格式转码 ffmpeg -i 1.mp4 -c:v libx264 -c:a aac -y 1.flv 等时长转为m3u8格式 ffmpeg -i 1.avi -c:v libx264 -c:a ...

  9. SQL 按照多个字段为标准的重复数据处理

    表结构:T1 id int Uncheckedname nchar(10) Checkedvalue nchar(10) Checked 数据: 1 a a1 2 a a1 3 b b1 4 b b2 ...

  10. Python基本常用算法

    什么是算法 就是一个计算的过程,解决问题的方法 用到知识点 递归 调用自身 有结束条件 下次执行相应的复杂度要减少 时间复杂度排序(按效率排序) O(1)<O(logn)<O(n)< ...