Matlab水果识别——基于形态学处理的水果识别

文章目录

  • 概述
  • 一、原理简介
  • 二、实验内容
    • 1.完整代码
    • 2.图片测试
  • 最后


概述

基本思想就是用具有一定形态的结构元素去度量和提取图像中的对应形状,以达到图像分析和识别的目的。主要涉及到的运算有:膨胀、腐蚀、开操作、闭操作。


一、原理简介

1、结构元素:设有两幅图象B,A。若A是被处理的对象,而B是用来处理A的,则称B为结构元素,又被形象地称做刷子。结构元素通常都是一些比较小的图象。
2、腐蚀:X用S腐蚀的结果是所有使S平移x后仍在X中的x的集合。换句话说,用S来腐蚀X得到的集合是S完全包括在X中时S的原点位置的集合,用公式表示为:
在这里插入图片描述
3、膨胀:膨胀可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结果。

在这里插入图片描述
4、开运算:先膨胀后腐蚀称为闭运算,即:
在这里插入图片描述
(1)开运算能够除去孤立的小点,毛刺和小洞,而总的位置和形状不变。
(2)开运算是一个基于几何运算的滤波器。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

5、闭运算:先膨胀后腐蚀称为闭运算,即:
在这里插入图片描述
(1)闭运算能够填平小孔,弥合小裂缝,而总的位置和形状不变。
(2)闭运算是通过填充图像的凹角来滤波图像的。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同结构元素的选择导致了不同的分割。

二、实验内容

1.完整代码

代码如下(示例):

%matlab基于形态学水果识别
clear
clc
[filename,filepath]=uigetfile('*.jpg','    ');
if ~isequal(filename,0)
    path=strcat(filepath,filename);
    img=imread(path);
else
    msgbox('请选择水果图片!','提示','warn');
end
%%
%%进行图像的二值化
I2=rgb2gray(img);%灰度图像
BW=im2bw(I2,0.9);%图像像素大于0.9的替换为1(白),其他替换成0(黑)
%%
%%进行边缘提取
SE=strel('rectangle',[40 30]);%创建一个平坦的矩形结构,指定大小40*30
J2=imopen(BW,SE); %形态开运算,去除噪声和平滑边界
SE=strel('square',3);%定义一个正方形结构元素,指定边长3
J=imerode(~J2,SE);%对图像进行腐蚀
BW2=(~J2)-J;%得到物体边缘
B=imfill(BW2,'holes');%填充图像中的孔
B=bwmorph(B,'remove');%删除内部像素以保留形状轮廓。
%%
%%进行水果分类
[Label,num] = bwlabel(B);%8连通寻找区域,num为连通区域总数,Label为返回一个和B大小相同的矩阵,包含了标记了每个连通区域的类别标签
for i = 1 : num
    Area(i) = 0;%得到0序列Area
end
Label = imfill(Label,'holes');%填充图像中的孔
HSV = rgb2hsv(img);%将 RGB 颜色转换为 HSV
[row,col] = size(Label);%得到Label图像像素的大小row和col
MeanHue = zeros(1,num); %初始化
for i = 1 : num
    Hue = zeros(Area(i),1); %初始化
    nPoint = 0; %初始化
    for j = 1 : row
        for k = 1 : col
            if(Label(j,k) == i)
                nPoint = nPoint + 1;  %对于是连通区域中的点npoint+1.
                Hue(nPoint,1) = HSV(j,k,1); %遍历更新HSV的色度值
            end
        end
    end
    
    Hue(:,i) = sort(Hue(:,1));%进行升序排序
    for j = floor(nPoint*0.1) : floor(nPoint*0.9)
        MeanHue(i) = MeanHue(i) + Hue(j,1);  %hsv(i)的值赋给MeanHue(i)
    end
    MeanHue(i) = MeanHue(i) / (0.8*nPoint); %计算得到平均色度值
end
[L,num]=bwlabel(BW2); %重新进行区域标记。
stats= regionprops(L,'ALL');%度量L区域属性
for i= 1:num
    longth(i)=stats(i).MajorAxisLength;%长轴转换成与区域stats具有相同标准二阶中心矩的椭圆的长轴长度
    width(i)=stats(i).MinorAxisLength;%短轴转换成与区域stats具有相同标准二阶中心矩的椭圆的短轴长度
end
R2=0;G2=0;B2=0;
x=0;y=0;%初始化
for i=1:num
    r(i)=0;
    g(i)=0;
    b(i)=0;
    yuan(i)=longth(i)/width(i);%长轴比上短轴,得到似圆性特征
end
%获得以每个水果重心为中心点的边长为30的正方形内的像素的rgb值
for i=1:num
    for j=(round(stats(i).Centroid(1))-15):(round(stats(i).Centroid(1))+15)
        for k=(round(stats(i).Centroid(2))-15):(round(stats(i).Centroid(2))+15)
            R2=im2double(img(j,k,1));%转换为double类型
            G2=im2double(img(j,k,2));
            B2=im2double(img(j,k,3));
            r(i)=r(i)+R2;
            g(i)=g(i)+G2;
            b(i)=b(i)+B2;
        end
    end
    r(i)=r(i)/900;
    g(i)=g(i)/900;
    b(i)=b(i)/900;
end
%求出水果中面积最大值用于判定
for i=1:num
    if(stats(i,1).Area>x)
        x=stats(i,1).Area;
    end
end
%求出水果中hsv的最小值用于判定
y=MeanHue(1);
for i=1:num
    if(y>MeanHue(i))
        y=MeanHue(i);
    end
end
imshow(img);
hold on;
%分类算法分别如下
for i=1:num
    if(MeanHue(i)==y && yuan(i)>1.3 && r(i)>0.7 && g(i)>0.7)
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','梨子!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end
for i=1:num
    if(r(i)>0.75 && yuan(i)<1.15  && g(i)<0.4 && b(i)<0.3)
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','苹果!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end
for i=1:num
    if(MeanHue(i)<0.6 && yuan(i)<1.25 && r(i)>0.7 &&b(i)>0.1)
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','桃子!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end
for i=1:num
    if(MeanHue(i)<0.2 && yuan(i)>1.7)
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','香蕉!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end
for i=1:num
    if(MeanHue(i)<0.3 && yuan(i)>1.4&& r(i)<0.8 )
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','菠萝!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end
for i=1:num
    if( stats(i,1).Area==x && yuan(i)<1.25&& r(i)<0.4)
        %普通对话框
        h=dialog('name','识别结果','position',[700 400 200 70]);
        uicontrol('parent',h,'style','text','string','西瓜!','position',[50 40 120 20],'fontsize',12);
        uicontrol('parent',h,'style','pushbutton','position',...
            [80 10 50 20],'string','确定','callback','delete(gcbf)');
    end
end

2.图片测试

以下是苹果识别结果,文末加群联系管理员或者加我个人企鹅号免费获取其他图片。
Matlab水果识别——基于形态学处理的水果识别_第1张图片


最后

不定期发布一些matlab设计内容,敬请期待。包括但不限于如下内容:信号处理、通信仿真、gui设计、matlab appdesigner,simulink仿真。有任何有关MATLAB的问题可加个人QQ:2802009708进行咨询交流。

你可能感兴趣的:(图像处理,matlab)