计算机科学与通信工程学院课程报告课程实验题目学生姓名学号专业班级摘要在生产生活中可以利用matlab函数将苹果从纷杂的大量水果中分离出来,也可根据果径和果面缺陷实现水果的等级划分。从而提高生产方的工作效率。进而降低水果的生产成本迎合市场需求。1.引言近年来,随着人们生活水平的提高,人们对于水果的品质要求也不断提高。实行水果的分级销售似乎成为当前市场的一个趋势。在传统的水果等级评判主要依靠人工操作。但我们也知道,人对图像的感知是十分主观的。因此每个人的评价指标不同,而且人工的费用较高。在劳动成本越发提升的今天显然这是十分落后的。即便应用了计算机作为辅助道具,使用基于matlab的识别与检测仍旧是其中成本较为低廉的一种。对于果农等生产方来讲这就显得尤为重要。同样这也能让消费者从中获利。显然这是一种很好的方式,但实际操作起来仍旧有很大的难度。因此,利用计算机图像处理的技术研究客观、方便、高效并且便宜的水果品质检测方法越来越受到人们的重视。2.基本知识需要掌握图像的分割技术和图像的识别技术,并利用相应的函数将所需要显示的部位从背景中提取出来。我们日常所获得的便是RGB彩色图像。在处理过程中基本思路都是首先将图像处理为灰度图像,接下来处理为二值图像。进而利用其它函数处理。2.1RGB图像RGB图像被用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。它的每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个MxN的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。2.2灰度图像灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是所谓256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。2.3二值图像二值图像的二维矩阵则是仅由0、1两个值构成。“0”代表黑色,“1”代白色。由于每一像素取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。2.4图像分割图像分割是数字图像处理中的关键技术之一。它将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。2.5图像描述图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。2.6图像识别图像识别属于模式识别的范畴,其主要内容是图像经过某些预处理后,进行图像分割和特征提取,从而进行判决分类。3.功能分析及设计在本题中,苹果的形状与其它水果是不同的,因此可以利用这一特点将其从混杂的水果中寻找出来,也可以根据它的形状进而使用直径这一特性来描述它的大小。苹果表面上的伤痕拥有与苹果本身不同的色泽,其形状虽然不规则但是也多为圆形。也可以根据类似的方式来进行设计。首先可以考虑将苹果从各种水果中识别出来。%读取原图,并处理成二值图像I=imread('d:\50.jpg');I2=rgb2gray(I);BW=im2bw(I2,0.9);total=bwarea(~BW);figure,subplot(1,3,1),imshow(I),title('原始图像');subplot(1,3,2),imshow(I2),title('灰度图像');subplot(1,3,3),imshow(BW),title('二值图像');%进行边缘检测得到了不连续的图形边界(采用sobel算子或区域增长)%得到各个图形的连续边界SE=strel('rectangle',[4030]);%结构定义J2=imopen(BW,SE);%开启运算figure,imshow(J2),title('对二值图像进行开运算后的结果图像');SE=strel('square',5);%定义3×3腐蚀结构元素J=imerode(~J2,SE);BW2=(~J2)-J;%检测边缘figure,imshow(BW2),title('3*3腐蚀运算后的图像边界轮廓');%填充了已有的检测的连续形状边界B=imfill(BW2,'holes');B=bwmorph(B,'remove');figure,imshow(B),title('提取出的边界图像');%将不同的图形进行分别标记,num表示连接的图形对象的个数[Label,num]=bwlabel(B,8);%得到各个图像的边界像素的数组%计算各个图形单元的周长用连接像素点或数边界像素点个数的方法numPoints数组表示各个图形边界的像素个数(即用个数来表示周长)%num=max(max(Label));fori=1:numPremeter(i)=0;end[row,col]=size(Label);fori=1:rowforj=1:colif(Label(i,j)0)Premeter(Label(i,j))=Premeter(Label(i,j))+1;%计算标记后的各块图形边界中像素的个数的总数endendend%5计算各个图形单元的面积FilledLabel=imfill(Label,'holes');%填充打过标记的边界线中间围成的图形区域figure,imshow(FilledLabel),title('打过标记后并已被填充的结果图像');fori=1:numArea(i)=0;end[row,col]=size(FilledLabel);fori=1:rowforj=1:colif(FilledLabel(i,j)0)Area(FilledLabel(i,j))=Area(FilledLabel(i,j))+1;%通过统计像素点个数的方式来求各形状的面积endendend%计算各个图形单元的圆度fori=1:numEcllipseratio(i)=4*pi*Area(i)/Premeter(i)^2;end%识别苹果%构建苹果的分类器,在二维特征空间对各个图像进行类别区分apple=0;fori=1:numif((Ecllipseratio(i)1.25)&&(Ecllipseratio(i)1.0))%分类器识别苹果的准则:判断各个图形中圆度居于1.0与1.25之间的的为苹果apple=i;endend%对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作appleHSV=HSV;forj=1:rowfork=1:colif(FilledLabel(j,k)~=apple)appleHSV(j,k,3)=0;endendend%变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别applematrix=hsv2rgb(appleHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下苹果figure,imshow(applematrix),title('水果类别:苹果');接下来可以考虑计算苹果的直径。因为对于苹果来讲,不同的大小价格是不同的。检测思路为:将图片灰度化、二值化后,利用regionprops函数计算二值化图像的最小外接矩形大小,外接矩形框长度和宽度中的最大值即为苹果最大横切面直径。此时的数值为像素值,通过与照片的长、宽像素值进行比较,结合图片的实际长、宽值,即可求出果径的实际长度。具体函数如下:rgb=imread('d:\apple.png');rgb1=im2double(rgb);r=rgb1(:,:,1);g=rgb1(:,:,2);b=rgb1(:,:,3);I=(r+g+b)/3;tmp1=min(min(r,g),b);tmp2=r+g+b;tmp2(tmp2==0)=eps;S=1-3.*tmp1./tmp2;tmp1=0.5*((r-g)+(r-b));tmp2=sqrt((r-g).^2+(r-b).*(g-b));theta=acos(tmp1./(tmp2+eps));H=theta;H(bg)=2*pi-H(bg);H=H/(2*pi);H(S==0)=0;I=(r+g+b)/3;%Combineallthreeresultsintoanhsiimage.hsi=cat(3,H,S,I);S=im2bw(S,0.2);imshow(S)求取外接最小矩形框,并利用regionprops函数计算图像区域的属性信息,并读取矩形的长、宽数据,以长、宽中的最大值为果径的数值。这里的数值为像素值。[l,m]=bwlabel(S,8);status=regionprops(l,'BoundingBox');x=status(2,1).BoundingBox;%读取矩形的长宽X=max(x);%取最大值取得果径的像素值后,与图片的长(宽)像素值相比。由于图片的像素、实际长宽等数值已预先设定并保持不变,因此根据果径像素与图片像素的比值可求出果径的实际数值。接下来可以考虑检测水果表面的缺陷。果面的缺陷主要包括压伤、碰伤、虫蛀伤亦或是裂开等,但所有表面可见的伤痕都表现为正常果面色泽、质地不一致。因此可通过提取果面的图像特征,检测缺陷情况。首先,读入图像后用rgb2gray函数对受检苹果进行灰度化,并用imadjust函数调整灰度图像的强度值。I=imread(d:\'apple3.jpg');I2=rgb2gray(I);J=imadjust(I2,[0.10.2],[]);利用im2bw函数将调整后的灰度图像转换为二值图像,level值取1。为方便检测,对二值图像进行取反处理。Y=im2bw(J,1);Y=~Y。与计算果径的方法相同,求病斑区域的外接矩形框,并利用regionprops函数计算图像区域的属性信息。[l,m]=bwlabel(Y,8);status=regionprops(l,'BoundingBox');imshow(Y);holdon;fori=1:mrectangle('position',status(i).BoundingBox,'edgecolor','r');endholdoff;由于病斑的不规则,且一个果面可能会有多个病斑,图像区域中会有多个外接矩形框,因此需要对每个矩形框的大小进行判定,选取面积最大的矩形框。[x,y]=size(status);%读取图片信息fori=1:x%共有x个矩形框X(i)=max(status(i).BoundingBox);%取矩形框最大值endx2=status(i,1).BoundingBox;%读取矩形框的长、宽x2(1)x2(2)在这里,以最大矩形框的面积近似为病斑的面积。通过矩形框尺寸的像素值与照片长、宽像素值的比值,以及照片实际尺寸,进而确定病斑实际面积。4.实验结果与分析识别原图:经过识别之后所得到苹果的图像:苹果直径检测原图:S分量二值化之后的苹果图像有缺陷的苹果原图:缺陷检测之后所识别的苹果表面伤痕:变质区域的外接矩形框根据伤痕的图形,可以用它的最大外接矩形框面积来近似确定实际面积。5.总结与体会实验初步实现了利用MATLAB技术对苹果的分离、苹果的大小(最大横切面直径)、苹果表面病斑面积等评定指标的检测判定,达到了预期目的。无论是在计算伤痕的实际面积还是苹果的大小时都采取了近似外接矩形框面积的方法,这样是存在一定误差的。实验的确相当复杂,但同样的在学习过程中也学到了很多东西。MATLAB的强大功能只在我们的面前展现出了冰山一角,相信在未来的学习中我会学到更多的东西。6.参考文献[1]张宏编著.图像处理