博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab任务:FCM分类
阅读量:7172 次
发布时间:2019-06-29

本文共 7639 字,大约阅读时间需要 25 分钟。

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

 

自己写太麻烦,我花了些时间在GitHub上找了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进行相关操作endsave 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];    endend            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);    endend

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

 

转载于:https://www.cnblogs.com/libai123456/p/10171477.html

你可能感兴趣的文章
MX4 Pro上实现一键锁屏
查看>>
ppt2010 滴管
查看>>
Learn Python The Hard Way(21)
查看>>
[读书笔记]Begining PHP5 and MySQL5 From Novoice to Professional
查看>>
OSChina 周五乱弹 ——做宇宙最低调的程序员.
查看>>
Linux下Tomcat向MySQL插入数据中文乱码解决办法
查看>>
致梦中的花
查看>>
说说new Integer和Integer.valueOf
查看>>
Zabbix server is not running:zabbix access denied
查看>>
我的友情链接
查看>>
linux下的软硬链接
查看>>
【JAVA的 IO流之FileInputStream和FileOutputStream】
查看>>
远程连接mysql 授权方法详解
查看>>
FreeBSD网络配置
查看>>
@synthesize window=_window; 的理解
查看>>
Greenlet理解要点
查看>>
罗森伯格应邀主讲CDCC百家大讲堂38期
查看>>
How to Install Nextcloud 13 Server on Debian 9
查看>>
[深入理解文件系统之一] IO系统调用
查看>>
Java之implements
查看>>