一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【水果蔬菜识别】基于matlab GUI形态学水果蔬菜识别【含Matlab源码 919期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、水果蔬菜识别简介

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可以看出,模式识别主要包括训练和测试两个方面,其中,图像的训练尤为重要。在训练数据时,训练算法起至关重要的作用。识别分类算法即对提取的特征进行训练测试,是水果识别系统核心。

三、部分源代码

% *********************************************************************
% 说明:设计思路:先对原图像进行灰度化即二值化处理,再进行区域分割和特征提取。
% 颜色特征利用已知水果图片计算平均色度,再进行判别;
% 形状特征是对分割出的区域进行分析,不同水果具有特定的形状信息,本设计主要选择面积和长轴长度以及离心率作为判别特征。
% 平均色度的计算可参见sedu.m,形状特征的计算可参见Region_separate.m
% *********************************************************************
function varargout = Fruits_recognition(varargin)
% FRUITS_RECOGNITION MATLAB code for Fruits_recognition.fig
%      FRUITS_RECOGNITION, by itself, creates a new FRUITS_RECOGNITION or raises the existing
%      singleton*.
%
%      H = FRUITS_RECOGNITION returns the handle to a new FRUITS_RECOGNITION or the handle to
%      the existing singleton*.
%
%      FRUITS_RECOGNITION('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FRUITS_RECOGNITION.M with the given input arguments.
%
%      FRUITS_RECOGNITION('Property','Value',...) creates a new FRUITS_RECOGNITION or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Fruits_recognition_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Fruits_recognition_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 Fruits_recognition% Last Modified by GUIDE v2.5 04-May-2021 19:46:07% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @Fruits_recognition_OpeningFcn, ...'gui_OutputFcn',  @Fruits_recognition_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before Fruits_recognition is made visible.
function Fruits_recognition_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 Fruits_recognition (see VARARGIN)% Choose default command line output for Fruits_recognition
handles.output = hObject;% Update handles structure
guidata(hObject, handles);
global fruit_name                        %初始化
fruit_name='Banana';
% UIWAIT makes Fruits_recognition wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = Fruits_recognition_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;% *******************************************************************
% **************                              ***********************
% ************** Useful Functions Starts here ***********************
% **************                              ***********************
% *******************************************************************% --- Executes on button press in File_open.
function File_open_Callback(hObject, eventdata, handles)
% hObject    handle to File_open (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global img;
global im_gray;
global im_bw;
global HSV;
global fruit_name;
[filename,pathname]=uigetfile('*.jpg');        %读取图像
img = imread([pathname,filename]);
im_gray = rgb2gray(img);                       %灰度化
im_bw = im2bw(im_gray,0.9);                    %二值化
im_bw= bwareaopen(im_bw, 10);                  %去除图像中面积过小的杂点
im_bw= 1 - im_bw;                              %灰度反转,将背景变为黑色
HSV = rgb2hsv(img);                            %转换为HSV,为后面的颜色元素的提取做准备
axes(handles.axes1);
colormap(colorcube);
imagesc(img);
set(handles.axes1,'xtick',[],'ytick',[]);
% --- Executes when selected object is changed in uipanel2.
function uipanel2_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uipanel2
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)
global fruit_name
switch get(hObject, 'Tag')case 'radiobutton_banana'fruit_name = 'Banana';case 'radiobutton_pepper'fruit_name = 'Pepper';case 'radiobutton_pear'fruit_name = 'Pear';case 'radiobutton_tomato'fruit_name = 'Tomato';case 'radiobutton_apple'fruit_name = 'Apple';
end% --- Executes on button press in Recognition.
function Recognition_Callback(hObject, eventdata, handles)
% hObject    handle to Recognition (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global img;
%global im_gray;
global im_bw;
global fruit_name;
global im_show;
global HSV;
[Label,num] = bwlabel(im_bw,8); %将不同的图形进行分别标记,num表示连接的图形对象的个数
pro = regionprops(Label,'all'); % 统计被标记的区域的形状特征% %% 计算已知类别水果的平均色度
% I=imread('梨.jpg');
% meanhu_pear=Chromacity_caculate(I)
% I1=imread('青椒.jpg');
% meanhu_pepper=Chromacity_caculate(I1)
% I2=imread('香蕉.jpg');
% meanhu_banana=Chromacity_caculate(I2)
% I3=imread('西红柿.jpg');
% meanhu_tomato=Chromacity_caculate(I3)% %% 计算各个分块图像的色度
FilledLabel = imfill(Label,'holes');     %填充打过标记的边界线中间围成的图形区域
[row,col] = size(FilledLabel);           %统计填充后的图形中各块图形所含像素的个数的多少
MeanHue = zeros(1,num);for i = 1 : numHue = zeros(pro(i).Area,1);nPoint = 0;for j = 1 : rowfor k = 1 : colif(FilledLabel(j,k) == i)nPoint = nPoint + 1;Hue(nPoint,1) = HSV(j,k,1);endendendHue(:,i) = sort(Hue(:,1));for j = floor(nPoint*0.1) : floor(nPoint*0.9)MeanHue(i) = MeanHue(i) + Hue(j,1);endMeanHue(i) = MeanHue(i) / (0.8*nPoint);  %计算出平均的色度值end

四、运行结果




五、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)

【水果蔬菜识别】基于matlab GUI形态学水果蔬菜识别【含Matlab源码 919期】相关推荐

  1. 【Matlab水果蔬菜识别】形态学水果蔬菜识别【含GUI源码 919期】

    一.代码运行视频(哔哩哔哩) [Matlab水果蔬菜识别]形态学水果蔬菜识别[含GUI源码 919期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅. ...

  2. 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab GUI三体运动模拟[含Matlab源码 871期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  3. 【音乐播放】基于matlab GUI动感音乐播放【含Matlab源码 778期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[音乐播放]基于matlab GUI动感音乐播放[含Matlab源码 778期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  4. 【雷达通信】基于matlab GUI相控阵雷达方向图【含Matlab源码 1048期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达通信]基于matlab GUI相控阵雷达方向图[含Matlab源码 1048期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  5. 【数据分析】基于matlab GUI齿轮箱振动数据分析【含Matlab源码 2122期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数据分析]基于matlab GUI齿轮箱振动数据分析[含Matlab源码 2122期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  6. 【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI维达尔之眼计算[含Matlab源码 2545期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  7. 【光学】基于matlab GUI双孔干涉【含Matlab源码 2119期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双孔干涉[含Matlab源码 2119期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  8. 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双缝干涉和牛顿环[含Matlab源码 2165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  9. Matlab GUI/APP 浅谈(附计算器源码)

    Matlab GUI/APP 浅谈(附计算器源码) 今天没有什么段子,也没有心灵鸡汤.毒鸡汤啥的,纯粹聊一聊这些年从有关MATLAB GUI/APP开发中悟出的一点道理,顺便把计算器的源代码给大家. ...

  10. 【课程设计】基于java GUI实现学生个人信息管理系统(源码+论文+ppt+视频)

    源码资料 免费下载 不经常在线,需要源码和资料的留言私信我,主页有联系方式 技术架构 开发语言 主要用的是Java语言中的GUI(图形用户界面)和AWT(抽象窗口工具包)编程. (1) GUI 图形用 ...

最新文章

  1. 2017-2021年中国大数据产业预测分析及全球市场规模预测
  2. 支持Windows 7的CAD—AutoCAD Civil 3D 2010
  3. Teleport Ultra 抓包工具
  4. android 修复工具,牛学长安卓手机修复工具(Reiboot for Android)
  5. glibc升级失败及处理过程
  6. SSH框架java写接口_SSH框架的搭建+JPA接口
  7. R语言实现随机分组(按照学号或者是姓名随机分组)
  8. 2.11 神奇的自定义画笔 [Ps教程]
  9. 【linux内核分析与应用-陈莉君】设备驱动模型
  10. 垃圾短信相关用户细分方案
  11. 阿里云Oss搭建私人图床
  12. 钉钉打卡显示服务器忙,钉钉系统繁忙请稍后再试
  13. Banner(轮播)
  14. 做自媒体18个月,倒欠38万,一个自媒体创作者的自述
  15. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(二)
  16. 新做的网络电视播放器,欢迎试用
  17. RTKLIB_trans_all
  18. 为什么要用Linux系统?
  19. R Talk | 旷视科技孙剑博士:云、端、芯上的视觉计算
  20. java 解析csr文件_ANS.1结合CSR文件学习笔记

热门文章

  1. 省选专练之数学 BZOJ2820 YY的GCD
  2. chmod与chown
  3. SharpGL学习笔记(十二) 光源例子:解决光源场景中的常见问题
  4. Codeforces 15C Industrial Nim 简单的游戏
  5. html中label宽度设置、非替换元素和替换元素
  6. LINUX 下 一些常用的信息显示命令:
  7. Java反编译插件Jdclipse导致Eclipse 3.7.2启动崩溃的解决方法
  8. 2010年“最具全球竞争力中国公司20强”榜单:
  9. 基于Bayes和KNN的newsgroup 18828文本分类器的Python实现
  10. 算法与数据结构 第1章 当我们谈论算法的时候,我们在谈论什么?