该项目已免费开源!点个收藏和赞吧!https://gitee.com/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;endend
end
N1(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;endend
end
% 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阶矩
end
usm(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;endend
end
CON=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:3
stm(j)=(rad.^j)*h;%计算n阶矩
end
usm(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

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

  1. ipv6单播地址包括哪两种类型_IPv6基础详解,地址分类,基本IPv6配置,两分钟快速掌握...

    一.IPv6基础 1.IPv6地址总长度为128比特,冒分十六进制,地址中包含的连续两个或多个均为0的组,可以用双冒号"::"来代替 2.IPv6地址分为两部分: 网络前缀(相当于 ...

  2. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...

    如何判断两种类型的计算机程序发明能否成为专利保护客体?计算机程序类的发明可以根据处理和控制对象的不同划分为两种类型:控制和处理计算机外部对象的类型,以及控制和处理计算机内部对象的类型. 由于两者在技术 ...

  3. (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?

    两种类型硬币(均匀和非均匀)能否用第一次得正概率推断,第一第二次依次获得正反概率? 2种硬币 均匀的 COIN1  正反概率(正0.5  反0.5) 非均匀的COIN2 (正0.9  反0.1) 问题 ...

  4. 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成

    编译器设计-符号表-中间代码生成 Compiler Design - Symbol Table Compiler - Intermediate Code Generation 一.Compiler D ...

  5. M.2 固态硬盘的两种类型:SATA 和 NVMe 的区别?

    参考 https://www.kingston.com.cn/cn/solutions/pc-performance/two-types-m2-vs-ssd 前言 在存储技术领域,当我们讨论 M.2 ...

  6. 用implicit和explicit打通两种类型

    我们知道,在c#中,如果两个类型没有继承关系 ,是不能相互值赋的,但有两个关键字implicit和explicit,可以让 Date date = DateTime.Now这样的赋值成为可能. 注:c ...

  7. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  8. matlab将txt数据分类,MATLAB读取txt文件,txt里面有字符串和数值两种类型

    MATLAB读取txt文件,txt里面有字符串和数值两种类型 mip版  关注:96  答案:4  悬赏:30 解决时间 2021-01-29 08:48 已解决 2021-01-28 15:04 M ...

  9. 手机号段对应地区编码_什么是编码器?了解两种类型的编码器

    编码器提供反馈,以精确控制速度和位置.转子角位置是通过两个相差90度的方波和每转一圈发生的可选索引脉冲给出的.有多种技术可获得这些结果. 两种类型的编码器:光学和磁编码器 光学编码器 这种类型的编码器 ...

最新文章

  1. USEARCH11新功能简介
  2. Spring MVC+Stomp+Security+H2 Jetty
  3. linux ping IP地址与telnet 测试IP端口
  4. 对话尹成杰三农谋定压舱石-农业大健康·万祥军:稳农保供
  5. 根据DLL创建LIB输出库的方法
  6. linux基本命令以及命令常用选项
  7. solution for python can not import local module
  8. DOM(二)使用DOM
  9. 拓端tecdat|R语言用回归构建配对交易(Pairs Trading)策略量化模型分析股票收益和价格
  10. Win系统 - 如何解决 Windows + P 键无法切换双显复制模式?
  11. 【备忘】Java菜鸟到大牛学习路线之实战篇
  12. 生活随记 - 值班后第二天晚上失眠小记
  13. Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒
  14. 牛客-js练习|错题本+知识点总结-break、try...catch...finally(01)
  15. 递归——兔子繁殖问题
  16. ae-概述、流程、菜单01
  17. Invalid default value for ‘updated_at‘
  18. 世界杯小组赛频繁爆冷?这或许是强队的谋略 一分钟带你了解2022卡塔尔世界杯赛制
  19. MarbleGame优化解法
  20. 2D游戏入门——小狐狸系列(六)为人物添加动画

热门文章

  1. 通过XtraBackup进行数据库表备份和表空间传输实例
  2. ICML 2020 | GCNII:简单和深度图卷积网络
  3. 《王道》数据结构之绪论(一)
  4. d3力导向图增加节点_d3.js力导向图节点如何都显示在边框内
  5. 超级简单的自动刷新_144Hz刷新率真比60Hz快 谁用谁知道
  6. 计算机高逼格术语,你能看懂这些高逼格专业词汇吗?
  7. Ubuntu配置和使用cups打印服务器
  8. C++中使用map时,it->second是什么意思?
  9. 三刺激值计算公式_颜色三刺激值的计算方法及其比较
  10. C语言之#error/#warning