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

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

B类:
对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)
计算提供的A、B类所有图片的特征值,求取所有特征值的平均值、方差等,经过大量的计算方法分析,发现简单地靠各个特征乘以一定比例系数求取A、B类的分类范围,基本不可能完全地分开A、B类(即A、B类特征数据范围不可能没有交集)。考虑用模式识别的方法,通过机器自动识别建立分类器。
下表只列出了A、B类所有图片的特征值的平均值
对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)
由于模式识别用的特征越少越好,最好是最本质的特征;经过大量实验发现这标准差、最大连通域占比这两个特征值最具有代表性,A、B两类蘑菇的这两个特征值差别也比较大,因此选择是标准差作为横坐标,最大连通域占比作为纵坐标,采取SVM模式识别算法建立线性分类器。

1.图像处理

%% __________________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:M
    for j=1:N
        if ed(k,j)==1
            sum1=sum1+1;
        end
    end
end
N1(i,1)=sum1/(M*N);
%% 计算最大连通域面积
[M,N]=size(bw);
[L,n] = bwlabel(bw);
x=zeros(1,n);
 for k=1:n
    x(k)=sum(sum(L==k));
 end
[m,ind]=max(x);
con=0;
% S=zeros(M,N);
for k=1:M
    for j=1:N
        if L(k,j)==ind
           con=con+1;
%            S(k,j)=1;
        end
    end
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: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)); %熵
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分类器(matlab)对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)
保存的模型:
对两种类型的蘑菇图像进行识别与分类——使用SVM分类器(matlab)

三、使用分类器识别

先计算用于分类的特征值:标准差、最大连通域占比,再利用之前已经训练好的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:n
    x(k)=sum(sum(L==k));
 end
[m,ind]=max(x);
con=0;
S=zeros(M,N);
for k=1:M
    for j=1:N
        if L(k,j)==ind
           con=con+1;
           S(k,j)=1;
        end
    end
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类');
else
    fprintf('该蘑菇是B类')
end

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

版权声明:本文为博主zz神君原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_43808138/article/details/123036514

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年2月23日 下午7:14
下一篇 2022年2月23日 下午7:31

相关推荐