基于matlab实现的水果识别系统+源码+代码注释

news2025/2/26 22:06:00

水果识别

摘要:

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。

关键字:水果识别、MATLAB、数字图像处理

一、设计方案

在计算机中,图像由像素逐点描述,每个像素点都有一个明确的位置和色彩数值。使用 Matlab 软件读取图像,以矩阵形式存放图像数据,其扫描规则是从左向右,从上到下。

对于一副水果图像为了处理方便,我们首先要把彩色图像转化为灰度图像。然后对图像进行二值化处理来获得每个水果的区域特征。

在水果与背景接触处二值化会导致图像边缘部分有断裂,毛躁的部分。所以采用边缘提取以弥补断裂的边缘部分,然后基于数学形态算子对图像进行去除断边,图像填充等必要的后续处理。经过图像分割后,水果和背景很明显地被区分开来,然后需要对每种水果的特征进行提取。

先对图像进行标签化,所谓图像的标签化是指对图像中互相连通的所有像素赋予同样的标号。经过标签化处理就能把各个连通区域进行分离,从而可以研究它们的特征。

二、关键技术

(一)图像二值化

1、灰度化

% 将真彩色图像 i 转化为灰度图像 I
I=rgb2gray(i); 

在 RGB 模型中,如果 R=G=B 时,则彩色表示一种灰度颜色,其中 R=G=B 的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。

2、二值化

% level 为阈(yu) 值,取值从0到1.
% 本项目考虑到图片背景颜色为白色,亮度较大,因此选取 `level=0.9` 来实现二值化。
I=im2bw(i,level)

一幅图像包含目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最经常使用的方法就是设定一个全局的阈值 T,用 T 将图像的数据分成两部分:大于 T 的像素群和小于 T 的像素群。将大于 T 的像素群的像素值设定为白色(或者黑色),小于 T 的像素群的像素值设定为黑色(或者白色)。

比方:计算每个像素的(R+G+B)/3,假设>127,则设置该像素为白色,即R=G=B=255;否则设置为黑色,即R=G=B=0。

(二)边缘提取

1、开运算

I=imopen(i,SE);

先腐蚀后膨胀的过程称为开运算。(看上去把细微连在一起的两块目标分开了)

开运算作用:可以使边界平滑,消除细小的尖刺,断开窄小的连接,保持面积大小不变等。

I=imerode(i,SE);

腐蚀运算作用:消除物体边界点,使边界点向内部收缩,可以把小于结构元素的物体去除。

膨胀的作用:将与物体接触的所有背景点合并到物体中,是目标增大,可填补目标中的空洞。

2、数学形态学运算

% bwmorph 函数是对图像进行指定的形态学操作。
% ‘remove’即代表如果一个像素点的4邻域都为1, 则该像素点将被置0;该选项将导致边界像素上的1被保留下来。
I=bwmorph(i,'remove');

提取图像种水果的边界用于标记各个区域

(三)水果分类

1、获得连通区域的属性

这里要用到了在 Matlab 图像处理工具箱中非常重要的一个图像分析函数:regionprops.

顾名思义:它的用途是 get the properties of region ,即用来度量图像区域属性的函数.

STATS =regionprops(L,properties)

描述测量标注矩阵L中每一个标注区域的一系列属性.L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推.

此函数用来获取每个水果的中心位置,及其外接椭圆的长,短轴长度。中心位置用来计算水果的颜色特征值及最终显示水果名称。外接椭圆的长,短轴长度用来计算水果的似圆性特征,以判断其大致形状。

2、获取特征并判别函数

本项目根据水果在图像中表现出来的特点,从面积特征,似圆性特征,颜色(rgb值和hsv值)特征对图像中的桃子、苹果、香蕉 、西瓜、菠萝、梨子等进行特征提取。最后按照筛选出来的特征对水果进行分类识别。

(1)颜色特征

本项目使用两种计量方式来测得水果的颜色值。

RGB颜色模式

对于彩色图像,可分解为 RGB 三幅单色图像。每一副图像中的像素分布情况都代表了改颜色的程度信息。根据常识可知上述6种水果中苹果和桃子的红色含量要比其他水果丰富的多,西瓜的红色含量最小。

Hsv颜色模式

这个模型中颜色的参数分别是:色彩(H),纯度(S),明度(V)。 HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。

  • H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。

  • 纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。

  • V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。

(2)似圆性特征

似圆性是在计算出每块连通区域的外接椭圆的短轴长度和长轴长度,来测量水果形状的似圆性。我们用长轴长度除以短轴长度得到一个比例。这个值与1越接近,说明水果与圆越相似。同理,该值越比1大,说明水果越不像圆。根据常识可知,上述6个水果中西瓜,苹果,桃子似圆性很高,而香蕉,菠萝似圆性最低。

(3)面积特征

经过标签化的不同区域的面积,可以用该区域像素数量来计算。对整幅图像进行扫描,计算所有连通区域的面积。根据常识可知:西瓜在上述6个水果中面积是最大的一个,菠萝其次。

3、特征统计表格

原始图像1

原始图像1梨子苹果桃子香蕉菠萝
r0.940.800.721.040.55
g0.810.170.190.850.56
b0.280.060.130.530.47
Hsv均值0.110.20.50.160.26
面积26712224193636043361
似圆性1.61.11.071.781.55

原始图像2

原始图像2香蕉桃子梨子西瓜苹果
r1.031.010.90.291.01
g0.950.990.730.380.99
b0.201.00.350.221.00
Hsv值0.140.250.110.290.89
面积21911572138729141443
似圆性2.21.01.61.01.03

原始图像3

原始图像3苹果桃子西瓜香蕉梨子
r0.861.070.200.921.02
g0.191.060.530.311.00
b0.221.060.300.260.95
Hsv值0.630.260.390.120.108
面积11901660232818941082
似圆性1.121.061.132.161.6921

4、特征选择及最终结果图

梨子

梨子的hsv值是最小的,且因为梨子有柄的关系,梨子的似圆性在1.4至1.6之间,梨子的r值和g值都普遍大于0.6;

苹果

苹果的似圆性在1至1.1之间,苹果红的色素较多,蓝色和绿色色素较少使得其g值和b值都普遍小于0.4;

桃子

似圆性在1至1.2之间,hsv的值小于0.6,红色色素较多使得其r值至少为0.7;

香蕉

香蕉的似圆性数值是最大的至少为1.8,且其成黄色,其hsv的值都小于0.2;

菠萝

菠萝的似圆性数值仅次于香蕉为第二大,其hsv值都小于0.3,且其红色色素少r值都小于0.7;

西瓜

西瓜的面积是所有水果中最大的,且其红色色素较少r值都小于0.4,,似圆性在1至1.2之间;

根据水果在图像中表现出来的特点,从面积特征,似圆性特征,颜色(rgb值和hsv值)特征对图像中的桃子、苹果、香蕉、西瓜、菠萝、梨子等进行特征提取。最后按照筛选出来的特征对水果进行分类识别。

识别结果图如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhEkinEh-1673613424189)(null)]

图2的识别结果图

图3的识别结果图

三、完整源码

源码下载

https://download.csdn.net/download/DeepLearning_/87383404

四、结论

总的来说水果识别良好,识别较为准确。对于偏亮和偏暗的图像,由于项目同时采用了hsv模型和rgb模型判断,因此图片的亮度对识别没有太大影响,识别率还算理想。但是正是由于获取颜色特征时同时采用hsv模型和rgb模型的值判断,导致去噪参数不能太大,待识别图片出现较多噪声的情况下识别不是太理想,因此有些识别存在误差。

而如果放弃使用hsv模型或者rgb模型中的一个,则能较好进行去除噪声,但是这样颜色特征有少了一样,对于偏亮和偏暗的图像,颜色判定时会有误差,这是没有解决好的一个主要问题。

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

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

相关文章

仅需一个注解,实现springboot项目中的隐私数据脱敏

文章参考: 仅是为了方便查看,因此在此记录一下​​​​​​​ 目录 1. 创建隐私数据类型枚举:PrivacyTypeEnum 2. 创建自定义隐私注解:PrivacyEncrypt 3. 创建自定义序列化器:PrivacySerializer 4. 隐私数据隐藏工…

高德地图开发之地图配置及vue上初始化创建地图

开门见山地说,现如今地图相关的开发业务在工作中越来越常见,目前市面上主流的地图开发还是以百度和高德为主,今天就来讲一下高德地图的配置和在vue上的初始化创建,帮助大家更好更快的了解高德地图开发相关的内容。 一. 注册地图 …

Python协程的四种实现方式

今天继续给大家介绍Python关知识,本文主要内容是Python协程的四种实现方式。 一、yield关键字实现方式 以yield关键字方式实现协程代码如下所示: def fun1():yield 1yield from fun2()yield 2def fun2():yield 3yield 4f1fun1() for item in f1:print…

steam搬砖项目靠谱吗?怎么样?

Steam搬砖’通俗来讲:小白都可以轻松上手,不需要会玩游戏,项目就是利用低价美金充值卡,从国外Steam平台购买CS:GO游戏装备回来,在国内网易BUFF平台售卖,低买高卖,产生利润的一个项目 首先&…

javascript实现版本号自增打包vue写入版本号

文章目录Preface代码方法一:兼容多长版本号。如:1.0.0.0.0.0方法二:只针对3位版本号打包时写入版本号Preface 前段时间出差去帮忙别的项目,项目中有前端更新提醒用户更新。 更新提示是放在了axios请求中。 这个需求是别人做的&…

再学C语言34:数组

数组(array)由一系列类型相同的元素构成 数组的声明:包括数组元素的数目和元素的类型,编译器根据这些信息创建合数的数组,数组元素可以具有同普通变量一样的类型: int main(void) {int a[5]; // 包含5…

ESP32-C3 迷你智能语音照明

一、概述二、硬件原理图设计三、硬件PCB软件设计四、软件设计五、结构设计六、总结一、概述本设计是使用ESP32-C3芯片,结合TP4057锂电池充电管理芯片、SIQ-02FVS3旋转编码器、离线语音识别模块、无源蜂鸣器、TYPE-C接口设计的一款迷你智能照明产品。功能特点&#x…

vue组件传值方式有哪些

Vue 作为一个轻量级的前端框架,核心两大特性就是响应式编程和组件化。 本文针对组件之间传值做详细讲解。 Vue就是由一个一个的组件构成的,组件化是它的精髓,也是最强大的功能之一。而组件实例的作用域是相互独立的,这就意味着不…

priority_queue 接口使用(仿函数、函数指针解决优先级队列存放自定义类型元素、指针类型元素)

一、priority_queue 优先队列本质就是 堆 堆&#xff1a; 完全二叉树&#xff0c;任意结点比其孩子结点小->小根堆, 任意结点比其孩子结点大->大根堆, 头文件包含&#xff1a;#include<queue> 二、优先级队列的模板参数列表&#xff1a; template <class …

钓鱼邮件有哪些特征?

钓鱼邮件以其极具迷惑的特性&#xff0c;让很多人都上当受骗。一般的钓鱼邮件都有哪些特征呢&#xff1f; 1、一般像邮件中带有链接很可能是钓鱼邮件&#xff0c;收到不明邮件不要打开&#xff0c;更不能点击不明链接。 2、邮件中携带可疑附件&#xff0c;并且邮件正文具有引导…

Unity——新输入系统Input System

1.安装 安装&#xff1a; 直接到包管理器Window > Package Manager安装即可&#xff0c;安装后提示需要重启&#xff0c;重启后即可使用。 注意&#xff1a; 在Project Settings中的Player设置里将Active Input Handling设置为Input System。 需要将默认场景中的EventSyst…

线程安全☞有序性

什么是有序性&#xff1f; 在开发中&#xff0c;我们通常按照从上到下的顺序编写程序指令&#xff0c;并且希望cpu和编译器按照我们预先编写的顺序去执。但往往cpu和编译器为了提高性能、优化指令的执行顺序&#xff0c;会将我们编写好的程序指令进行重排序。 此时如果是在单…

如何将as代码上传到Gitee

一、Git的安装 1.这个直接到官网上下载&#xff0c;不多说了。Git - Downloads (git-scm.com) 2.在AS中添加Git的位置 二、AS中Gitee插件的安装 ⒈点击File中的Settings 2.安装插件 三.Gitee中账号的注册以及相关操作 1.注册账号 2.新建仓库 3. 在插件中注册Gitee账号 注…

声音经济@2023: 「夹缝」求生,「希望」不远

【潮汐商业评论/ 原创】“明明很困&#xff0c;但怎么也睡不着了。”Andy如是说。每每此刻&#xff0c;Andy便轻车熟路地拿起身旁的手机&#xff0c;随机打开音频APP&#xff0c;或是广播剧&#xff0c;或是播客节目&#xff0c;亦或是音乐和相声。伴随着声音的“催眠”&#x…

Cadence PCB仿真使用Allegro PCB SI元器件模型配置DevicesModels使用默认参数配置方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI元器件模型配置DevicesModels使用默认参数配置的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是A…

将微信小程序转换uniapp进行迁移的步骤以及遇到的问题总结

目录 前言 一、迁移步骤 第一步&#xff1a;安装miniprogram-to-uniapp 插件 第二步&#xff1a;查看是否安装成功 第三步&#xff1a;使用插件进行转换 第四步&#xff1a;使用hbuilder X运行转换后的项目并在微信小程序编辑器查看 第五步&#xff1a;调试修改 二、处…

黑马学ElasticSearch(九)

目录&#xff1a; &#xff08;1&#xff09;数据聚合-聚合的分类 &#xff08;2&#xff09;数据聚合-DSL实现Bucket聚合 &#xff08;3&#xff09; 数据聚合-DSL实现Metrics聚合 &#xff08;4&#xff09;数据聚合-RestClient实现聚合 &#xff08;5&#xff09;数据聚…

重复生成数据itertools.repeat()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】 【Python-数据分析】 重复生成数据 itertools.repeat() [太阳]选择题 以下python代码结果错误的一项是? import itertools print("【执行】xitertools.repeat(abc,3)") xitertools.repeat(abc,3) print…

xml中xsd/xsi/xsl/xmlns的区别和联系

&#xff08;2023.01.13Fri才明白&#xff0c;具体解析xml文件的不是xml文件本身&#xff0c;xsi也不是在解析xml文件&#xff0c;只是检验xml文件是否符合标准&#xff0c;xsd是在限制xml文件的内容。而具体解析某个element究竟是什么样式、起到什么作用&#xff0c;是需要接收…

可信AI年度观察 | 生成式AI技术及产品快速迭代,生成内容质量及安全性仍需提升

自2021年起&#xff0c;生成式人工智能&#xff08;以下简称“生成式AI”&#xff09;连续两年入选Gartner《Hype Cycle for Artificial Intelligence》&#xff0c;被认为是未来重要的AI技术趋势。2022年以来&#xff0c;生成式AI产品不断涌现&#xff0c;生成内容模态多样&am…