基于MATLAB的水果分级识别技术研究
摘 要
本次毕业设计介绍了基于MATLAB的水果分级自动识别,利用手机端获取苹果的样本图像,应用MATLAB软件编程实现了对样本图像的预处理,包括图像滤波、图像填充、图像灰度化、图像二值化以及特征量提取等。
水果分级自动识别我们通过四个不同方面来对基于MATLAB的苹果分级进行探索研究。
主要工作如下:
1. 在苹果大小识别方面,比较了不同的大小计算方法,选择了利用图像处理技术,找到苹果中心点,判断苹果图像实际半径长度,从而对苹果大小进行分级识别。
2. 在苹果颜色识别方面,通过对不同的颜色模型进行研究,RGB模型主要适用于硬件设备,HIS模型更符合人类视觉特征,所以我们选择HIS模型来对苹果进行颜色分级识别。
3. 在苹果缺陷识别方面,利用多种不同的算子对苹果图像进行处理,选择利用canny算子对图像进行处理。
4. 在苹果形态识别方面,通过计算公式,得到图像的圆度数值。
关键词: MATLAB 图像处理 水果分级
Research on fruit classification and
recognition technology based on the MATLAB
ABSTRACT
The fruit of this graduation design based on MATLAB was introduced automatic recognition and classification using mobile terminal access to apple's sample images, using MATLAB software programming realized the sample image preprocessing, including image filtering, image filling, grayscale image, image binarization and feature extraction, etc.
The fruit grading automatically identifies us to explore the MATLAB based apple classification in three different aspects.
The main work is as follows:
1. In terms of apple size identification, compared the different calculation method, the size of the selected using image processing technology, find the center of apple, apple image actual length of the radius, which is used to identify the grading size for apple.
2. In terms of color recognition of apple, through study of different color model, the RGB model is mainly suitable for hardware, ihs model more accord with human visual characteristic, so we choose HIS model is used to identify the color grading for apple.
3. In the aspect of apple defect recognition, the apple image is processed with a variety of different operators, and the canny operator is selected to process the image.
4. In the aspect of apple shape identification, the roundness value of the image is obtained through the calculation formula.
Key words: MATLAB image processing fruit grading
目 录
1绪论 1
1.1 研究的目的与意义 1
1.2 国内外研究的现状 1
1.2.1 国外情况 1
1.2.2 国内情况 2
1.3 研究内容 2
1.4 技术路线 2
1.5 本章小结 3
2图像预处理方法研究 4
2.1 引言 4
2.2 图像的灰度化变换 4
2.3 图像的平滑处理 5
2.3.1 中值滤波法 5
2.3.2 快速中值滤波 5
2.3.3 邻域平均法 5
2.4 图像的二值化 6
2.5 本章小结 7
3 苹果的大小检测 8
3.1 引言 8
3.2 大小检测分级研究 8
3.3 苹果大小特征提取 10
3.4 苹果大小分级试验与结果 12
3.5 本章小结 12
4 苹果的颜色检测 13
4.1 引言 13
4.2 颜色模型 13
4.3苹果表面颜色特性分析 17
4.4 苹果颜色着色度提取与等级划分 17
4.5 本章小结 18
5 水果的缺陷检测 19
5.1 引言 19
5.2 水果缺陷检测研究 19
5.3 水果缺陷检测试验与结果 21
5.4 本章小结 24
6 水果的形态检测 25
6.1 引言 25
6.2 水果形态检测研究 25
6.3 水果形态检测试验与结果 25
6.4 本章小结 25
7 水果分级的系统研究 26
7.1引言 26
7.2系统工作原理 26
7.3本章小结 28
致 谢 29
参考文献 30
1绪论
1.1 研究的目的与意义
水果分级识别技术在如今一切以“O2O”模式为经营理念的当下,具有重要的意义。
水果分级识别技术是利用了计算机技术以及图像处理等许多学科知识综合起来,先通过对水果图像的大小与颜色进行检测,再对检测结果进行综合分析,继而对水果进行分类以及分级。这项技术只需要对水果进行拍照就可以进行比对识别,便于应用。
现如今,许多国家都推出了无人便利店,在无人便利店里因为有部分商品是处于自动售货机内,不能被消费者挑挑拣拣的,这时就需要用到水果识别技术来帮助消费者区分水果质量,通过适合的价格购买到正确品质的水果,不让消费者产生多余的损耗。
并且,在现在虚拟经济的时代,具有像亚马逊,京东这样的自营品牌大型电商,这种企业在大型城市里都具有自己的线下仓库,通过纪录片我了解到,他们的仓库里面基本已经实现了无人工作的模式,一切调度,提取货物,装箱发货都已经采用了机器人技术以及自动化技术,京东已经在部分城市实现了机器人派送货物,亚马逊更是已经实现了无人机派送货物,人力资源逐渐在被取代。在他们的仓库里面就需要用到水果识别技术,对水果进行分类与分级识别,继而由机器人进行分拣。
在过去,水果分级都是人工分级,难免会产生矛盾,现在,应用计算机图像处理技术,进行随机取样,计算机通过随机取样图像可以计算出这个图像内水果的大中小、优良中差等个数及受损情况、所占比例,并做出综合质量判断,这种方法省时省力且客观公正。
数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
1.2 国内外研究的现状
1.2.1 国外情况
日本拥有世界上最贵的西瓜(北海道黑皮西瓜),世界上最贵的苹果(青森县世界一苹果),世界上最贵的柑橘(凸脐柑),世界上最贵的蜜瓜,世界上最贵的草莓,世界上最贵的芒果,世界上最贵的葡萄等等。
在日本,因为国土面积问题,农作物的价值非常高,日本消费者对水果的消费是非常挑剔的,其水果上市前都要经过分级包装。有些价值较高的水果,如冬季上市的西瓜要在标签上糖度数值。目前,在日本许多高新技术在水果检测领域得到应用。计算机技术、无损伤检测技术以及自动化控制技术的发展为现代分级检测技术提供了广阔的空间,使分级检测技术正在由半自动化向全自动化,复杂化向简单化转变。
1.2.2 国内情况
应以斌去除果梗并完成了边缘提取与细化的水果图像,求得水果形心坐标,根据线性回归法最终确定水果的大小特征。
冯斌等通过水果图像边缘的像素求水果形心并确定水果大小的特征值。
绕秀琴等分析了水果实际尺寸与测量值之间的半径误差。
应以斌等研究了一种利用柑橘最小外接矩形求柑橘最大横径的方法。
章程辉等通过形态学处理可见光图像的检测,其测量精度可大大提高。
现如今,陕西的苹果,已经从国外引进了分级设备与技术,以利于更好地出口创汇。目前中国国内最主要的矛盾是:人民日益增长的物质文化需求与落后的社会生产之间的矛盾。我们国家地大物博,物产丰富。如果能够好好的利用这项技术,对于国内社会可以提高人民群众的生活品质,在国际社会也可以提高国际声誉,拉动中外友谊。这项技术必将对国家的发展产生有利的影响。
1.3 研究内容
本课题是基于计算机视觉的水果分级检测,以苹果(种类:红富士)为研究对象。在总结了国内外的研究成果的基础上,选用了运行速度快、可靠性高的方法。对苹果依次进行了图像采集、灰度化、二值化、图像分割、颜色模型转换。再通过苹果的分级特征对苹果进行分级。保证了分级结果的准确性和实用性。主要的研究内容包括:
(1)通过采集到的苹果图像,经过一些处理后。提取出苹果大小的特征值建立分级模型。根据苹果检测出的结果作出判断,来定出水果的大小等级。
(2)对苹果的表面颜色进行分析,建立分级模型,提取出颜色特征值,进而判定出水果颜色的等级。
(3)对苹果进行灰度化,并选择适当的阀值对灰度化后的图像进行二值化,确定缺陷的区域。在通过计算缺陷面积得出缺陷的等级。
1.4 技术路线
水果本身是一种具有具体外形,独特颜色的物体,不同级别的水果通常会在外观上表现出明显的差异性,例如苹果,优良的苹果通常外表圆润饱满,色泽红润有光泽,而次一级的苹果通常表现不佳,外观上通常坑坑洼洼,甚至于有疤痕存在,色泽方面也会存在部分红润,部分透绿的情况。
在计算机上,图像由像素逐点描述,每个像素点具有一个明确的位置和色彩数值。我们可以通过机器视觉对水果尺寸大小,形状,颜色来进行测量分级,利用MATLAB软件读取图像,以矩阵的形式存放图像数据,其扫描规则是从左到右,从上到下。为方便处理,我们把原始的彩色图像转换为灰度图像。根据水果与背景灰度值的差别选取阙值,对去噪、增强对比度后的图像进行二值化处理。分割出目标后,为了防止原始图像中灰度分布不均匀和光照等的影响,导致同一类水果中出现空洞或个别边缘处出现断裂情况等,因此要对图像进行边缘检测,重新填充图像中的洞。经过图像分割后,水果和背景很明显地被区分开来。
我们用物体所包含的像素数量来计算面积,当从左到右,从上到下地将整幅图像扫描完毕,即可得到水果的面积。
我们通过分辨水果的色调,判别红色区域所占面积的大小,从而从颜色方面对水果进行分级。
我们还可以通过图像中水果的不同大小的缺陷来对水果进行分级操作。
图1-1 苹果分级系统总体设计结构图
1.5 本章小结
本章介绍了水果自动识别在实际应用上的重要性,指出了水果识别在实际应用方面取代人工识别的利好方面,通过现如今的应用技术背景,国内外发展情况,完全可以实现水果自动识别的设计。
2图像预处理方法研究
2.1 引言
图像预处理是对图像进行操作的必要环节,通过图像变换,图像增强,图像复原等一系列操作,使图像达到特征提取的基本层次,
图像增强
根据其处理的空间不同,可谓两大类:空域方法和频域方法。前者直接在图像所在像素空间进行处理;而后者是通过对图像进行傅里叶变换后在频域上间接进行的。在空域方法中,根据每次处理是针对单个像素还是小的子图像块(模板)又可分为两种:一种是基于像素的增强,也叫点处理,这种增强过程中对每个像素的处理与其他像素无关;另一种是基于模板的图像增强,也叫空域滤波,这种增强过程中的每次操作都是基于图像中的某个小的区域。
图像复原
对图像进行改进,改善输入图像的质量,尽可能恢复原图像的本来面目。也就是针对图像退化的原因设法进行补偿,把图像的退化过程模型化,并且采用相反的过程来恢复出原来的图像。
点操作
使用线性点操作来保证RGB图像在灰度级和彩色平衡方面都能适合。
颜色空间变换
将RGB空间变换到HSI空间。
2.2 图像的灰度化变换
通过CCD采集到的图像是RGB的彩色图像,如果要进行后序的处理工作。那么必须在前期先对其进行灰度化变换。灰度化变换之后的图像就是我们平时所说的黑白图像。图像的灰度化方法有三种:
最大值法
这种方法就是根据图像的RGB分量来确定图像的灰度值。灰度化后的灰度值就是R,G,B三个分量中的最大的那一个分量。
平均值法
这种方法就是计算R,G,B三个分量的平均值,用这个值作为灰度化后的灰度值。
权重值法
这种方法就是用R,G,B分量分别乘以一个参数,这样得出的值作为灰度化后的值。
本课题中对于图像的灰度化处理是通过一个函数实现的,这个函数就是rgb2gray.经过灰度化后的图像如下所示:
图2-1 灰度化后的苹果图像
2.3 图像的平滑处理
在图像的拍摄过程中由于受拍摄和传输设备的影响,总会产生使人厌恶的噪声,同样在图像的处理过程中也会产生。这些噪声会影响后续的处理工作和视觉效果。所以必须对图像提前进行平滑处理以减少噪声。噪声的消除有两种方法:频域法和空域法。频域法的原理是消除频域中高频成分,但是需要在处理过程中不断的在频域和时域之间转换,处理速度慢,不适合实际应用。实际应用中一般采用空域法,空域法中常用的有中值法、快速中值法、邻域平均法等。
2.3.1 中值滤波法
中值滤波是一种非线性平滑滤波,在一定的条件下可以克服线性滤波所带来的图像细节模糊问题,而且对过滤脉冲干扰及图像扫描噪声非常有效,但对某些细节多(点、线、尖等)的图像不宜采用中值滤波方法。
他的方法是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替。其在matlab中用到的函数是medfilt2,其相应的语法是:
B=medfilt2(A,[m,n])
[m,n]为指定滤波模板的大小,默认值是3*3大小
2.3.2 快速中值滤波
快速中值滤波的方法稍微有点复杂,它要先求出原图像的直方图,然后通过直方图来求出中值。假设窗口的大小为m*n,从一个窗口的中值滤波输出到下一个中值滤波的输出。窗口将移动一列,新窗口的像素是原窗口的像素删去最左边的一列,然后再在他的右边加上另外一列。其余所有的像素点保持不变。然后对原来的直方图进行修正,利用直方图求新窗口的中值。
2.3.3 邻域平均法
由于图像受照相机、传输设备影响所产生的噪声都是随机的。可以把这些噪声看作是孤立的。所以可以用一个模块中所有像素的平均值来代替模板中间点的像素值。这样可以达到减少噪声的效果。但是图像的边缘可能就会因此而变得模糊了。因为图像的边缘本身变化就十分的剧烈。处理时可能会使图像边缘的细节变模糊。这也是邻域平均法的一个十分明显的缺点。
在本课题中,由于要考虑到图像处理的速度问题,实现的简易度,和图像处理的准确度等一些问题,所以我选择了中值滤波法。图像滤波后如下图所示:
图2-2 中值滤波后的苹果图像
2.4 图像的二值化
图像的二值化就是把得到的灰度化图像,通过选定阀值,把其变成只有“0”和“1”两个值的图像。把超过阀值的灰度值,统一处理成1,把低于阀值的灰度值统一处理成0.
本课题中对于阀值的选择,我选用了一个函数graythresh.通过graythresh函数选择出了阀值,然后用这个阀值作为参数进行如上所说的二值化。最后得出的二值化后的图像如下所示:
图2-3 二值化后的苹果图像
2.5 本章小结
本章通过比较不同的图像平滑化处理方法,最后采用了中值滤波法,既处理了噪声,还不会使图像变模糊,最主要的是使用起来十分的方便。另外还说明了图像预处理的其他方面内容,包括图像的灰度化和图像的二值化。
3 图像的特征提取
3.1 苹果的大小检测
3.2 苹果的颜色检测
3.3 苹果的缺陷检测
3.4 苹果的形态检测
3 苹果的大小检测
3.1 引言
本次水果识别技术研究需要获得苹果的面积大小。
水果的大小是水果品质的一个十分重要的品质因素。因而对于大小的分级检测在整个课题中占有十分重要的位置。目前水果大小检测的方法很多,在这方面研究的也十分成熟了。对于这方面的研究:
章文英等通过先对图像预处理,确定水果的轮廓,再通过水果的最小外切矩形,近似确定水果的大小,精确度不是很高。
而冯斌等先边缘检测,后通过确定水果的轴向、形心,进而得出水果的大小,精确度很高。
3.2 大小检测分级研究
目前水果的大小识别方法主要有两个方面:通过水果的外接矩形等方法确定水果的的果径大小,进而通过果径的大小来确定水果的大小等级;通过对水果的边缘进行傅里叶变换,通过傅里叶系数来确定水果的大小、形状等一些特征值,以此来判定水果的大小。现有的水果大小识别方法有以下几种方式:
最小外接矩形法
其基本的方法是先确定水果的形心,然后将水果每绕形心旋转3度后就拍一照片,找出所有照片中苹果外接矩形最小的那一张。那么这张图片的最长的那条边的长度就是苹果的果径长度。进而通过果径的长度来判定水果的大小等级。
图3-1 外接矩形法
最大果宽法
水果的大小可以通过水果的直径来表示,所以可以用果宽来对苹果的大小进行分级。对于确定果宽大小,第一步要求出苹果的果轴,果轴就是花萼和花梗的连线。果轴的确定对于静态的图像来说非常容易。果宽就是垂直于果轴的直线与苹果边缘交线中最长的那一条长度。
图3-2 最大果宽法
果径法
这种方法把苹果看成是球体,通过边缘提取和细节处理后,计算出水果的形心,果梗与形心的连线就是果径,通过形心与果径垂直的线就是果宽。通过果宽的大小来确定出苹果的大小等级。
投影面积法
CCD摄像头拍摄的水果图像是二维的平面图,计算此投影面积S,根据大量试验找到一个合适系数K'使得K乘以S接近水果真实的表面积。最后用这个近似的表面积来表示水果大小,并用于分级。由于很难找到合适的K值使所有的苹果近似面积接近真实表面积,该方法稳定性差。准确率低,不宜用在在线苹果大小检测上。
综上所述,最小外接矩形法计算量太大,不满足快速检测的要求.最大果宽法和果径法计算量小,但是根据得到的苹果图像不易找到果轴,因此算法难以实现。投影面积法对于一个苹果只拍摄一个图像,稳定性差,准确率低。
3.3 苹果大小特征提取
提取目标面积大小,求整体的像素数大小,
使用公式:
A1 = sum(sum(BW));
A2 = bwarea(BW);
由于判定水果的大小等级一般都是使用水果的直径来判别,所以要计算出水果的直径大小。
在数字图像处理过程中,把苹果图像的每个像素分别看作每一个点时,通过链码表示周长,当链码个数由奇数个链码组成时,其链码长度是√2,若组成链码个数为偶数个时,其长度取为1,用下式计算周长。
P = N1 + √2N0
式中,N1——偶数步数;N0——奇数步数;P——周长。
其中链码经常使用的是8方向和4方向,其方向定义如下图所示。
(a)8方向链码 (b)4方向链码
图3-3 方向链码
三幅苹果图像如下:
图3-4 苹果图像1
图3-5 苹果图像2
图3-6 苹果图像3
3.4 苹果大小分级试验与结果
GB10651—2008中对于大型果、中小型果的果径大小要求如下。本课题通过对水果的投影面积法,进而计算初水果的直径大小,再利用特定的阀值来对苹果的大小进行区分。
表3-1 苹果等级划分标准
等级 |
优等 |
一等 |
二等 |
等外 |
大型果 |
>=70 |
>=65 |
>=60 |
<60 |
中型果 |
>=65 |
>=60 |
>=55 |
<55 |
小型果 |
>=60 |
>=55 |
>=50 |
<50 |
表1 鲜苹果质量等级要求
项目 |
等 级 |
|||
优等品 |
一等品 |
二等品 |
||
果径(最大横切面直径)/mm |
大型果 |
>=70 |
>=65 |
|
中小型果 |
>=60 |
>=55 |
苹果的分级模型可以表示为:
If D>=th1 属于优等果
Elseif D>=th2 属于一等果
Elseif D>=th3 属于二等果
Else 属于等外果
3.5 本章小结
本章通过改进的投影面积法,来先计算出苹果三个侧面的面积,再计算相应的直径,求其平均值。来作为果径的大小,对苹果的大小进行等级区分。
4 苹果的颜色检测
4.1 引言
苹果的颜色反映了苹果的品质与口感等一系列方面。品质好的苹果,其色泽、颜色的着色率都很好,而相反品质差的苹果其色泽、颜色的着色率一般都比较差。同时,含糖量多、口感好的一般来说也是着色率比较高的。这样来说,对于水果的颜色检测就显得十分的重要。目前在水果检测中,国外的技术受到硬件和算法的局限,所以技术的成熟度不高,而在我们国内,水果的分级一般都是采用机械分类的方法,其对颜色这方面的检测基本上都无法实现。
4.2 颜色模型
目前的颜色模型可以分为两种类型:一种是面向硬件设备的,比如RGB模型,他是面向打印机、显示器等设备的。另外一种是面向人的视觉感受的,比如HIS模型。而本课题中对于水果颜色的分级是基于人的视觉的,所以选用HIS模型,这种模型更利于我们对水果的特征进行提取。下面介绍几种颜色模型:
RGB模型
在多媒体计算机技术中,用得最多的是RGB模型。其采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红,绿、篮磷光材料发光而产生颜色。RGB是一个加色立方体模型,光源的亮度、色度、纯度混合在R、G、B三个参数中.RGB模型里面任意色光F都可以用R,G,B三色不同分量的相加混合而成:
F=R+G+B
RGB模型采用物理三基色表示,因而物理意义很清楚,适合彩色显象管工作,显示器和扫描仪都采用RGB模型。然而这一体制并不适应人的视觉特点。这种模型从感知来说是不均匀的,并依赖于硬件设备。RGB模型的缺点有:
RGB模型用红、绿、蓝三原色的混合比例定义不同的色彩,使色彩难以用准确的数值来表示,并进行定量分析;
在RGB模型中,由于彩色合成图像通道之间相关性很高,使合成图像的饱和度偏低,色调变化不大,图像视觉效果差;
人眼不能直接感觉红、绿、蓝三色的比例,而只能通过感知颜色的亮度、色调以及饱和度来区分物体,而色调和饱和度与红、绿、蓝的关系是非线性的,因此,难以在RGB模型中对图像进行直接处理.
以下是实验中得出的R,G,B分量:
图4-1 RGB模型中R分量的图像
图4-2 RGB模型中G分量的图像
图4-3 RGB模型中B分量的图像
YUV颜色模型
YUV颜色模型也是使用比较多的颜色模型,由于人眼对于亮度的敏感度远远大于对于色度的敏感度,所以YUV这个模型中,相邻的像素间使用同样的色度值。这样的图像是用牺牲色度来达到压缩图像的目的。这个模型一般用于图像传输中对图像进行压缩处理。
HIS颜色模型
这一模型是面向彩色处理的最常用的模型。HIS模型是基于视觉原理的一个系统,定义了三个互不相关,容易预测的颜色属性,即色调(H),亮度(I)和饱和度(S)。其中,H是表面呈现近似红、黄,绿、蓝等颜色的一种或几种的目视感知属性;I是物体表面相对明暗特性;S是颜色具有“白光”的程度.它有两个特点:
其一,I分量与图像的彩色信息无关,因此对彩色信息处理只需考虑两个分量。
其二,H和S分量与人感受颜色的方式非常相近。这些特点使HIS模型适合于视觉系统感受彩色特性的图像处理算法。
由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,人的视觉系统经常采用HIS颜色空间,它比RGB颜色空间更符合人的视觉特性。RGB与HIS的相互关系分正反两种情况,这里只讨论从RGB转换到HIS的情况。对任何3个在【0,1】范围内的R、G、B三基色,其对应HIS模型中的H、I、S分量可由下面给出的公式计算:
Temp1 =0.5*((r-g)+(r-b)) (4-1)
temp2 =sqrt((r-g).^2 + (r-b).*(g -b)) (4-2)
theta = arccos(temp1./temp2) (4-3)
H=theta G>=B (4-4)
H=360-theta G<=B (4-5)
S=1-3*min(R,G,B)/(R+G+B) (4-6)
I=(R+G+B)/3 (4-7)
以下是本课题实验中所得出的HIS三个分量的图像
图4-4 H分量的图像
图4-5 V分量的图像
图4-6 S分量的图像
4.3苹果表面颜色特性分析
苹果的颜色等级划分包含的方面很多,但主要的方面有三个:红区比例,色度,苹果的着色均匀度
红区的比例反映了苹果的红色区域的面积大小。红色区域面积越大,则苹果的含糖量越高,口感也越好。
色度也是苹果颜色的一个方面,偏黄的苹果色度比偏绿的小。而偏黄的苹果品质要比偏绿的要好。
苹果的着色均匀度也同样重要,着色越均匀的苹果,美观度高、口感好。
4.4 苹果颜色着色度提取与等级划分
由于红色区域亮度比较大,且和其他部分相差较大,因此,经过运算就将红色部分分割出来了。在进行rgb分割时也可以不借助hsv的分量进行处理,用rgb的最大亮度的scale倍作为分割点。
苹果的着色度是苹果颜色分级中十分重要的方面,他反映了苹果的红区面积于苹果实际的面积的比。提取的方法是,先提取出苹果HIS模型中的H分量,然后选择合适的阀值对红区进行二值化处理,计算红区的面积。最后用红区面积与苹果的实际面积做比,进而就可以求出苹果的着色度。
等级的划分可以以下表为依据:
表1 鲜苹果质量等级要求
项目 |
等 级 |
||
优等品 |
一等品 |
二等品 |
|
富士系 |
红或条红90%以上 |
红或条红80%以上 |
红或条红55%以上 |
4.5 本章小结
苹果的颜色检测对于苹果的整体等级划分十分重要,本课题通过主要对HIS模型中色度的处理,得出红区的面积大小,进而与苹果的实际大小做比。按照着色度的等级划分标准对苹果品质进行区分。
5 水果的缺陷检测
5.1 引言
水果的缺陷检测是检测中最重要的,也是复杂度很高的一个方面,目前的缺陷检测一般采用边缘检测求出缺陷的区域,进而对缺陷进行评估。这其中边缘检测是最重要的环节。
李庆中等通过双金字塔数据形式的盒维数快速计算,得出五个分形维数作为可疑缺陷区的参数,再通过BP形网络结构的人工神经网络,最终实现对梗、萼和缺陷的准确判断。
冯斌等先对水果进行图像的获取与分割,而对于梗萼和缺陷的判决,则通过观察可疑区是上凸的还是下凹来判定,因为如果是梗萼的话那么应在下凹区,而如果是缺陷区,那么大部分都是在上凸区的。这种方法准确度还是挺高的。
5.2 水果缺陷检测研究
图像的边缘对人的视觉具有重要意义,一般来说,当人看一个物体时,首先感觉到的就是边缘。边缘是一个区域的结束也是一个区域的开始。利用这一个特性可以分割图像,将缺陷区域从苹果图像中分割出来。目前边缘检测主要有roberts模板、sobel模板、prewitt模板、拉斯算子、canny边缘检测算子这5种方法检测。
Roberts模板检测
-1 |
0 |
0 |
1 |
图5-1 Roberts模板
Sobel模板检测
-1 |
-2 |
-1 |
0 |
0 |
0 |
1 |
2 |
1 |
图 5-2 Sobel模板
Prewitt模板检测
-1 |
-1 |
-1 |
0 |
0 |
0 |
1 |
1 |
1 |
图5-3 prewitt模板
LOG模板检测
0 |
1 |
0 |
1 |
-4 |
1 |
0 |
1 |
0 |
图 5-4 LOG模板
Canny边缘检测算子
在图像的边缘检测中,抑制噪声和边缘精确定位是无法同时满足的,边缘检测算法通过平滑滤波法去除图像噪声的同时,也增加了边缘定位的不确定性;反之,提高边缘检测算子对边缘的敏感性的同时,也提高了对噪声的敏感性,canny算子力图在抗噪声干扰和精确定位之间寻求最佳的折中方案。
Canny算子检测图像边缘的步骤如下:
平滑图像;
计算滤波后的图像的梯度的幅值和方向;
对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值 点,把其他非极大值点置零以得到细化边缘;
用双阀值算法检测和连接边缘;
对比各种算法,本课题我所选用的算法是Canny边缘检测算子进行的检测。效果比较好,可以明显的看出缺陷的区域。
5.3 水果缺陷检测试验与结果
MATLAB实现五种边缘检测
一、原理
常用的边缘检测算法有拉普拉斯边缘检测算法、Robert边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子、Canny边缘检测算子。
% 'sobel', 'prewitt', 'laplacian',
%'log', 'canny'
BW5=edge(I,'Canny',0.35);
subplot(2,3,6);
imshow(BW5);
title('Canny算子边缘检测');
下面是对有缺陷的苹果进行的检测,分别用各种边缘检测算子检测出来的图像:
用roberts模板检测
图5-1 用Roberts检测后的图像
用sobel模板检测
图5-2 用Sobel检测后的图像
用prewitt算子检测
图5-3 用Prewitt算子检测后的图像
用log算子检测
图5-4 用log算子检测后的图像
用Canny算子检测
图5-5 用Canny检测后的图像
表1 鲜苹果质量等级要求
项目 |
等 级 |
||
优等品 |
一等品 |
二等品 |
|
果面 缺陷 |
无缺陷 |
无缺陷 |
允许下列对果肉无重大伤害的果皮损伤不超过4项 |
5.4 本章小结
6 水果的形态检测
6.1 水果形态检测研究
水果形态我们根据水果的圆度来进行判断,
通过公式我们可以得到圆度的计算公式:
6.2 水果形态检测试验与结果
表1 鲜苹果质量等级要求
项目 |
等 级 |
||
优等品 |
一等品 |
二等品 |
|
果形 |
具有本品种应有的特征 |
允许果形有轻微缺点 |
果形有缺点,但仍保持本品基本特征,不得有畸形果 |
6.3 本章小结
通过检测苹果的图像,我们根据得到的圆度对苹果进行了自动分级。
6 GUI界面设计
6.1 GUI概念
GUI 即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事 GUI 的研究与设计,同业间也成立了若干机构,以互相交流 GUI 设计理论与经验为目的。随着中国 IT 产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。
6.2 界面测试
图形用户界面( GUI )对软件测试提出了有趣的挑战,因为 GUI 开发环境有可复用的构件,开发用户界面更加省时而且更加精确。同时, GUI 的复杂性也增加了,从而加大了设计和执行测试用例的难度。因为现在 GUI 设计和实现有了越来越多的类似,所以也就产生了一系列的测试标准。
6.3 本章小结
通过使用GUI我们设计了一个完美的界面,
7 水果分级的系统研究
7.1引言
对于水果的分级检测的研究,国外经过几十年的研究,技术发展的已经比较成熟了。但在国内由于这方面的起步比较晚,所以大部分的分级检测还是采用机械分级,不仅效率不高,最主要的是精度也不是很高。所以本课题的研究是十分具有应用价值的。本课题通过运用计算机技术、图像处理技术达到了对苹果的分级检测的目的。
7.2系统工作原理
水果分级检测的步骤如下:
对采集到的图像,用Matlab软件对图像进行处理。
对图像进行预处理,包括滤波、灰度化、二值化等。
对苹果进行大小检测,通过果径大小进行等级划分。
对苹果进行颜色检测,先将图像RGB模型转换为HIS模型。通过HIS模型中的H分量进行颜色分级。
对苹果进行缺陷检测,使用canny边缘检测算子进行边缘检测,进而检测出苹果的缺陷部分。
系统的流程如下图所示:
图6-1 系统流程图
系统包括硬件部分和软件部分:
硬件部分主要是图像的采集部分,包括手机摄像头、数据传输设备、一台安装了Matlab软件的计算机。
软件部分主要是图像的处理部分,Matlab编码对图像进行处理与仿真。具体到软件内部的工作流程情况如下所示:
图6-2 软件工作流程图
7.3本章小结
本章对水果分级系统进行了介绍,包括他的硬件系统、软件系统。软件设计通过用Matlab软件对采集到的图像进行预处理,然后分别进行大小检测、颜色检测、缺陷检测完成对苹果的分级检测。
致 谢
1、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。
2、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。
3、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。
4、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。
参考文献
[1]
6总结展望1回顾(干了什么,什么结果)2展望(还可以做)
5、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。
6、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。
7、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。
8、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。
附录1
function varargout = guidetemplate0(varargin)
% GUIDETEMPLATE0 MATLAB code for guidetemplate0.fig
% GUIDETEMPLATE0, by itself, creates a new GUIDETEMPLATE0 or raises the existing
% singleton*.
%
% H = GUIDETEMPLATE0 returns the handle to a new GUIDETEMPLATE0 or the handle to
% the existing singleton*.
%
% GUIDETEMPLATE0('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GUIDETEMPLATE0.M with the given input arguments.
%
% GUIDETEMPLATE0('Property','Value',...) creates a new GUIDETEMPLATE0 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before guidetemplate0_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to guidetemplate0_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-2006 The MathWorks, Inc.
% Edit the above text to modify the response to help guidetemplate0
% Last Modified by GUIDE v2.5 11-May-2018 13:11:57
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @guidetemplate0_OpeningFcn, ...
'gui_OutputFcn', @guidetemplate0_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 guidetemplate0 is made visible.
function guidetemplate0_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 guidetemplate0 (see VARARGIN)
im=imread('apple1.jpg');
axes(handles.axes1);
imshow(im);%在坐标axes1显示原图像
title('原始水印');
% Choose default command line output for guidetemplate0
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes guidetemplate0 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = guidetemplate0_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)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
axes(handles.axes2);
imshow(~bw)
title('面积图像');
%handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2
strNC=['面积= ',num2str(bwarea(~bw))];
set(handles.text1,'string',strNC);
strNC1=['一级品'];
set(handles.text5,'string',strNC1);
% --- 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)
x1=handles.X1;
hv=rgb2hsv(x1);
H=hv(:,:,1);
S=hv(:,:,2);
V=hv(:,:,3);
axes(handles.axes2);
imshow(H)
title('H分量图像');
apple=im2bw(x1);
count=length(x1);
for i=1:count
red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));
end
strNC=['红色比率= ',num2str(red_ratio*100),'%'];
set(handles.text2,'string',strNC);
figure,subplot(1,3,1);imshow(H);title('H分量图像');
subplot(1,3,2);imshow(S);title('S分量图像');
subplot(1,3,3);imshow(V);title('V分量图像');
strNC1=['一级品'];
set(handles.text6,'string',strNC1);
% --- 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)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域
axes(handles.axes2);
imshow(X)
title('缺陷图像');
strNC=['缺陷率= ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];
set(handles.text3,'string',strNC);
strNC1=['一级品'];
set(handles.text7,'string',strNC1);
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
I2=rgb2gray(x1);
J=im2bw(I2,0.6);
I=~J;
axes(handles.axes2);
imshow(I)
title('圆度图像');
[x,y]=size(I);
BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长
%检测垂直方向连读的周长像素点%
P1=0;
P2=0;
Ny=0; % 记录垂直方向连续周长像素点的个数
for i=1:x
for j=1:y
if (BW(i,j)>0)
P2=j;
if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点
Ny=Ny+1;
end
P1=P2;
end
end
end
%检测水平方向连读的周长像素点%
P1=0;
P2=0;
Nx=0; % 记录水平方向连续周长像素点的个数
for j=1:y
for i=1:x
if (BW(i,j)>0)
P2=i;
if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点
Nx=Nx+1;
end
P1=P2;
end
end
end
SN=sum(sum(BW)); % 计算周长像素点的总数
Nd=SN-Nx-Ny; % 计算奇数码的链码数目
H=max(sum(I)); % 计算目标的高度
W=max(sum(I')); % 图象I经矩阵转置后,计算宽度
L=sqrt(2)*Nd+Nx+Ny; % 计算周长
%====形态特征值计算===%
A=bwarea(I); % 计算目标的面积
%L1=zhch(I);
C=(4*pi*A)/(L*L); % 计算圆度
R=A/(H*W); % 计算矩形度
E=min(H,W)/max(H,W); % 计算伸长度
% L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度
strNC=['圆形度= ',num2str(C)];
set(handles.text4,'string',strNC);
strNC1=['一级品'];
set(handles.text8,'string',strNC1);
% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_2_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_3_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_4_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_5_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Untitled_6_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close
% --------------------------------------------------------------------
function Untitled_7_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_7 (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);
% --------------------------------------------------------------------
function Untitled_8_Callback(hObject, ~, handles)
% hObject handle to Untitled_8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
x2=rgb2gray(x1);
axes(handles.axes2);
imshow(x2);
title('灰度化图像');
% --------------------------------------------------------------------
function Untitled_9_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
x2=rgb2gray(x1);
x3=medfilt2(x2,[3,3]);
axes(handles.axes2);
imshow(x3);
title('中值滤波图像');
% --------------------------------------------------------------------
function Untitled_10_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
axes(handles.axes2);
imshow(~bw)
title('二值化图像');
% --------------------------------------------------------------------
function Untitled_11_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_11 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质
I4=I3-bw;%得到肺实质的图像E
I5=bwmorph(I4,'clean'); %图像边界
I6=imfill(I5,8,'holes');%填充肺实质空洞
I7=bwperim(I6);
axes(handles.axes2);
imshow(I7)
title('边缘检测');
% --------------------------------------------------------------------
function Untitled_12_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_12 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
im=imread('greenapple.jpg');
axes(handles.axes1);
imshow(im);%在坐标axes1显示原图像
title('绿色苹果');
% --------------------------------------------------------------------
function Untitled_13_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_13 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
im=imread('apple1.jpg');
axes(handles.axes1);
imshow(im);%在坐标axes1显示原图像
title('红色苹果');
% --------------------------------------------------------------------
function Untitled_14_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_14 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
axes(handles.axes2);
imshow(~bw)
title('面积图像');
%handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2
strNC=['面积= ',num2str(bwarea(~bw))];
set(handles.text1,'string',strNC);
% --------------------------------------------------------------------
function Untitled_15_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_15 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
hv=rgb2hsv(x1);
H=hv(:,:,1);
S=hv(:,:,2);
V=hv(:,:,3);
axes(handles.axes2);
imshow(H)
title('H分量图像');
apple=im2bw(x1);
count=length(x1);
for i=1:count
red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));
end
strNC=['红色比率= ',num2str(red_ratio*100),'%'];
set(handles.text2,'string',strNC);
% --------------------------------------------------------------------
function Untitled_16_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_16 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域
axes(handles.axes2);
imshow(X)
title('缺陷图像');
strNC=['缺陷率= ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];
set(handles.text3,'string',strNC);
% --------------------------------------------------------------------
function Untitled_17_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_17 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
I2=rgb2gray(x1);
J=im2bw(I2,0.6);
I=~J;
axes(handles.axes2);
imshow(I)
title('圆度图像');
[x,y]=size(I);
BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长
%检测垂直方向连读的周长像素点%
P1=0;
P2=0;
Ny=0; % 记录垂直方向连续周长像素点的个数
for i=1:x
for j=1:y
if (BW(i,j)>0)
P2=j;
if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点
Ny=Ny+1;
end
P1=P2;
end
end
end
%检测水平方向连读的周长像素点%
P1=0;
P2=0;
Nx=0; % 记录水平方向连续周长像素点的个数
for j=1:y
for i=1:x
if (BW(i,j)>0)
P2=i;
if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点
Nx=Nx+1;
end
P1=P2;
end
end
end
SN=sum(sum(BW)); % 计算周长像素点的总数
Nd=SN-Nx-Ny; % 计算奇数码的链码数目
H=max(sum(I)); % 计算目标的高度
W=max(sum(I')); % 图象I经矩阵转置后,计算宽度
L=sqrt(2)*Nd+Nx+Ny; % 计算周长
%====形态特征值计算===%
A=bwarea(I); % 计算目标的面积
%L1=zhch(I);
C=(4*pi*A)/(L*L); % 计算圆度
R=A/(H*W); % 计算矩形度
E=min(H,W)/max(H,W); % 计算伸长度
% L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度
strNC=['圆形度= ',num2str(C)];
set(handles.text4,'string',strNC);
% --------------------------------------------------------------------
function Untitled_18_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_18 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
x1=handles.X1;
w=rgb2gray(x1);
L=medfilt2(w);
level=graythresh(L);
bw=im2bw(L,level);
I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质
I4=I3-bw;%得到肺实质的图像E
I5=bwmorph(I4,'clean'); %图像边界
I6=imfill(I5,8,'holes');%填充肺实质空洞
axes(handles.axes2);
imshow(I6)
title('图像填充');