【水果识别】苹果质量检测及分级系统(带面板)【含GUI Matlab源码 1613期】

news2024/11/27 4:13:47

⛄一、简介

1 案例背景
目前,苹果的分级主要靠人工完成,该方法存在主观误差大、效率低和苹果易造成二次损伤等问题。随着机器视觉技术的快速发展, 图像处理在水果质量检测方面也取得了深入进展。
试验拟通过采集视野内苹果图, 综合特征对苹果进行分级, 通过SVM决策树算法将苹果分为特级果、一级果、二级果和三级果,以增加苹果在线分级的准确度并提高分级效率。

2 背景分割
2.1 图像预处理
系统通过摄像头采集苹果图像,由于苹果表面光滑,光线容易发生反射,所拍摄到的果面可能会因为角度和光照影响出现光照不均现象,故采用同态滤波方式对图像进行增强,采用中值滤波方式消除噪声。同时,为了提高苹果在线分级的效率,仅对感兴趣区域进行背景分割与特征提取;最后综合两幅不同位姿的苹果图像信息对苹果进行分级。

2.2 背景分割
为了从苹果图像中提取出苹果轮廓,一般采用边缘检测、阈值分割、区域提取3种方法。由于光照、拍摄角度等问题,单一的阈值又不利于多峰图像的分割,在复杂背景下容易出现欠分割、过分割等问题,所以采用全局阈值分割效果并不理想。自适应O stu阈值分割算法可以通过自动计算最佳阈值对图像中的苹果进行提取。泛洪填充算法是从一个点开始,将其附近像素点依次填充成新的颜色,直到封闭区域内的所有像素点均被填充成新颜色为止,采用泛洪填充算法将图像中与背景颜色相近的部分填充成黑色, 可以突出背景与前景的差距。故采用泛洪填充+自适应Ostu的算法进行背景分割, 使Ostu自适应分割效果更加显著, 具体步骤如下。
(1)将输入的原图[图2(a)]进行图像预处理。
(2) 对预处理后的图像进行泛洪填充, 计算得到图像高度h和宽度w, 种子点(w-1, h-1) , 填充的颜色RGB新值为(0,0,0),相对于种子点向下的像素值为(10,10,10),向上的像素值为(9,9,9),采用8领域填充法进行填充,结果如图2(d)所示。
(3)假设图2(d)前景与背景分割阈值为t,前景点占图像的比例为Wo,均值为Uo,背景点占图像的比例为W1,均值为U1。那么,整个图像的均值为:
在这里插入图片描述
目标函数为:
在这里插入图片描述
其中g(t) 是分割阈值为t时的类间方差表达式。O stu算法可以使g(t)取得全局最大值,当g(t)达到最大时,所对应的t被称为最佳阈值,处理结果如图2(f)所示。
由图2可知,未进行泛洪填充处理的图像灰度直方图存在两个尖峰,对原图进行O stu分割后的边缘较差, 存在欠分割问题; 经泛洪填充后的图像直方图尖峰明显, 进行O stu分割处理效果很好,证明了试验方法是可行的。
2.4 特征提取
2.4.1果径
根据鲜苹果分级标准可知,苹果果径等于苹果的最大横截面直径。故采用最小外接圆法对苹果上表面的二值化图像进行计算,得到苹果果径,结果如图3所示。
首先按式(3)计算出最小外接圆的质心(Cx,Cy)
在这里插入图片描述
式中:
Cx———质心的横坐标;
Cy———质心的纵坐标;
M10———二值图中水平向右的像素个数;
M00———总像素个数;
M01———垂直向下的像素个数。
将图像的质心作为苹果轮廓的圆心,遍历轮廓上所有像素点,计算出目标像素点离质心的最大距离d,即最小外接圆的半径。
在这里插入图片描述
式中:
xi———目标像素点的横坐标;
yi———目标像素点的纵坐标;
d———两点之间的距离。
在这里插入图片描述
式中:
R———果径,mm;

2.4.2 着色度
目前,常用的彩色模型包括RGB模型和HSV模型。其中HSV模型更符合人眼对颜色的认知,是面向彩色处理最常用的模型,其中H为色度、S为饱和度、V为明度[8]。故选择在HSV颜色空间上对苹果的着色度、疤痕和果锈特征进行提取。
根据红富士苹果分级标准可知,苹果着色度为统计集中着色面,条红或者片红的程度。通过统计两帧图像中红色所占的比例,得出红富士苹果的着色度。
首先将RGB图转换成HSV图,然后选取红色的提取范围H(156~180)、S(43~256)、V(46~255)。经阈值处理后统计图像中白色像素点个数,按式(8)计算苹果的着色度。
在这里插入图片描述
式中:
C———着色度;
C1———第一帧苹果的着色度;
C2———第二帧苹果的着色度;
r1———第一帧图像阈值处理后白色像素点个数;
r2———第二帧图像阈值处理后白色像素点个数;
s1———第一帧整个苹果像素点个数;
s2———第二帧整个苹果像素点个数。

2.4.3 苹果缺陷
苹果在生长、采摘和运输过程中受天气、病害、虫害和碰伤等伤害产生疤痕。苹果果锈是一种比较常见的苹果病害,特别是在中小果园种植的红富士苹果中最为常见,故将疤痕和果锈特征参数作为苹果缺陷的判定依据。由于果梗处的颜色较深,比较容易被判定为疤痕,为了消除此影响,将除果梗处的苹果区域视为感兴趣区域。

为了提取苹果疤痕和果锈特征,首先将采集到的苹果图像由RGB空间转换到HSV空间,并且分离出图像的H(色相)、S(饱和度)和V(亮度)通道图像。
由图6、7可知,苹果的疤痕和果锈的亮度较暗,故根据苹果HSV图像的亮度值对苹果的疤痕和果锈进行特征提取。通过分析疤痕和果锈图像特点,将感兴趣区域中像素点在V∈(120~140)的区域视为疤痕区域,V∈(150~180)的区域视为果锈区域。按式(9)计算苹果疤痕和果锈。
在这里插入图片描述
式中:
S———疤痕面积,cm2;
G———果锈面积,cm2;
n1———V∈(120~140)像素点个数;
n2———V∈(150~180)像素点个数。

1.5 苹果分级
由于SVM算法在小样本训练集上的分类效果相比于其他分类算法有较好的表现,可以提高模型的泛化能力,能够处理高维空间的数据,故选择SVM算法对苹果进行分类。但SVM算法最初是针对二分类问题提出的,并不能直接应用于多分类问题,由于试验将苹果分为多个等级,因此选择多分类SVM分类器对苹果进行分级。

SVM分类器的惩罚参数C与核参数σ对最后的分类结果影响非常大,所以需对其进行优化选取。而粒子群算法有着很好的全局寻优能力,可以有效解决非线性问题,收敛速度快,但容易陷入局部最优,故采用基于改进粒子群算法的SVM决策树的分类方法进行苹果分级工作,可以克服决策树本身对门限敏感和错误传递的缺陷。
对苹果样本进行果径、着色度、疤痕和果锈特征的提取,然后将特征参数送入SVM决策树分级模型,通过分级模型将苹果分为特级果、一级果、二级果和三级果。

⛄二、部分源代码

function varargout = appletest(varargin)
% APPLETEST MATLAB code for appletest.fig
% APPLETEST, by itself, creates a new APPLETEST or raises the existing
% singleton*.
%
% H = APPLETEST returns the handle to a new APPLETEST or the handle to
% the existing singleton*.
%
% APPLETEST(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in APPLETEST.M with the given input arguments.
%
% APPLETEST(‘Property’,‘Value’,…) creates a new APPLETEST or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before appletest_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to appletest_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 appletest

% Last Modified by GUIDE v2.5 19-Oct-2019 20:28:04

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @appletest_OpeningFcn, …
‘gui_OutputFcn’, @appletest_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 appletest is made visible.
function appletest_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 appletest (see VARARGIN)

% Choose default command line output for appletest
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes appletest wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = appletest_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)
[filename,pathname]=uigetfile({‘.’;‘.bmp’;'.jpg’;‘.tif’;'.jpg’},‘选择图像’);

image=[pathname,filename];%合成路径+文件名

im=imread(image);%读取图像

im=im2double(im);

axes(handles.axes1);

imshow(im);%在坐标axes1显示原图像

title(‘原始图像’);

handles.X1=im;

guidata(hObject,handles);

% — Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,‘String’)) returns popupmenu1 contents as cell array
% contents{get(hObject,‘Value’)} returns selected item from popupmenu1
Val=get(hObject,‘Value’)

strl=get(hObject,‘string’)

switch strl{Val};

case '   面积'
    
    
    x1=handles.X1;
    
    w=rgb2gray(x1);
    
    L=medfilt2(w);
    
    level=graythresh(L);
    
    bw=im2bw(L,level);
    
    bw=imfill(~bw,'holes');
    
    axes(handles.axes2);
    
    imshow(bw);
    
    title('面积图像');
    
    strNC=[num2str(bwarea(bw))];
    
    set(handles.text9,'string',strNC);
    strNC1=('一级果');
    strNC2=('二级果');
    strNC3=('三级果');
    if bwarea(bw)>30000
        set(handles.text14,'string',strNC1);
    else if bwarea(bw)>1000&&bwarea(bw)<30000
            set(handles.text14,'string',strNC2);
        else
            set(handles.text14 ,'string',strNC3);
        end
    end
    
    %     strNC1=('无');
    
    %     set(handles.text14,'string',strNC1);
case'   颜色'
    
    
    x1=handles.X1;
    
    hv=rgb2hsv(x1);
    
    H=hv(:,:,1);
    
    S=hv(:,:,2);
    
    V=hv(:,:,3);
    
    axes(handles.axes3);
    
    imshow(H)
    
    title('H分量图像');
    
    level=graythresh(x1);
    
    apple=im2bw(x1,level);
    
    count=length(x1);
    
    for i=1:count
        
        red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));
        
    end
    r=red_ratio;
    strNC=[num2str(red_ratio*100),'%'];
    
    set(handles.text10,'string',strNC);
    
    strNC1=('一级果');
    strNC2=('二级果');
    strNC3=('三级果');
    if r>1
        set(handles.text15,'string',strNC1);
    else if r>0.8&&r<1
            set(handles.text15,'string',strNC2);
        else
            set(handles.text15 ,'string',strNC3);
        end
    end
case'   圆形度'
    
    
    x1=handles.X1;
    
    I2=rgb2gray(x1);
    
    J=im2bw(I2,0.75);
    
    I=~J;
    
    %====形态特征值计算===%
    l=bwlabel(I,8);
    
    [l,num]=bwlabel(I,8);
    
    STATS=regionprops(l,'Area');
    
    A=STATS.Area;
    
    STATS=regionprops(l,'Perimeter');
    
    L=STATS.Perimeter
    
    C=(4.*pi.*A)./(L.*L); % 计算圆度
    
    % L为周长,A为面积,C为圆形度
    
    strNC=[num2str(C)];
    
    set(handles.text12,'string',strNC);
    
    strNC1=('一级果');
    strNC2=('二级果');
    strNC3=('三级果');
    if C>0.65
        set(handles.text17,'string',strNC1);
    else if C>0.55&&C<0.65
            set(handles.text17,'string',strNC2);
        else
            set(handles.text17,'string',strNC3);
        end
    end
case'   表面缺陷'
    
    
    x1=handles.X1;
    
    w=rgb2gray(x1);
    
    L=medfilt2(w);
    
    level=graythresh(L);
    
    bw=im2bw(L,level);
    
    
    X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域
    
    axes(handles.axes4);
    
    imshow(X)
    
    title('缺陷图像');
    
    Q=(bwarea(X)/bwarea(~bw)*100)
    q=num2str(bwarea(X)/bwarea(~bw)*100)
    strNC=[q,'%'];
    
    set(handles.text11,'string',strNC);
    
    strNC1=('一级果');
    strNC2=('二级果');
    strNC3=('三级果');
    if Q<0.1
        set(handles.text16,'string',strNC1);
    else if Q>0.1&&Q<0.2
            set(handles.text16,'string',strNC2);
        else
            set(handles.text16,'string',strNC3);
        end
    end

end
guidata(hObject, handles);
% — Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]任龙龙,冯涛,翟传龙,宋月鹏.基于MATLAB图像处理的苹果大小、颜色、圆形度及缺陷度特征融合分级研究[J].数字技术与应用. 2021,39(07)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm+Vue计算机毕业设计校园学生体温管理系统(程序+LW文档)

ssmVue计算机毕业设计校园学生体温管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

Linux 设备驱动

驱动编译要用到kernel的Makefile文件 — — 也就是源码树的编译系统。因此&#xff0c;源码需要被配置和编译&#xff0c;以ubuntu自带的源码为例&#xff1a; 编译外部模块(.ko)的编译命令是&#xff1a; make -C Mmak**e−Cpathtokernelsrc>MPWD 也就是进入到kernel目录&a…

oracle经典习题(一)

oracle经典习题(一) 1.显示与BLAKE在同一部门工作的雇员的姓名、工作和入职日期&#xff0c;但是BLAKE不包含在内 1.1 示例sql语句 SELECT ename,job,hiredate FROM emp WHERE deptno(SELECT deptno FROM emp WHERE enameBLAKE) AND ename <> BLAKE1.2 运行截图 2.显示…

vpp hash源码分析

概述 vpp的hash结构分为hash头、桶&#xff08;_hash_create或hash_resize申请&#xff09;和桶下元素&#xff08;clib_mem_realloc申请&#xff09;&#xff0c;总共3个部分组成。 根据元素key的hash值不同&#xff0c;分配到不同的桶下&#xff0c;与其他hash表原理相同。 …

Python利用pandas处理Excel数据的应用

最近迷上了高效处理数据的pandas&#xff0c;其实这个是用来做数据分析的&#xff0c;如果你是做大数据分析和测试的&#xff0c;那么这个是非常的有用的&#xff01;&#xff01;但是其实我们平时在做自动化测试的时候&#xff0c;如果涉及到数据的读取和存储&#xff0c;那么…

二叉树5:二叉树层序遍历

学会二叉树的层序遍历&#xff0c;可以一口气打完以下十题&#xff1a; 强烈建议大家和我一样&#xff0c;先看一下第一道题&#xff0c;大家可以去看看卡哥的哔站视频&#xff0c;理解透。然后后面的九道题自己先动手做一下&#xff0c;别急着看答案&#xff0c;真心不难&…

Git流程规范

开发新功能 1、从master拉一个功能分支&#xff0c;取名为某个版本下的某个产品功能 4.3/精确发券 2、当功能开发好了&#xff0c;合并分支到dev进行联调 3、如果是俩个关联性的分支&#xff0c;应该把分支合并到另外一个分支&#xff0c;在合并到dev分支中。如图。feature3…

【学习笔记01】vue的了解和指令

一、什么是 Vue&#xff1f; Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的JavaScript框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 二、Vue的两个核心功…

Day831.局部变量为什么是线程安全的 -Java 并发编程实战

局部变量为什么是线程安全的 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于局部变量为什么是线程安全的。 一遍一遍重复再重复地讲到&#xff0c;多个线程同时访问共享变量的时候&#xff0c;会导致并发问题。 那在 Java 语言里&#xff0c;是不是所有变量都是共…

【java设计】:全民飞机大战小游戏制作

文章目录 前言 一、全民飞机大战 二、计划安排 三、源码图和类图展示

CTF Android逆向 -- KGB Messenger APK文件结构介绍,破解账户与密码,静态分析,修改并构建APK,逆向算法,APK文件签名

前言 一次练习Android逆向的记录&#xff0c;写得很详细&#xff0c;有什么没有理解的地方可以私信 csdn不让我加外链&#xff0c;所以将链接前面的#号去掉即可 题目&#xff1a; ht#tps://github.com/tlamb96/kgb_messenger在这个挑战中&#xff0c;一共有三个flag&#x…

UE4 Pak打包、挂载、加载

首先&#xff0c;必须得明确的一点就是如果想要加载Pak内资源&#xff0c;那么这些资源必须是经过Cook的。如果打包的是未Cook的资源&#xff0c;那么即使Pak挂载成功&#xff0c;也不可能会成功加载Pak内资源。 不知道怎么生成Cook资源&#xff0c;可以看我前一篇 ​​​​​…

持之以恒,方得始终|海联捷讯的六年数字化历程

企业数字化已经成为了企业家与管理者的共识。如何实现数字化转型&#xff0c;从认知到战略&#xff0c;上至组织文化&#xff0c;下至每个组织成员的行为&#xff0c;都需要做出改变——它本质上是一种创新的企业管理模式和运营机制&#xff0c;重要性不言而喻。而降本增效也是…

学习->C++篇十七:C++的类型转换和IO流

目录 一.类型转换 1.C语言中的类型转换 2.C中的类型转换 二.IO流 1. C语言的输入与输出 2. 流是什么 3. stringstream 一.类型转换 1.C语言中的类型转换 &#xff08;1&#xff09;隐式类型转换&#xff0c;编译阶段自动进行&#xff0c;不能转换就编译报错。&#xff…

TCP/IP四层协议

七层模型层数太多记不住&#xff0c;四层模型 应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;网络接口层的名字必须记得滚瓜烂熟。&#xff08;重点也是tcp/ip四层模型&#xff09; 四层模型&#xff1a; 1.应用层&#xff1a; 两台终端设备上的应用程序 应该遵守…

三面美团 Java 岗,HR 现场直接发 offer,他是横着走出来的

前情提要 这是一个发生在我朋友身上的真实事情&#xff1a; 这里就叫他程序员 Y 吧。 程序员 Y 工作不到两年&#xff0c;周末在朋友圈发了个喜报&#xff0c;准备入职美团。 之后&#xff0c;我就带着祝福跟 Y 聊了许久&#xff0c;聊天的内容就是具体了解一下他面试的过程…

技术分享之IntelliJ plugin

资料 https://zhaojian.blog.csdn.net/article/details/127882946 Plugin Configuration File https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html 今天分享的主要内容: 了解插件能够做什么 如何开发一个插件 阅读两个常用的插件源码 intellij的窗…

15.Django大型电商项目之创建模型与sql表反向生成模型

1.用户模块模型类创建 1.1 创建用户的子应用 python .\manage.py startapp userapp在settings中挂载子应用 创建子应用urls.py 在主应用中加入子应用的urls.py 1.2 创建表 如何在直接导入sql文件形成表&#xff0c;这里就直接在navicate中把sql文件拖进去点击开始即可 这里…

大数据技术系列:图解大数据平台开发

导言 在前面的文章《「大数据技术体系」学习实践导览》中&#xff0c;概要式的梳理了大数据平台的业务目标&#xff0c;大数据平台的架构框架&#xff0c;大数据平台中常用的技术及工具&#xff0c;数据治理四方面的内容&#xff0c;算是对自身所了解大数据知识体系的抛砖引玉…

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素)

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素) 前言 百度解析&#xff1a;以环形、回路或轨道运行;沿曲折的路线运行;特指运行一周而回到原处,再转。或说反复地连续做某事。 那么&#xff0c;在程序中依然是连续重复的按照一定的规则去执行某事。 程序计数器…