%1读取原图,并处理成二值图像I=imread('C:\Users\john\Desktop\qq.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('二值图像');%2进行边缘检测得到了不连续的图形边界(采用sobel算子或区域增长)%3得到各个图形的连续边界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('提取出的边界图像');%3-2将不同的图形进行分别标记,num表示连接的图形对象的个数[Label,num]=bwlabel(B,8);%得到各个图像的边界像素的数组%4计算各个图形单元的周长用连接像素点或数边界像素点个数的方法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%6计算各个图形单元的圆度fori=1:numEcllipseratio(i)=4*pi*Area(i)/Premeter(i)^2;end%7计算各个图像的颜色(色度)HSV=rgb2hsv(I);%转换为HSV,为后面的颜色元素的提取做准备[row,col]=size(FilledLabel);%统计填充后的图形中各块图形所含像素的个数的多少MeanHue=zeros(1,num);fori=1:numHue=zeros(Area(i),1);nPoint=0;forj=1:rowfork=1:colif(FilledLabel(j,k)==i)nPoint=nPoint+1;Hue(nPoint,1)=HSV(j,k,1);endendendHue(:,i)=sort(Hue(:,1));forj=floor(nPoint*0.1):floor(nPoint*0.9)MeanHue(i)=MeanHue(i)+Hue(j,1);endMeanHue(i)=MeanHue(i)/(0.8*nPoint);%计算出平均的色度值end%8识别桃%8-1构建桃的分类器,在二维特征空间对各个图像进行类别区分pitch=0;fori=1:numif(MeanHue(i)0.5)%分类器识别桃的准则:判断各个图形中平均色度值大于0.5的为桃pitch=i;endend%8-2对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作pitchHSV=HSV;[row,col]=size(FilledLabel);%统计填充后的图形中各块图形所含像素的个数的多少%MeanHue=zeros(1,num);forj=1:rowfork=1:colif(FilledLabel(j,k)~=pitch)%pitchHSV(j,k,2)=0;pitchHSV(j,k,3)=0;endendend%8-3变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别pitchmatrix=hsv2rgb(pitchHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下桃figure,imshow(pitchmatrix),title('水果类别一:桃子');%9识别菠萝%9-1构建菠萝的分类器,在二维特征空间对各个图像进行类别区分pineapple=1;mazarea=Area(1);fori=1:numif(mazareaArea(i))%分类器识别桃的准则:判断各个图形中面积最大的为菠萝mazarea=Area(i);pineapple=i;endend%9-2对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作pineappleHSV=HSV;forj=1:rowfork=1:colif(FilledLabel(j,k)~=pineapple)%pitchHSV(j,k,2)=0;pineappleHSV(j,k,3)=0;endendend%9-3变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别pineapplematrix=hsv2rgb(pineappleHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下菠萝figure,imshow(pineapplematrix),title('水果类别二:菠萝');%10识别香蕉%101构建香蕉的分类器,在二维特征空间对各个图像进行类别区分banana=0;fori=1:numif((Ecllipseratio(i)0.5))%分类器识别桃的准则:判断各个图形中平均圆率值小于0.5的为香蕉banana=i;endend%102对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作bananaHSV=HSV;forj=1:rowfork=1:colif(FilledLabel(j,k)~=banana)%pitchHSV(j,k,2)=0;bananaHSV(j,k,3)=0;endendend%103变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别bananamatrix=hsv2rgb(bananaHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下香蕉figure,imshow(bananamatrix),title('水果类别三:香蕉');%11识别梨%11-1构建梨的分类器,在二维特征空间对各个图像进行类别区分pear=0;fori=1:numif(MeanHue(i)0.125)%分类器识别桃的准则:判断各个图形中平均色度值小于0.125的为梨pear=i;endend%11-2对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作pearHSV=HSV;forj=1:rowfork=1:colif(FilledLabel(j,k)~=pear)%pitchHSV(j,k,2)=0;pearHSV(j,k,3)=0;endendend%11-3变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别pearmatrix=hsv2rgb(pearHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下梨figure,imshow(pearmatrix),title('水果类别四:梨');%12识别苹果%12-1构建苹果的分类器,在二维特征空间对各个图像进行类别区分apple=0;fori=1:numif((Ecllipseratio(i)1.25)&(Ecllipseratio(i)1.0))%分类器识别桃的准则:判断各个图形中圆度居于1.0与1.25之间的的为苹果apple=i;endend%12-2对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作appleHSV=HSV;forj=1:rowfork=1:colif(FilledLabel(j,k)~=apple)%pitchHSV(j,k,2)=0;appleHSV(j,k,3)=0;endendend%12-3变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别applematrix=hsv2rgb(appleHSV);%转换为RGB彩图,彩图中已经滤去了其余水果,只剩下苹果figure,imshow(applematrix),title('水果类别五:苹果');