【水果识别】基于matlab GUI形态学水果识别(含识别率)【含Matlab源码 907期】
一、水果识别简介
0 引 言
 随着计算机技术的发展,图像识别技术被应用到各大领域。在农业领域中,图像识别技术的应用也较为广泛。例如,农作物虫害图像识别,农产品自动分拣及品质分级等等。我国是水果大国,对于水果图像识别的研究尤为重要。水果图像识别能对不同水果进行识别分类,有利于水果的自动分拣及水果品质分级。在西方的发达国家,已经开始对水果行业智能化、规模化,在选果包装车间中,已经普遍采用无损伤检测手段。因此,水果图像识别技术具有很大的效益潜力。
 20世纪80年代初,国内外学者开始对水果识别分类进行研究,包括研究水果的计算机自动识别分类等。但是传统的水果识别仅仅基于水果的轮廓曲线特征或者颜色特征,识别精度不高,分类效果较差。近年来,随着计算机技术的提升和新型算法的提出,出现了一些基于模式识别算法的较新方法,比如基于卷积神经网络的水果识别系统和基于深度学习的水果图像识别系统。
 最初,深度学习是为了解决图像识别问题而提出的;如今,深度学习已经在图像、语音等方面取得了重大突破。目前,深度学习技术已经广泛应用到图像识别中,主要应用于图像的分类识别、图像的目标检测、图像修复和图像分割等领域。
 鉴于图像识别技术的发展及国内外研究现状,本文提出一种基于阈值分类器的水果识别系统。水果图像识别的研究将有利于水果分拣实现智能化,同时,也给其他图像识别领域提供了一定的参考。
1 水果识别系统构成
 1.1 水果识别流程图
 一个基本的图像识别系统主要由图像采集、图像预处理、图像特征提取、图像识别算法等步骤组成。每一步骤都会对图像识别的精度起着至关重要的作用,但是根据研究的不同,可以适当的侧重其中一个流程。本文水果系统识别流程如图1所示。
 
 图1 水果识别流程
 1.2 水果图像预处理
 在分析和使用图像之前,需要对图像进行预处理,包括水果图像二值化、形态学处理,水果图像填充和水果图像边缘检测。
 水果图像二值化处理一般采用OTSU算法。水果图像经二值化处理后仍然有一些独立的小白点,而且边缘有许多毛刺,整体二值化图像不圆润,不是很光滑,于是对二值化的图像进行形态学处理,并对二值化图像进行开运算。开运算处理之后,再对图像进行边缘检测、水果图像填充。
2 水果特征提取
 特征是一个对物体进行描述的量,任何识别算法都需要选取一个好的特征,这是确保算法有效的关键。为了识别不同种类的水果,采集到的水果图像经预处理后,还需要进行特征提取。水果较为明显的特征包括:颜色特征、形状特征及纹理[7]。就本研究而言,主要考虑的是水果的形状特征。水果形状特征是识别水果种类的要重依据,水果形状特征比较多,主要包括水果的大小、水果的周长、水果的面积、水果的圆度、水果的离心率等等。
在水果识别中,桃子和苹果的形状更加圆滑,也更加接近圆形;香蕉形状比较长,它是属于条形的;而像菠萝则类似一个矩形。对水果整体区域进行填充时,可以通过图像像素的个数求出的水果面积S,也可以根据边缘检测求出水果的周长L。用圆度t来表示与圆形的近似程度,则有:
 
 式中:π是圆周率;S是图像面积;L是图像的周长。
水果识别中,先求出圆度t,圆度越趋近于1,说明水果形状越近似为圆形,圆度越趋近于0,说明水果形状偏离圆形。除了圆度t,还设置了其他形状参数,比如离心率e,长轴和短轴之比f等。本文选择不同水果图像,对其形状特征参数进行比对,见表1所列。通过表1可以看出,水果的种类不同,其形状特征参数差别比较大,就圆度而言,桃子的圆度接近为1,故其形状与圆相近;菠萝的圆度最小,接近为0,其形状与圆形差别比较大,与实际情况大致相符。
 
 3 阈值分类器
 图像的精准识别是一个比较困难的研究课题,图像识别技术是模式识别技术的一个重要分支。基于图像的模式识别流程如图3所示。
 
 图3 模式识别流程
 从图3可以看出,模式识别主要包括训练和测试两个方面,其中,图像的训练尤为重要。在训练数据时,训练算法起至关重要的作用。识别分类算法即对提取的特征进行训练测试,是水果识别系统核心。
二、部分源代码
function varargout = fruit(varargin)
% FRUIT MATLAB code for fruit.fig
%      FRUIT, by itself, creates a new FRUIT or raises the existing
%      singleton*.
%
%      H = FRUIT returns the handle to a new FRUIT or the handle to
%      the existing singleton*.
%
%      FRUIT('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FRUIT.M with the given input arguments.
%
%      FRUIT('Property','Value',...) creates a new FRUIT or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before fruit_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to fruit_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help fruit
% Last Modified by GUIDE  
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @fruit_OpeningFcn, ...
                   'gui_OutputFcn',  @fruit_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before fruit is made visible.
function fruit_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to fruit (see VARARGIN)
set(handles.axes1,'xtick',[]);
set(handles.axes1,'ytick',[]);
set(handles.axes1,'box','on');
set(handles.axes2,'xtick',[]);
set(handles.axes2,'ytick',[]);
set(handles.axes2,'box','on');
% Choose default command line output for fruit
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes fruit wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = fruit_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
str=uigetfile({'*.gif';'*.png';'*.bmp';'*.jpg'},'读取图像');
%str=handles.b;
I = imread(str);
axes(handles.axes1)
%在axes1上作图
imshow(I);
handles.a=I;
guidata(hObject,handles)
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
img=handles.a;
R=img(:,:,1);           %获取彩色图像的r值。
G=img(:,:,2);           %获取彩色图像的g值。
B=img(:,:,3);           %获取彩色图像的b值。
I2=rgb2gray(img);       %将图像灰度化。
%figure,imshow(I2),title('灰度图像');
BW=im2bw(I2,0.9);       %将图像二值化。
SE=strel('rectangle',[40 30]);      % 结构定义
J2=imopen(BW,SE);   
axes(handles.axes2)% 进行开运算去除噪声和平滑边界
imshow(J2);
handles.b=J2;
guidata(hObject,handles)
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
J2=handles.b;
img=handles.a;
SE=strel('square',3);                % 定义3×3腐蚀结构元素
J=imerode(~J2,SE);                  %对图像进行腐蚀操作。
BW2=(~J2)-J;                         % 检测边缘
%填充了已有的检测的连续形状边界
B = imfill(BW2,'holes');            %对图像填充孔洞。
B = bwmorph(B,'remove');            %获得图像中区域边界。
%将不同的图形进行分别标记,num表示连接的图形对象的个数
[Label,num] = bwlabel(B);           %进行标记。
for i = 1 : num
    Area(i) = 0;
end
Label = imfill(Label,'holes');       %填充打过标记的边界线中间围成的图形区域
%计算各个图像的hsv颜色(色度)
HSV = rgb2hsv(img);                  %转换为HSV颜色模型。
[row,col] = size(Label);             %统计填充后的图形中各块图形所含像素的个数的多少
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的值赋给Hue数组。
                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
%调用regionprops函数获得各个联通区域的属性值(中心点坐标,外接椭圆的长短轴长度,面积)。
[L,num]=bwlabel(BW2);                               %重新进行区域标记。
stats= regionprops(L, 'ALL');                       %调用regionprops函数。
for i= 1:num
longth(i)=stats(i).MajorAxisLength;                 %获得外接椭圆的长轴长度
width(i)=stats(i).MinorAxisLength;                  %获得外接椭圆的短轴长度
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
  
 - 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 - 86
 - 87
 - 88
 - 89
 - 90
 - 91
 - 92
 - 93
 - 94
 - 95
 - 96
 - 97
 - 98
 - 99
 - 100
 - 101
 - 102
 - 103
 - 104
 - 105
 - 106
 - 107
 - 108
 - 109
 - 110
 - 111
 - 112
 - 113
 - 114
 - 115
 - 116
 - 117
 - 118
 - 119
 - 120
 - 121
 - 122
 - 123
 - 124
 - 125
 - 126
 - 127
 - 128
 - 129
 - 130
 - 131
 - 132
 - 133
 - 134
 - 135
 - 136
 - 137
 - 138
 - 139
 - 140
 - 141
 - 142
 - 143
 - 144
 - 145
 - 146
 - 147
 - 148
 - 149
 - 150
 - 151
 - 152
 - 153
 - 154
 - 155
 - 156
 - 157
 - 158
 - 159
 - 160
 - 161
 - 162
 - 163
 - 164
 - 165
 - 166
 - 167
 - 168
 - 169
 - 170
 - 171
 - 172
 - 173
 - 174
 - 175
 - 176
 - 177
 - 178
 - 179
 - 180
 - 181
 - 182
 - 183
 - 184
 - 185
 
三、运行结果

 
 
 
 
四、matlab版本及参考文献
1 matlab版本
 2014a
2 参考文献
 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
 [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
 [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
 [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
 [5]杜俊波,李文正.基于阈值分类器的水果识别系统设计[J].物联网技术. 2020,10(12)
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/117127438
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)