2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)

对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)

时间:2022-03-22 09:11:24

相关推荐

对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)

该项目已免费开源!点个收藏和赞吧!/zhengzsj/mushroom-classification-system-based-on-matlab-image-processing

对如下两种类型的蘑菇进行识别与分类:

A类:

B类:

计算提供的A、B类所有图片的特征值,求取所有特征值的平均值、方差等,经过大量的计算方法分析,发现简单地靠各个特征乘以一定比例系数求取A、B类的分类范围,基本不可能完全地分开A、B类(即A、B类特征数据范围不可能没有交集)。考虑用模式识别的方法,通过机器自动识别建立分类器。

下表只列出了A、B类所有图片的特征值的平均值

由于模式识别用的特征越少越好,最好是最本质的特征;经过大量实验发现这标准差、最大连通域占比这两个特征值最具有代表性,A、B两类蘑菇的这两个特征值差别也比较大,因此选择是标准差作为横坐标,最大连通域占比作为纵坐标,采取SVM模式识别算法建立线性分类器。

一、图像处理

%% __________________A&B类批量处理设计分类器____________________________clear,clc,close all%% -----------------------------A类--------------------------------%fileFolder='E:\picture\A\';fileFolder='D:\旧电脑\picture\picture\A\';dirOutput=dir(strcat(fileFolder,'*'));fileNames={dirOutput.name};len = length(fileNames);N1=zeros(len,5);%% 文件提取————批量提取图片文件,前两行不是文件,所以从3开始for i=3:len% 连接路径和文件名得到完整的文件路径K_Trace = strcat(fileFolder, fileNames(i));% 读取数据(因为这里是.txt格式数据,所以直接用load()函数)%eval(['Data',num2str(i),'=','imread(K_Trace{1,1})',';']);% 注意1:eval()函数是括号内的内容按照命令行执行,% 即eval(['a','=''2','+','3',';'])实质为a = 2 + 3;% 注意2:由于K_Trace是元胞数组格式,需要加{1,1}才能得到字符串eval(['RGB','=','imread(K_Trace{1,1})',';']);% figure,imshow(RGB);r=RGB(:,:,1);%% *******************图像分割(阈值法)*******************% I=mat2gray(r);%实现图像矩阵的归一化,使矩阵的每个元素的值都在0和1之间%I = rgb2gray(RGB);%彩色图像转灰度图像%% 灰度化R=I(:,:,1);R=mat2gray(R);%实现图像矩阵的归一化,使矩阵的每个元素的值都在0和1之间%% 图像增强—线性灰度变换I1=imadjust(R,stretchlim(R),[]);%图像增强%% 手动阈值法图像分割k1=find(I1>180/255);%找到灰度值大于180的索引(指针)I2=zeros(size(I1));I2(k1)=255/255; %索引大于50的像素的灰度值置255%imshow(I2);title('分割去柄')%% 删除面积小于100的对象bw = bwareaopen(I2,100);%figure,imshow(bw);%% 边缘检测—canny算子,计算边缘占比ed=edge(bw,'canny');% figure,imshow(ed);sum1=0;[M,N]=size(ed);for k=1:Mfor j=1:Nif ed(k,j)==1sum1=sum1+1;endendendN1(i,1)=sum1/(M*N);%% 计算最大连通域面积[M,N]=size(bw);[L,n] = bwlabel(bw);x=zeros(1,n);for k=1:nx(k)=sum(sum(L==k));end[m,ind]=max(x);con=0;% S=zeros(M,N);for k=1:Mfor j=1:Nif L(k,j)==indcon=con+1;% S(k,j)=1;endendend% figure,imshow(S);N1(i,5)=con/(M*N);%% **********************************特征选择*****************************h=imhist(R); %用红色分量图最好,灰度图次之,二值图再次之,边缘图方差很近%h=imhist(final);%把纹理图像(二值图)的直方图代入h变量中%figure,plot(h);%显示纹理图像的直方图h=h./sum(h); %归一化% h=mat2gray(R);L=length(h); %计算灰度级L=L-1;h=h(:);%转化为列向量rad=0:L;%生成随机数rad=rad./L;%归一化m=rad*h;%均值rad=rad-m;stm=zeros(1,3);stm(1)=m;for j=2:3stm(j)=(rad.^j)*h;%计算n阶矩endusm(1)=stm(1)*L;%一阶矩usm(2)=stm(2)*L^2;%二阶矩%usm(3)=stm(3)*L^3;%三阶矩st(1)=usm(1); %均值st(2)=usm(2).^0.5; %标准差%st(3)=1-1/(1+usm(2)); %平滑度st(3)=sum(h.^2); %一致性%st(5)=-sum(h.*log2(h+eps)); %熵N1(i,2)=st(1); %均值N1(i,3)=st(2); %标准差N1(i,4)=st(3);%一致性end

对B类蘑菇做类似的处理,得到N2等数据

二、分类器建模

建立SVM线性分类器,并保存模型

%% ***********************训练模型************************% 绘制以标准差为横坐标,最大连通域面积比为纵坐标的散点图scatter(N1(3:55,3),N1(3:55,5),'r');hold on; % 花菇,纹理多scatter(N2(3:55,3),N2(3:55,5),'b');% 光面菇,纹理少% 构建数据集和对应标签(类别)集data=[N1(:,3),N1(:,5);N2(:,3),N2(:,5)];label = [zeros(55,1);ones(55,1)];% 数据集分两部分trainData = [data(3:42,:);data(58:97,:)];% 每组前40个用于训练testData = [data(43:55,:);data(98:110,:)];% 每组后13个用于测试% 标签集分两部分trainLabel = [label(3:42,:);label(58:97,:)]; % 每组前40个用于训练testLabel = [label(43:55,:);label(98:110,:)]; % 每组后13个用于测试% 开始训练svmModel = svmtrain(trainData, trainLabel,'kernel_function','linear','showplot',true);%并画图% 开始测试predict_label = svmclassify(svmModel,testData,'showplot',true); %并画图% 输出正确率fprintf('使用svmclassify,正确率:%f\n' ,sum(predict_label==testLabel)/size(testLabel,1));save('D:\旧电脑\picture\picture\flow_svmModel2','svmModel'); %文件路径+文件名 D:\旧电脑\picture\picture\flow_svmModel2,'svmModel'要保存的SVM模型

保存的模型:

三、使用分类器进行识别

先计算用于分类的特征值:标准差、最大连通域占比,再利用之前已经训练好的SVM模型进行识别

计算样本的类别:

classes = sDataScaled * w’ + b

算出来的classes小于0的是B类, 大于0的是A类

%% ************计算最大连通域面积*********[M,N]=size(bw);[L,n] = bwlabel(bw);x=zeros(1,n);for k=1:nx(k)=sum(sum(L==k));end[m,ind]=max(x);con=0;S=zeros(M,N);for k=1:Mfor j=1:Nif L(k,j)==indcon=con+1;S(k,j)=1;endendendCON=con/(M*N);figure,imshow(S);%% **********************************特征选择*****************************h=imhist(R); %用红色分量图最好,灰度图次之,二值图再次之,边缘图方差很近%h=imhist(final);%把纹理图像(二值图)的直方图代入h变量中%figure,plot(h);%显示纹理图像的直方图h=h./sum(h); %归一化% h=mat2gray(R);L=length(h); %计算灰度级L=L-1;h=h(:);%转化为列向量rad=0:L;%生成随机数rad=rad./L;%归一化m=rad*h;%均值rad=rad-m;stm=zeros(1,3);stm(1)=m;for j=2:3stm(j)=(rad.^j)*h;%计算n阶矩endusm(1)=stm(1)*L;%一阶矩usm(2)=stm(2)*L^2;%二阶矩%usm(3)=stm(3)*L^3;%三阶矩st(1)=usm(1); %均值st(2)=usm(2).^0.5; %标准差%st(3)=1-1/(1+usm(2)); %平滑度st(3)=sum(h.^2); %一致性%st(5)=-sum(h.*log2(h+eps)); %熵%% **********分类************svmModel_mat = load('flow_svmModel2');svmModel= svmModel_mat.svmModel;%计算超平面方程参数[~, r] = size(svmModel.SupportVectors);w = sum(svmModel.SupportVectors .* repmat(svmModel.Alpha, 1, r));b = svmModel.Bias;%将需要验证的样本预处理, (缩放平移)scale = svmModel.ScaleData.scaleFactor;shift = svmModel.ScaleData.shift; %获取样本sData=[st(2),CON];%本预测集只有这一个点,输出classes=-0.5918小于零,是线下类(B类蘑菇)[c, ~] = size(sData);%获取样本数量, sData是样本 每一行是一个样本sDataScaled = (sData+ repmat(shift, c, 1)) .* repmat(scale, c, 1);%计算样本的类别classes = sDataScaled * w' + b%算出来的classes小于0的是B类, 大于0的是A类if(classes>0)fprintf('该蘑菇是A类');elsefprintf('该蘑菇是B类')end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。