一个朋友让帮忙做图像分类,用FCM聚类算法,网上查了一下,FCM基本都是对一幅图像进行像素的分类,跟他说的任务不太一样,所要做的是将一个文件夹里的一千多幅图像进行分类。图像大概是这个样子的(是25*25的小图像):

自己写太麻烦,我花了些时间在GitHub上找了FCM的算法,有一个比较合适的算法,链接如下:https://github.com/HosseinAbedi/FCM ,这个代码本来是用FCM处理鸢尾花分类的,输入是鸢尾花的四个特征,输出是三个预测类别。因为图像就是矩阵,矩阵也是多维向量,每一个像素值可以看做一个特征,那么完全可以把图像的所有像素当作特征值输入到程序中,而且他给的数据集里的图像是25*25的小图像而且是灰度图像。因此,我把图像文件夹里的图像转成了大矩阵,每一行代表一张图像。本身的鸢尾花数据是存为一个iris.mat的,是一个150*5的double矩阵,运行程序的时候先加载这个mat。我也依样画葫芦,将图像存为了一个1330*25的double矩阵,代码如下:

  1. clear all;
  2. clc;
  3. pt = '.\training2\';
  4. ext = '*.bmp';
  5. dis = dir([pt ext]);
  6. nms = {dis.name};
  7. Images=[];
  8. for k = 1:length(nms)
  9. nm = [pt nms{k}];
  10. A = imread(nm);
  11. B = reshape(double(A.'),1,25);
  12. Images=[Images;B];
  13. % 对图像image进行相关操作
  14. end
  15. save Data.mat Images;

然后就可以直接调用主FCM程序了。除了输入输出,其他基本没变。直接把原来的输出结果prediction向量改为输出三个分类,原来的向量是第一个图像是第几类,第二个图像是第几类这样的。改了之后是第一类有哪些图像,第二类有哪些图像等等。后来他说要分成20类,基本是一样的,写的比较简单,直接用向量来保存每一个类。代码如下:

  1. number=1300; %图像的数量
  2. %把分类存到下面的向量中,向量中的每个值代表第几幅图像,3代表‘m3.bmp’.
  3. a=[];b=[];c=[];d=[];e=[];f=[];g=[];h=[];i=[];j=[];
  4. k=[];l=[];m=[];n=[];o=[];p=[];q=[];r=[];s=[];t=[];
  5.  
  6. for x = 1:number
  7. switch(prediction(x))
  8. case 1
  9. a=[a,x];
  10. case 2
  11. b=[b,x];
  12. case 3
  13. c=[c,x];
  14. case 4
  15. d=[d,x];
  16. case 5
  17. e=[e,x];
  18. case 6
  19. f=[f,x];
  20. case 7
  21. g=[g,x];
  22. case 8
  23. h=[h,x];
  24. case 9
  25. i=[i,x];
  26. case 10
  27. j=[j,x];
  28. case 11
  29. k=[k,x];
  30. case 12
  31. l=[l,x];
  32. case 13
  33. m=[m,x];
  34. case 14
  35. n=[n,x];
  36. case 15
  37. o=[o,x];
  38. case 16
  39. p=[p,x];
  40. case 17
  41. q=[q,x];
  42. case 18
  43. r=[r,x];
  44. case 19
  45. s=[s,x];
  46. case 20
  47. t=[t,x];
  48. end
  49. end
  50.  
  51. save .\result\A.mat a;save .\result\B.mat b;save .\result\C.mat c;save .\result\D.mat d;
  52. save .\result\E.mat e;save .\result\F.mat f;save .\result\G.mat g;save .\result\H.mat h;
  53. save .\result\I.mat i;save .\result\J.mat j;save .\result\K.mat k;save .\result\L.mat l;
  54. save .\result\M.mat m;save .\result\N.mat n;save .\result\O.mat o;save .\result\P.mat p;
  55. save .\result\Q.mat q;save .\result\R.mat r;save .\result\S.mat s;save .\result\T.mat t;

  分类最后的结果是这个样子的:

哦,中途还出了一个问题,错误提示是:fcm输入的参数太多,想了很久才想通,原来matlab有个自带的fcm函数,它的参数只有两个,难怪会提示输入的参数太多。把主函数fcm的文件名改为myfcm就可以了。

后来感觉还是有点不对,她说存成mat矩阵不好调用,还是直接把原来的数据集分类之后用文件保存起来,一个文件代表一个分类结果比较好,然后我直接把原图像文件夹的文件分成了20个子文件夹结果。其实还挺麻烦的,要先把源文件夹的图片读取出来,然后看看属于哪一类,再分到新的结果文件夹中。代码如下:

  1. number=1300; %图像的数量
  2.  
  3. for x = 1:number
  4. switch(prediction(x))
  5. case 1
  6. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  7. A=imread(filename); %读取第一类的图片
  8. mkdir('result2\image1');
  9. newfile=strcat('.\result2\image1\m',num2str(x),'.bmp');
  10. imwrite(A,newfile); %将第一类图片保存到result2中
  11. case 2
  12. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  13. A=imread(filename);
  14. mkdir('result2\image2');
  15. newfile=strcat('.\result2\image2\m',num2str(x),'.bmp');
  16. imwrite(A,newfile);
  17. case 3
  18. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  19. A=imread(filename);
  20. mkdir('result2\image3');
  21. newfile=strcat('.\result2\image3\m',num2str(x),'.bmp');
  22. imwrite(A,newfile);
  23. case 4
  24. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  25. A=imread(filename);
  26. mkdir('result2\image4');
  27. newfile=strcat('.\result2\image4\m',num2str(x),'.bmp');
  28. imwrite(A,newfile);
  29. case 5
  30. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  31. A=imread(filename);
  32. mkdir('result2\image5');
  33. newfile=strcat('.\result2\image5\m',num2str(x),'.bmp');
  34. imwrite(A,newfile);
  35. case 6
  36. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  37. A=imread(filename);
  38. mkdir('result2\image6');
  39. newfile=strcat('.\result2\image6\m',num2str(x),'.bmp');
  40. imwrite(A,newfile);
  41. case 7
  42. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  43. A=imread(filename);
  44. mkdir('result2\image7');
  45. newfile=strcat('.\result2\image7\m',num2str(x),'.bmp');
  46. imwrite(A,newfile);
  47. case 8
  48. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  49. A=imread(filename);
  50. mkdir('result2\image8');
  51. newfile=strcat('.\result2\image8\m',num2str(x),'.bmp');
  52. imwrite(A,newfile);
  53. case 9
  54. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  55. A=imread(filename);
  56. mkdir('result2\image9');
  57. newfile=strcat('.\result2\image9\m',num2str(x),'.bmp');
  58. imwrite(A,newfile);
  59. case 10
  60. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  61. A=imread(filename);
  62. mkdir('result2\image10');
  63. newfile=strcat('.\result2\image10\m',num2str(x),'.bmp');
  64. imwrite(A,newfile);
  65. case 11
  66. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  67. A=imread(filename);
  68. mkdir('result2\image11');
  69. newfile=strcat('.\result2\image11\m',num2str(x),'.bmp');
  70. imwrite(A,newfile);
  71. case 12
  72. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  73. A=imread(filename);
  74. mkdir('result2\image12');
  75. newfile=strcat('.\result2\image12\m',num2str(x),'.bmp');
  76. imwrite(A,newfile);
  77. case 13
  78. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  79. A=imread(filename);
  80. mkdir('result2\image13');
  81. newfile=strcat('.\result2\image13\m',num2str(x),'.bmp');
  82. imwrite(A,newfile);
  83. case 14
  84. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  85. A=imread(filename);
  86. mkdir('result2\image14');
  87. newfile=strcat('.\result2\image14\m',num2str(x),'.bmp');
  88. imwrite(A,newfile);
  89. case 15
  90. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  91. A=imread(filename);
  92. mkdir('result2\image15');
  93. newfile=strcat('.\result2\image15\m',num2str(x),'.bmp');
  94. imwrite(A,newfile);
  95. case 16
  96. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  97. A=imread(filename);
  98. mkdir('result2\image16');
  99. newfile=strcat('.\result2\image16\m',num2str(x),'.bmp');
  100. imwrite(A,newfile);
  101. case 17
  102. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  103. A=imread(filename);
  104. mkdir('result2\image17');
  105. newfile=strcat('.\result2\image17\m',num2str(x),'.bmp');
  106. imwrite(A,newfile);
  107. case 18
  108. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  109. A=imread(filename);
  110. mkdir('result2\image18');
  111. newfile=strcat('.\result2\image18\m',num2str(x),'.bmp');
  112. imwrite(A,newfile);
  113. case 19
  114. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  115. A=imread(filename);
  116. mkdir('result2\image19');
  117. newfile=strcat('.\result2\image19\m',num2str(x),'.bmp');
  118. imwrite(A,newfile);
  119. case 20
  120. filename=strcat('.\training2\','m',num2str(x),'.bmp');
  121. A=imread(filename);
  122. mkdir('result2\image20');
  123. newfile=strcat('.\result2\image20\m',num2str(x),'.bmp');
  124. imwrite(A,newfile);
  125. end
  126. end

  最后的结果基本达到要求了,完整的叙述一下这个任务就是:把一个文件夹里的图像数据(25*25)用FCM聚类算法进行分类,然后分类的结果保存到新的子文件夹中,每一个文件夹存储一类结果。最后的结果如下:

matlab任务:FCM分类的更多相关文章

  1. MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...

  2. Matlab实现图像分割 分类: 图像处理 2014-06-14 21:31 662人阅读 评论(1) 收藏

    下面使用极小值点阈值选取方法,编写MATLAB程序实现图像分割的功能. 极小值点阈值选取法即从原图像的直方图的包络线中选取出极小值点, 并以极小值点为阈值将图像转为二值图像 clear all; cl ...

  3. 用matlab训练数字分类的深度神经网络Training a Deep Neural Network for Digit Classification

    This example shows how to use Neural Network Toolbox™ to train a deep neural network to classify ima ...

  4. knn原理与实践

    knn法是一种基本分类与回归方法 应用:knn算法不仅可以用于分类,还可以用于回归.. 1.文本分类:文本分类主要应用于信息检索,机器翻译,自动文摘,信息过滤,邮件分类等任务. 2.可以使用knn算法 ...

  5. BP_Adaboost 模型及其分类应用

    一.BP_ Adaboost模型 Adaboost 算法的思想是合并多个“弱”分类器的输出以产生有效分类.其主要步骤为 : (1)首先给出弱学习算法和样本空间(x, y) ,从样本空间中找出 m 组训 ...

  6. 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现

    前言:这几天一直都在研究模糊聚类.感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类. 一:模糊数学 我们大家都知道计算机其实只认识两个数字0,1.我们平时写程序其实也是这样 ...

  7. 使用LIBSVM工具实现样本分类预测——MatLab

    准备工作: https://www.csie.ntu.edu.tw/~cjlin/libsvm/,下载LIBSVM:(LIBSVM工具相较于MATLAB自带的工具:1).支持多分类及回归(‘-s 0’ ...

  8. 简单的线性分类——MATLAB,python3实现

    看李政轩老师讲的Kernel,讲的非常好!前面有几道作业题,用MATLAB简单做了下,不知道对不对,错误之处还请指出. 题目是这样的. 一.MATLAB版本: clear; clc % 生成train ...

  9. 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)

    之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...

随机推荐

  1. OSError: [Errno 22] Invalid argument: 'D:\x07ckup\test.txt'

    使用with open("D:\backup\test.txt","rt") as f:报上面的错误,将上面的语句改成 with open(r"D:\ ...

  2. 前端优化规范 webApp

  3. 使用 DOM对象,控制HTML元素 来制作的一个简单的表格

    制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 red,移开鼠标时则恢复为原背景色 white 2. 点击添加按钮,能动态在最后添加一行 3. 点击删除按钮,则删 ...

  4. python3 之初学者常犯的5个错误

    1. Creating a copy of dictionary or lists. Whenever you need to make a copy of a dictionary or list, ...

  5. laravel 接收json串

    在做项目的时候发现 用平时的$request->all() 无法获取到请求值 然后这样解决了 但是还是不知道原因 学习源头: http://www.cnblogs.com/anjuncc/p/5 ...

  6. HDU4135(容斥原理)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. Swing编程练习。可能这篇会有错误哦

    总结:21岁的思思是华为的初级女java工程师,我等女流怎么办呢? Swing.图形用户界面的编程,panel起了很大作用 package com.da; import java.awt.Color; ...

  8. cpu上下文切换(下)

    --怎么查看系统的上下文切换情况 过多的上下文切换,会把cpu时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶. 查看,使用vmstat ...

  9. idea debug的时候 启动起来超级慢

  10. Excel开发学习笔记:VB.net的一些杂项

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VST ...