基于数字图像的水果边缘检测方法研究
1绪论
1.1课题研究的背景
我国水果品种繁多,资源丰富。作为一项新兴产业,在农业和农村经济发展中的地位已经十分重要,在很多地区己成为农村经济的支柱产业。纵观 世界水果园科技的发展, 二十一世纪我国的水果园也将从传统作业转化到以现代科学技术为基础的现代“集约持续水果园”上来。水果园的发展将全面地体现生产、经济、技术、社会和生态的可持续性。在水果分级方面,我国相继引进和开发了按大小和重量分级的分级 设备,近几年国内也出现了基于机器视觉技术的水果分级设备。但是,进口设备价格昂 贵,一般水果生产企业难以负担。而国产设备由于技术投入不够,与国外先进设备差距 比较大。
但是,进口设备价格昂贵,一般水果生产企业难以负担。而国产设备由于技术投入不够,与国外先进设备差距 比较大。随着机器视觉技术的发展,国外也出现了将机器视觉运用在水果分级系统上的 相关研究,使得国外的水果分级分类系统的性能进一步提高,同时也进一步拉大了我国在水果生产自动化的技术差距。由于我国的现状,如果不在水果产后处理上下功夫,我国的水果出口形势还会非常严峻,这就要求国内的研究者在水果分级技术进一步钻研,使我国的分级技术再上一个新台阶。将机器视觉(也称计算机视觉,图像处理) 技术引入水果园自动化,是解决该问题的有效途径之一。同时,基于机器视觉的水果自动化系统在水果流通过程也可提高自动化程度、降低劳动强度、增加收益提供快速、准确的检测手段。
1.2选题的目的和意义
上世纪 80年代后期,由于计算机广泛生产,计算技术也广泛发展,针对于计算机 视觉在各个领域的的研究成果也日新月异。 国外的很多学者在基于计算机视觉技术而提 高水果的分级速度方面进行了研究,在理论和应用上有了较大进展,并取得了很好的经 济效益。而我国的水果自动识别技术研究则较晚,仅始于 90年代,而且当时从事水果 自动分级系统研究的科研院还很少,研究成果也不是很显著,但那却为我国在水果分级 方面的研究奠定了基础。
按大小分类是水果识别的一个重要指标。 应义斌研究了利用机器视觉技术精确检测 水果尺寸方法 技术精确检测 水果尺寸方法针对水果的外形特征, 应用水果的最小外接矩形 (MER)的尺寸表示横径和纵径,取得了较为理想的结果 用傅立叶半径描述的 方法测量水果的大小,以水果的自然对称形态特征为依据,水果大小检 测绝对测量误差最大为3mm。
水果形状是水果品质检测与分级的一个重要指标,利用图像形 态学方法测量水果的形状,准确率很高,最高能达到 91.4%[6]。提出主要 通过半径这个指标,利用人工神经网络对水果的形状进行识别和分级 采用傅立叶变换与傅立叶反变换对来描述水果的形状 [8]。颜色也是水果检测的重要指标。 通过对不同颜色等级颜色也是水果检测的重要指标。 通过对不同颜色等级的水果进行分析, 进而对水果进行分级 [9]。通过机器视觉自动检测水果表面着色度,获取 彩色图像,并将 RGB 值转换成 HSI 值,用合适色相值累计着色面积百分比进行颜色分 级 [10]。确定了水果颜色特征的提取方法,利用遗传算法实现了多层前向 神经网络识别器的学习设计 [11]。
在国外,机器视觉是 70年代开始兴起的,它主要应用于卫星遥感和医学方面。它 不仅是人眼的延伸, 而且具有人脑的部分智能识别功能 , 具有速度快、 信息量大、 功能多、 检测精度和效率高等优点。 随着计算机、 控制理论、 模式识别、 人工智能等技术的发展, 机器视觉已广泛应用于军事技术、 科学研究、 医疗卫生、 工农业生产、
科学研究、 医疗卫生、 工农业生产、 信息技术等领域。 国外在利用机器视觉技术进行水果分类和计数已经取得较大的进展, 国内尚处于探索阶 段。目前,国外已研制出了商用水果自动化系统,并在生产上得到了应用。
1.3课题主要研究内容
(1)本文首先介绍了课题的研究背景及意义,对国内的水果识别方面的研究应用 现状进行了讨论,用苹果作为参考物进行研究,并重点对国内外水果分级技术研究现状进行了分析。
(2)介绍了一些机器视觉领域基础的方法, 提出了针对特定颜色的图像灰度化方法。
(3)讨论了水果图像的预处理过程:小波去噪、中值滤波以及水果边界提取。利用 小波去噪和中值滤波相结
(4)讨论了水果图像的背景分割,针对水果识别生产线的实际情况,对几种不同的 微分梯度算子进行边缘检测实验并对结果进行了对比分析。
(5)基于形态学的腐蚀与重构最大化地从背景中分离出目标区域。
(6)通过改进的分水岭算法分割图像并计数。
运行环境主要介绍了硬件环境和软件环境。
(1) 硬件环境
① 处理器:英特尔至强 E3
② 内存:8G
③ 硬盘空间:1TB
④ 显卡:英伟达 GTX770
操作系统:Window 98/ME/2000/XP/win7/win8/win8.1
开发环境主要介绍了本系统采用的操作系统、开发语言。
(1) 操作系统:Windows 8.1
(2) 开发语言:C
(3) 开发环境:MATLAB 2013
1.4MATLAB简介
在科学研究和工程应用中,往往要进行大量的数学计算,其中包括矩阵运算。这些运算一般来说难以用手工精确和快捷地进行,而要借助计算机编制相应的程序做近似计算。目前流行用Basic、Fortran和C语言编制计算程序,既需要对有关算法有深刻的了解,还需要熟练地掌握所用语言的语法及编程技巧。对多数科学工作者而言,同时具备这两方面技能有一定困难。通常,编制程序也是繁杂的,不仅消耗人力与物力,而且影响工作进程和效率。为克服上述困难,美国Mathwork公司于1967年推出了“Matrix Laboratory”(缩写为Matlab)软件包,并不断更新和扩充。目前最新的5.x版本(windows环境)是一种功能强、效率高便于进行科学和工程计算的交互式软件包。其中包括:一般数值分析、矩阵运算、数字信号处理、建模和系统控制和优化等应用程序,并集应用程序和图形于一体便于使用的集成环境中。在此环境下所解问题的Matlab语言表述形式和其数学表达形式相同,不需要按传统的方法编程。不过,Matlab作为一种新的计算机语言,要想运用自如,充分发挥它的威力,也需先系统地学习它。但由于使用Matlab编程运算与人进行科学计算的思路和表达方式完全一致,所以不象学习其它高级语言——如Basic、Fortran和C等那样难于掌握[16]。实践证明,你可在几十分钟的时间内学会Matlab的基础知识,在短短几个小时的使用中就能初步掌握它.从而使你能够进行高效率和富有创造性的计算。Matlab大大降低了对使用者的数学基础和计算机语言知识的要求,而且编程效率和计算效率极高,还可在计算机上直接输出结果和精美的图形拷贝,所以它的确为一高效的科研助手。自推出后即风行美国,流传世界[17]。 综上所述,Matlab语言有如下特点:
(1)编程效率高 它是一种面向科学与工程计算的高级语言,允许用数学形式的语言编写程序,且比Basic、Fortran和C等语言更加接近书写计算公式的思维方式,用Matlab编写程序犹如在演算纸上排列出公式与求解问题。因此,Matlab语言也可通俗地称为演算纸式科学算法语言由于它编写简单,所以编程效率高,易学易懂。
(2)用户使用方便 Matlab语言是一种解释执行的语言(在没被专门的工具编译之前),它灵活、方便,其调试程序手段丰富,调试速度快,需要学习时间少。人们用任何一种语言编写程序和调试程序一般都要经过四个步骤:编辑、编译、连接以及执行和调试。各个步骤之间是顺序关系,编程的过程就是在它们之间作瀑布型的循环。Matlab语言与其它语言相比,较好地解决了上述问题,把编辑、编译、连接和执行融为一体。它能在同一画面上进行灵活操作快速排除输入程序中的书写错误、语法错误以至语意错误,从而加快了用户编写、修改和调试程序的速度,可以说在编程和调试过程中它是一种比VB还要简单的语言。 具体地说,Matlab运行时,如直接在命令行输入Mailab语句(命令),包括调用M文件的语句,每输入一条语句,就立即对其进行处理,完成绩译、连接和运行的全过程。又如,将Matlab源程序编辑为M文件,由于Mat1ab磁盘文件也是M文件,所以编辑后的源文件就可直接运行,而不需进行编译。
和连接。在运行M文件时,如果有错,计算机屏幕上会给出详细的出锗信息,用户经修改后再执行,直到正确为止。所以可以说,Mat1ab语言不仅是一种语言,广义上讲是一种该语言开发系统,即语言调试系统。
(3)扩充能力强高版本的Matlab语言有丰富的库函数,在进行复杂的数学运算时可以直接调用,而且Matlab的库函数同用户文件在形成上一样,所以用户文件也可作为Matlab的库函数来调用。因而,用户可以根据自己的需要方便地建立和扩充新的库函数,以便提高Matlab使用效率和扩充它的功能。另外,为了充分利用Fortran、C等语言的资源,包括用户已编好的Fortran,C语言程序,通过建立Me调文件的形式,混合编程,方便地调用有关的Fortran,C语言的子程序。
(4)语句简单,内涵丰富 Mat1ab语言中最基本最重要的成分是函数,其一般形式为[a,b,c……]=fun(d,e,f,……),即一个函数由函数名,输入变量d,e,f,……和输出变量a,b,c……组成,同一函数名F,不同数目的输入变量(包括无输入变量)及不同数目的输出变量,代表着不同的含义(有点像面向对象中的多态性。这不仅使Matlab的库函数功能更丰富,而大大减少了需要的磁盘空间,使得Matlab编写的M文件简单、短小而高效。
(5)高效方便的矩阵和数组运算 Matlab语言象Basic、Fortran和C语言一样规定了矩阵的算术运算符、关系运算符、逻辑运算符、条件运算符及赋值运算符,而且这些运算符大部分可以毫无改变地照搬到数组间的运算,有些如算术运算符只要增加“·”就可用于数组间的运算,另外,它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时,显得大为简捷、高效、方便,这是其它高级语言所不能比拟的。在此基础上,高版本的Matlab已逐步扩展到科学及工程计算的其它领域。因此,不久的将来,它一定能名符其实地成为“万能演算纸式的”科学算法语言。
(6)方便的绘图功能 Matlab的绘图是十分方便的,它有一系列绘图函数(命令),例如线性坐标、对数坐标,半对数坐标及极坐标,均只需调用不同的绘图函数(命令),在图上标出图题、XY轴标注,格(栅)绘制也只需调用相应的命令,简单易行。另外,在调用绘图函数时调整自变量可绘出不变颜色的点、线、复线或多重线。这种为科学研究着想的设计是通用的编程语言所不及的。 总之,Matlab语言的设计思想可以说代表了当前计算机高级语言的发展方向,在不断使用中,人们会发现它的巨大潜力[18]。
1.5MATLAB和图像处理工具箱的背景知识
MATLAB对于技术计算来说是一种高性能语言。它以易于应用的环境集成了计算、可视化的编程,在该环境下,问题及其解以我们熟悉的数学表示法来表示。典型的应用包括如下方面[4]:
(1)数学和计算
(2)算法开发
(3)数据获取
(4)建模、模拟和原型设计
(5)数据分析、研究和可视化
(6)科学和工程图形
(7)应用开发,包括图像用户界面构建
MATLAB是一种交互式系统,其基本数据元素是并不要求确定维数的一个数组。这就允许人们用公式化方法求解许多技术计算问题,特别是涉及矩阵表示的问题。有时,MATLAB可调用C或Fortran这类非交互式语言所编写的程序。
在高等院校中,对于数学、工程和科学理论中的入门课程和高级课程,MATLAB都是标准的计算工具。图像处理工具箱是一个MATLAB函数(称为M函数或M文件)集,它扩展了MATLAB解决图像处理问题的能力。其他有时用于补充IPT的工具箱是信号处理、神经网络、模糊逻辑和小波工具箱。
2数字图像边缘检测关于边缘的定义
边缘是不同区域的分界线,是图像局部强度变化最显著的那些像素的集合。图像强度的显著变化可分为:
(1)阶跃变化(函数),即图像强度在不连续处的两边的像素灰度值有着显著差异;
(2)线条(屋顶)变化(函数),即图像强度突然从一个值变化到另一个值,保持一较小行程后又回到原来的值。
边缘主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,边缘是位于两个区域的边界线上的连续像素集合,在边缘处,灰度和结构等信息产生突变。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。
图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈。边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。
2.1基于一阶微分的边缘检测算子
图像的局部边缘定义为两个强度明显不同的区域之间的过渡,图像的梯度函数即图像灰度变化的速率将在这些过度边界上存在最大值,通过基于梯度算子或导数检测器来估计图像灰度变化的梯度方向,增加图像的这些变化区域,然后对该梯度进行阈值运算,如果梯度值大于某个给定门限,则存在边缘。再将被确定为边缘的像素连接起来,以形成包围着区域的封闭曲线。
一阶导数可以用于检测图像中的一个点是否在斜坡上,二阶导数的符号可以用于判断一个边缘点是在边缘亮的一边还是暗的一边。两种常见的边缘一阶导数和二阶导数示意图[5]:
(a) (b)
图2.1 (a)阶跃函数,(b)线条(屋顶)函数(第一行为理论曲线,第二行为实际曲线,第三行对应一阶导数,第四行对应二阶导数)
一阶导数的二维等效式:
(2-1)
2.2 Sobel算子
2.3 Roberts算子(梯度交叉算子)
Roberts算子是一种利用局部差分算子寻找边缘的算子[5]。
(2-6)
0 | 1 |
-1 | 0 |
用模板实现:
1 | 0 |
0 | -1 |
2.4 Prewitt算子
Prewitt提出的类似于Sobel的计算偏微分估计值的方法[7]
(2-9)
(2-10)
1 | 1 | 1 |
0 | 0 | 0 |
-1 | -1 | -1 |
用模板实现:
-1 | 0 | 1 |
-1 | 0 | 1 |
-1 | 0 | 1 |
图2.4 Prewitt算子的模板
2.5 Canny算子
Canny边缘检测利用高斯函数的一阶微分,在噪声抑制和边缘检测之间寻求较好的平衡,其表达式近似于高斯函数的一阶导数。
Canny算子是一阶算子。其方法的实质是用1个准高斯函数作平滑运算fs=f(x,y)×G(x,y),然后以带方向的一阶微分算子定位导数最大值。
在这个2×2正方形内求有限差分的均值,便于在图像中的同一点计算x和y的偏导数梯度。
在这个2×2正方形内求有限差分的均值,便于在图像中的同一点计算x和y的偏导数梯度。幅值和方向角可用直角坐标到极坐标的坐标转化来计算:
M[i,j]反映了图像的边缘强度;∂ [i,j]反映了边缘的方向。使得M[i,j]取得局部最大值的方向角∂ [i,j],就反映了边缘的方向。Canny算子也可用高斯函数的梯度来近似,在理论上很接近4个指数函数的线性组合形成的最佳边缘算子。在实际工作应用中编程较为复杂且运算较慢。Canny边缘检测算子对受加性噪声影响的边缘检测是最优的
2.6 基于二阶微分的边缘检测算子
一阶微分是一种矢量,不但有其大小还有方向,和标量相比,它数据存储量大。另外,在具有相等斜率的宽区域上,有可能将全部区域都当做边缘提取出来。因此,有必要求出斜率的变化率,即对图像函数进行二阶微分运算。
图像强度的二阶导数的零交叉点就是找到的边缘点[7],如图2.5所示:
图2.5 图像函数的二阶微分
2.7 Laplacian算子
Laplacian算子[8]利用二阶导数信息,具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。使得图像经过二阶微分后,在边缘处产生一个陡峭的零交叉点,根据这个对零交叉点判断边缘。拉普拉斯算子是二阶导数的二维等效式:
(2-11)
上式应用Laplacian算子提取边缘的形式,及二阶偏导数的和,是一个标量,其离散计算形式定义为:
(2-12)
同理:
(2-14)
对于一个
的区域,经验上被推荐最多的形式,算子表示为:
(2-15)
2.8 LOG算子
由于梯度算子和拉普拉斯算子都对噪声十分敏感,因而在检测前必须滤除噪声。Marr和Hildreth将高斯滤波和拉普拉斯边缘检测结合在一起,形成LOG(Laplacian-Gauss)算法。LOG边缘检测的基本特征[9]为:
(1)平滑滤波器是高斯滤波器;
(2)增强步骤采用二阶导数(二维拉普拉斯函数);
(3)边缘检测判据是二阶导数零交叉点并对应一阶导数的较大峰值;
(4)使用线性内插方法在子像素分辨率水平上估计边缘的位置。
该算子首先用高斯函数对图像作平滑滤波处理,然后才使用Laplacian算子检测边缘,因此克服了Laplacian算子抗噪声能力比较差的缺点,但是在抑制噪声的同时也可能将原有的比较尖锐的边缘也平滑掉了,造成这些尖锐边缘无法被检测到。
在实际应用中,常用的LOG算子是
的模板:
-2 | -4 | -4 | -4 | -2 |
-4 | 0 | 8 | 0 | -4 |
-4 | 8 | 24 | 8 | -4 |
-4 | 0 | 8 | 0 | -4 |
-2 | -4 | -4 | -4 | -2 |
图2.6 LOG算子的的模板
该算法的主要思路和步骤如下:
3编辑与调试
3.1EDGE函数
在MATLAB图像处理工具箱中提供了专门的边缘检测edge函数,由edge函数可以实现各算子对边缘的检测,其调用格式详细见附录:
其中,I是输入图像。edge函数对灰度图像I进行边缘检测,返回与I同样大的二值图像BW;其中1表示边缘,表示非边缘。I可以是uint8型、uint16型或double型;BW是uint8型。 method是表示选用的方法(算子)类型,可以选择的method有Sobel、Prewitt、Roberts、Log、Canny等。可选的参数有thresh(阈值)、sigma(方差)和direction(方向)
利用edge函数,分别采用Sobel、Roberts、Prewitt、Log、Canny 5种不同的边缘检测算子编程实现对苹果原始图像进行边缘提取,MATLAB调用edge函数实现各算子进行边缘检测程序程序代码详见附录。
检测效果如图所示,从图中可以看出,在采用一阶微分进行边缘检测时,除了微分算子对边缘检测结果有影响外,阈值选择也对检测有重要影响。比较几种边缘检测结果,可以看到Canny算子提取边缘较完整,其边缘连续性较好,效果优于其它算子。其次是Prewitt算子,其边缘比较完整。再次就是Sobel算子。
3.3 图像几何操作
图像几何操作包括大小调整 、旋转调整 、剪切缩放和还原返回功能大小调整选项可以调整图像的大小 ,在调整倍数方框里可以指定调整的倍数 , 如在调整倍数方框里填入 2, 则可以放大图像到原来的 2倍 。 旋转调整选项可以调整图像的角度 , 在旋转角度方框里可以指定旋转的角度 , 如在旋转角度方框里写入 45, 则可以顺时针旋转 45°,剪切选项可以剪切图像的任意一部分 , 当按了“剪切”按钮以后,可以用鼠标在图像上拖出一个矩形区域 , 松开鼠标后就剪切到了图像的该区域 。 缩放选项可以任意缩放图像 , 按了“ 缩放 ” 按钮后 , 鼠标会变成放大 镜的形状 , 在图像上点击即可缩放图像 。
3.4灰度处理
灰度处理。灰度处理的界面如图4所示。灰度处理就是把一副彩色图像变成一副黑白图像,如打开一副图像,再按“彩色转灰色”按钮 ,则可以把一副彩色图像变成一幅灰白图像“保存灰度图”选项可以保存灰度图。“直方图”选项就是显示一副灰度图的直方图。灰度调整选项:灰度调整就是对灰度图进行分段的线性变换,
其可以有选择地拉伸某段灰度区域,改善输出图像,用户可以通过“比例调整” 的滑块对灰度值范围进行线性调整,通过选择“增强”或“减弱”来确定灰度上限或下限,以此来对灰度图像进行对比增强或减弱处理。通过对gama
调整选项 :灰度调整就是对灰度图进行分段的线性变换。
结 论
这就是基于MATLAB的水果图像识别的算法全过程,图像经过选择性的灰度提取,边缘检测,降噪和滤波等预处理,通过基于形态学的图像开闭与重建操作实现了图像中每个水果个体的最大分离为之后的前景背景对象的标记起到铺垫,最后通过分水岭图像分割算法得到最优的图形分割最终完成了图像中水果个数的统计。
算法虽然以水果的图像作为特例分析,但是该算法充分利用了MATLAB平台所提供 的函数的便捷性和可扩展性,对于大部分球状水果都可以通过修改灰度化特征提取的特 征参数来锁定所要分析水果的颜色特征,通过修改该小波去噪和中值滤波的参数来优化 特定硬件环境下的图像预处理算法,通过修改基于形态学的图像开
闭操作的se参数来实现对不同大小和不同形状特征的水果的个体分离。是由于该算法设计时间有限,因此有许多考虑不周的地方。本课题方法可以扩展图像识别的应用领域,并且为水果识别提供一个可靠的辅助,省去繁琐的人工采样和识别,提高劳动效率。将来通过算法的优化和改进,提高精度获取更多的水果信息,能够更好的满足水果流通的需求。
参考文献
[1] 陈宇云. 灰度图像的边缘检测研究[D]. 电子科技大学硕士学位论文. 2009 [2] 朱虹. 数字图像处理基础[M]. 北京: 科学出版社. 2005.4:217-220
[3] 余成波. 数字图像处理及MATLAB实现[M]. 重庆: 重庆大学出版社. 2003.7:356-359
[4] 陈书海,傅录祥. 实用数字图像处理[M].北京: 科学出版社. 2005:280-290 [5] 张晶. 图像边缘检测算法的研究[D]. 山东大学硕士学位论文. 2006
[6] 韩磊 .MATLAB在数字图象处理中的应用[J]. 电脑知识与技术. 2008,1(1):29-31
[7] 卢洋,张旭秀.图像边缘检测算法的对比分析与研究[J]. 太原科技. 2009,(3):17-18
[8] 熊秋菊,杨慕生. 图像处理中边缘检测算法的对比研究[J]. 机械工程与自动化. 2009,(2)21-23
[9] 尹建媛. 图像处理中边缘检测算法的研究[J]. 科技信息. 2008,(4):30-32 [10] 李雪. 灰度图像边缘检测算法的性能评价[D]. 沈阳工业大学硕士论文 .2007
[11] 范立南, 韩晓微, 王忠石等. 基于多结构元的噪声污染灰度图像边缘检测研究[J]. 武汉大学学报(工学版), 2003,49(3):45-49
[12] XU Xian-ling,LIN Yi-shui.Application of MatLab in Dingital Image Processing[J]. MODERN COMPUTER. 2008,(5):35-37
[13] LV Yu-qin,ZENG Guang-yu.Detection Algorithm of Picture Edge[J]. TAIYUAN SCIENCE & TECHNOLOGY. 2009,(2):24-25
附录:
edge函数调用格式:
BW=edge(I,’method’)
BW=edge(I,’method’,thresh)
Bw=edge(I,’method’,thresh,direction)
[BW,thresh]=edge(I,’method’,…)
缘检测程序程序代码:
function varargout = apple(varargin)
% APPLE M-file for apple.fig
% APPLE, by itself, creates a new APPLE or raises the existing
% singleton*.
%
% H = APPLE returns the handle to a new APPLE or the handle to
% the existing singleton*.
%
% APPLE('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in APPLE.M with the given input arguments.
%
% APPLE('Property','Value',...) creates a new APPLE or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before apple_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to apple_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
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help apple
% Last Modified by GUIDE v2.5 22-Apr-2010 13:52:17
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @apple_OpeningFcn, ...
'gui_OutputFcn', @apple_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 apple is made visible.
function apple_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 apple (see VARARGIN)
% Choose default command line output for apple
handles.output = hObject
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes apple wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = apple_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;
% --------------------------------------------------------------------
function duqutuxiang_Callback(hObject, eventdata, handles)
% hObject handle to duqutuxiang (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im;
[filename,pathname]=...
uigetfile({'*.*';'*.bmp';'*.tif';'*.png'},'select picture');
str=[pathname filename];
im=imread(str); %
axes(handles.axes1);
imshow(im);
% --------------------------------------------------------------------
function tuichu_Callback(hObject, eventdata, handles)
% hObject handle to tuichu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clc;
clear all;
close(gcf);
% --------------------------------------------------------------------
function huiduhua_Callback(hObject, eventdata, handles)
% hObject handle to huiduhua (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im;
global a2;
a2=rgb2gray(im);
axes(handles.axes2);
imshow(a2);
figure;
imhist(a2);
% --------------------------------------------------------------------
function zhifangtujunhenghua_Callback(hObject, eventdata, handles)
% hObject handle to zhifangtujunhenghua (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a2;
global a4;
a4=histeq(a2);
axes(handles.axes3);
imshow(a4);
figure;
imhist(a4);
% --------------------------------------------------------------------
function zhongzhilvbo_Callback(hObject, eventdata, handles)
% hObject handle to zhongzhilvbo (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a4;
global k1;
k6=medfilt2(a4,[3,3]);
k5=medfilt2(k6,[3,3]);
k4=medfilt2(k5,[3,3]);
k3=medfilt2(k4,[3,3]);
k2=medfilt2(k3,[3,3]);
k1=medfilt2(k2,[3,3]);
axes(handles.axes4);
imshow(k1);
% --------------------------------------------------------------------
function wenjian_Callback(hObject, eventdata, handles)
% hObject handle to wenjian (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
标签:水果,检测,数字图像,图像,边缘,handles,灰度,算子 From: https://blog.csdn.net/2401_84149290/article/details/143428797