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

自己写太麻烦,我花了些时间在GitHub上找了FCM的算法,有一个比较合适的算法,链接如下:https://github.com/HosseinAbedi/FCM ,这个代码本来是用FCM处理鸢尾花分类的,输入是鸢尾花的四个特征,输出是三个预测类别。因为图像就是矩阵,矩阵也是多维向量,每一个像素值可以看做一个特征,那么完全可以把图像的所有像素当作特征值输入到程序中,而且他给的数据集里的图像是25*25的小图像而且是灰度图像。因此,我把图像文件夹里的图像转成了大矩阵,每一行代表一张图像。本身的鸢尾花数据是存为一个iris.mat的,是一个150*5的double矩阵,运行程序的时候先加载这个mat。我也依样画葫芦,将图像存为了一个1330*25的double矩阵,代码如下:
clear all;
clc;
pt = '.\training2\';
ext = '*.bmp';
dis = dir([pt ext]);
nms = {dis.name};
Images=[];
for k = 1:length(nms)
nm = [pt nms{k}];
A = imread(nm);
B = reshape(double(A.'),1,25);
Images=[Images;B];
% 对图像image进行相关操作
end
save Data.mat Images;
然后就可以直接调用主FCM程序了。除了输入输出,其他基本没变。直接把原来的输出结果prediction向量改为输出三个分类,原来的向量是第一个图像是第几类,第二个图像是第几类这样的。改了之后是第一类有哪些图像,第二类有哪些图像等等。后来他说要分成20类,基本是一样的,写的比较简单,直接用向量来保存每一个类。代码如下:
number=1300; %图像的数量
%把分类存到下面的向量中,向量中的每个值代表第几幅图像,3代表‘m3.bmp’.
a=[];b=[];c=[];d=[];e=[];f=[];g=[];h=[];i=[];j=[];
k=[];l=[];m=[];n=[];o=[];p=[];q=[];r=[];s=[];t=[]; for x = 1:number
switch(prediction(x))
case 1
a=[a,x];
case 2
b=[b,x];
case 3
c=[c,x];
case 4
d=[d,x];
case 5
e=[e,x];
case 6
f=[f,x];
case 7
g=[g,x];
case 8
h=[h,x];
case 9
i=[i,x];
case 10
j=[j,x];
case 11
k=[k,x];
case 12
l=[l,x];
case 13
m=[m,x];
case 14
n=[n,x];
case 15
o=[o,x];
case 16
p=[p,x];
case 17
q=[q,x];
case 18
r=[r,x];
case 19
s=[s,x];
case 20
t=[t,x];
end
end save .\result\A.mat a;save .\result\B.mat b;save .\result\C.mat c;save .\result\D.mat d;
save .\result\E.mat e;save .\result\F.mat f;save .\result\G.mat g;save .\result\H.mat h;
save .\result\I.mat i;save .\result\J.mat j;save .\result\K.mat k;save .\result\L.mat l;
save .\result\M.mat m;save .\result\N.mat n;save .\result\O.mat o;save .\result\P.mat p;
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个子文件夹结果。其实还挺麻烦的,要先把源文件夹的图片读取出来,然后看看属于哪一类,再分到新的结果文件夹中。代码如下:
number=1300; %图像的数量 for x = 1:number
switch(prediction(x))
case 1
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename); %读取第一类的图片
mkdir('result2\image1');
newfile=strcat('.\result2\image1\m',num2str(x),'.bmp');
imwrite(A,newfile); %将第一类图片保存到result2中
case 2
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image2');
newfile=strcat('.\result2\image2\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 3
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image3');
newfile=strcat('.\result2\image3\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 4
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image4');
newfile=strcat('.\result2\image4\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 5
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image5');
newfile=strcat('.\result2\image5\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 6
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image6');
newfile=strcat('.\result2\image6\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 7
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image7');
newfile=strcat('.\result2\image7\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 8
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image8');
newfile=strcat('.\result2\image8\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 9
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image9');
newfile=strcat('.\result2\image9\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 10
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image10');
newfile=strcat('.\result2\image10\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 11
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image11');
newfile=strcat('.\result2\image11\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 12
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image12');
newfile=strcat('.\result2\image12\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 13
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image13');
newfile=strcat('.\result2\image13\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 14
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image14');
newfile=strcat('.\result2\image14\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 15
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image15');
newfile=strcat('.\result2\image15\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 16
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image16');
newfile=strcat('.\result2\image16\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 17
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image17');
newfile=strcat('.\result2\image17\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 18
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image18');
newfile=strcat('.\result2\image18\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 19
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image19');
newfile=strcat('.\result2\image19\m',num2str(x),'.bmp');
imwrite(A,newfile);
case 20
filename=strcat('.\training2\','m',num2str(x),'.bmp');
A=imread(filename);
mkdir('result2\image20');
newfile=strcat('.\result2\image20\m',num2str(x),'.bmp');
imwrite(A,newfile);
end
end
最后的结果基本达到要求了,完整的叙述一下这个任务就是:把一个文件夹里的图像数据(25*25)用FCM聚类算法进行分类,然后分类的结果保存到新的子文件夹中,每一个文件夹存储一类结果。最后的结果如下:

matlab任务:FCM分类的更多相关文章
- MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...
- Matlab实现图像分割 分类: 图像处理 2014-06-14 21:31 662人阅读 评论(1) 收藏
下面使用极小值点阈值选取方法,编写MATLAB程序实现图像分割的功能. 极小值点阈值选取法即从原图像的直方图的包络线中选取出极小值点, 并以极小值点为阈值将图像转为二值图像 clear all; cl ...
- 用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 ...
- knn原理与实践
knn法是一种基本分类与回归方法 应用:knn算法不仅可以用于分类,还可以用于回归.. 1.文本分类:文本分类主要应用于信息检索,机器翻译,自动文摘,信息过滤,邮件分类等任务. 2.可以使用knn算法 ...
- BP_Adaboost 模型及其分类应用
一.BP_ Adaboost模型 Adaboost 算法的思想是合并多个“弱”分类器的输出以产生有效分类.其主要步骤为 : (1)首先给出弱学习算法和样本空间(x, y) ,从样本空间中找出 m 组训 ...
- 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
前言:这几天一直都在研究模糊聚类.感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类. 一:模糊数学 我们大家都知道计算机其实只认识两个数字0,1.我们平时写程序其实也是这样 ...
- 使用LIBSVM工具实现样本分类预测——MatLab
准备工作: https://www.csie.ntu.edu.tw/~cjlin/libsvm/,下载LIBSVM:(LIBSVM工具相较于MATLAB自带的工具:1).支持多分类及回归(‘-s 0’ ...
- 简单的线性分类——MATLAB,python3实现
看李政轩老师讲的Kernel,讲的非常好!前面有几道作业题,用MATLAB简单做了下,不知道对不对,错误之处还请指出. 题目是这样的. 一.MATLAB版本: clear; clc % 生成train ...
- 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)
之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...
随机推荐
- Java中print()、printf()、println()的区别?
区别: 1.printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 2.print就是一般的标准输出,输入信息后不会换行 3.println输入信息会换行 参照JAVA API的定 ...
- mysql中获取自增函数解析
1 如果 一条语句多行插入,默认情况下是返回第一行的自增id 2 存储过程可以与外部共享自增,而函数和触发器不能,因为在函数和触发器关闭的时候,自增自动restore 3 获取自增id,不会因为并发产 ...
- ugui在运行时改变RectTransform的大小
http://blog.csdn.net/BeiFuDeNvWang/article/details/50838266 在代码中动态改变RectTransform大小的方法如下所示: 1:直接对siz ...
- 五、Jmeter--关联(正则表达式)
一.什么时候需要关联? 1. 服务器返回的动态变化而且对业务有影响的需要关联. 2. 回放脚本看是否正确,检查下脚本,是否有动态数据影响 3. 一大串字符串,每次请求参数是否有变化 4. 可以找开发问 ...
- SpringCloud微服务实战——第三章服务治理
Spring Cloud Eureka 服务治理 是微服务架构中最核心最基本的模块.用于实现各个微服务实例的自动化注册与发现. 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中 ...
- ABP 学习系列 - 目录
一.ABP 学习系列 - 入门介绍之单表 http://www.cnblogs.com/yabu007/p/8067694.html 二.ABP 学习系列 - 入门介绍之多表 http://www.c ...
- JSF拦截ajax请求并传递参数方法
我们可以利用f:ajax做一些简单的ajax操作,但是遇到复杂的逻辑,它不能简单的去实现,jsf提供了一种方法,可以调用它内部的js方法去实现复杂的逻辑. 首先要在页面引入jsf的js文件: < ...
- 蓝桥杯 算法训练 ALGO-140 P1101
算法训练 P1101 时间限制:1.0s 内存限制:256.0MB 有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函 ...
- python第十一天-----补:缓存操作
memcached,首先下载python-memcached模块,在cmd中执行pip install python-memcached即可 memcached比较简单,默认情况仅支持简单的kv存储, ...
- .Net 一直在改变
Microsoft 微软又进一步了,每天都有惊喜. MSDN,是微软官网开发者技术支持网络,今天给我一个小惊喜,不多说直接上图.分享给大家 右键新打开Tab选项,就能看到官方的源码实现.为我们学习提供 ...