Matlab水果识别——基于形态学处理的水果识别

  • 虫虫123456
    了解作者
  • matlab
    开发工具
  • 1.9KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 5 积分
    下载积分
  • 0
    下载次数
  • 2022-06-15 20:56
    上传日期
Matlab水果识别——基于形态学处理的水果识别
Untitled.rar
  • Untitled.m
    5.3KB
内容介绍
%matlab基于形态学水果识别 clear clc [filename,filepath]=uigetfile('*.bmp',' '); if ~isequal(filename,0) path=strcat(filepath,filename); img=imread(path); else msgbox('请选择水果图片!','提示','warn'); end %% %%进行图像的二值化 I2=rgb2gray(img);%灰度图像 BW=im2bw(I2,0.9);%图像像素大于0.9的替换为1(白),其他替换成0(黑) figure,imshow(BW) %% %%进行边缘提取 SE=strel('rectangle',[40 30]);%创建一个平坦的矩形结构,指定大小40*30 J2=imopen(BW,SE); %形态开运算,去除噪声和平滑边界 SE=strel('square',3);%定义一个正方形结构元素,指定边长3 J=imerode(~J2,SE);%对图像进行腐蚀 BW2=(~J2)-J;%得到物体边缘 B=imfill(BW2,'holes');%填充图像中的孔 B=bwmorph(B,'remove');%删除内部像素以保留形状轮廓。 figure,imshow(B) %% %%进行水果分类 [Label,num] = bwlabel(B);%8连通寻找区域,num为连通区域总数,Label为返回一个和B大小相同的矩阵,包含了标记了每个连通区域的类别标签 for i = 1 : num Area(i) = 0;%得到0序列Area end Label = imfill(Label,'holes');%填充图像中的孔 HSV = rgb2hsv(img);%将 RGB 颜色转换为 HSV [row,col] = size(Label);%得到Label图像像素的大小row和col MeanHue = zeros(1,num); %初始化 for i = 1 : num Hue = zeros(Area(i),1); %初始化 nPoint = 0; %初始化 for j = 1 : row for k = 1 : col if(Label(j,k) == i) nPoint = nPoint + 1; %对于是连通区域中的点npoint+1. Hue(nPoint,1) = HSV(j,k,1); %遍历更新HSV的色度值 end end end Hue(:,i) = sort(Hue(:,1));%进行升序排序 for j = floor(nPoint*0.1) : floor(nPoint*0.9) MeanHue(i) = MeanHue(i) + Hue(j,1); %将hsv(i)的值赋给MeanHue(i) end MeanHue(i) = MeanHue(i) / (0.8*nPoint); %计算得到平均色度值 end [L,num]=bwlabel(BW2); %重新进行区域标记。 stats= regionprops(L,'ALL');%度量L区域属性 for i= 1:num longth(i)=stats(i).MajorAxisLength;%长轴转换成与区域stats具有相同标准二阶中心矩的椭圆的长轴长度 width(i)=stats(i).MinorAxisLength;%短轴转换成与区域stats具有相同标准二阶中心矩的椭圆的短轴长度 end R2=0;G2=0;B2=0; x=0;y=0;%初始化 for i=1:num r(i)=0; g(i)=0; b(i)=0; yuan(i)=longth(i)/width(i);%长轴比上短轴,得到似圆性特征 end %获得以每个水果重心为中心点的边长为30的正方形内的像素的rgb值 for i=1:num for j=(round(stats(i).Centroid(1))-15):(round(stats(i).Centroid(1))+15) for k=(round(stats(i).Centroid(2))-15):(round(stats(i).Centroid(2))+15) R2=im2double(img(j,k,1));%转换为double类型 G2=im2double(img(j,k,2)); B2=im2double(img(j,k,3)); r(i)=r(i)+R2; g(i)=g(i)+G2; b(i)=b(i)+B2; end end r(i)=r(i)/900; g(i)=g(i)/900; b(i)=b(i)/900; end %求出水果中面积最大值用于判定 for i=1:num if(stats(i,1).Area>x) x=stats(i,1).Area; end end %求出水果中hsv的最小值用于判定 y=MeanHue(1); for i=1:num if(y>MeanHue(i)) y=MeanHue(i); end end imshow(img); hold on; %分类算法分别如下 for i=1:num if(MeanHue(i)==y && yuan(i)>1.3 && r(i)>0.7 && g(i)>0.7) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','梨子!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end for i=1:num if(r(i)>0.75 && yuan(i)<1.15 && g(i)<0.4 && b(i)<0.3) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','苹果!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end for i=1:num if(MeanHue(i)<0.6 && yuan(i)<1.25 && r(i)>0.7 &&b(i)>0.1) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','桃子!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end for i=1:num if(MeanHue(i)<0.2 && yuan(i)>1.7) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','香蕉!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end for i=1:num if(MeanHue(i)<0.3 && yuan(i)>1.4&& r(i)<0.8 ) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','菠萝!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end for i=1:num if( stats(i,1).Area==x && yuan(i)<1.25&& r(i)<0.4) %普通对话框 h=dialog('name','识别结果','position',[700 400 200 70]); uicontrol('parent',h,'style','text','string','西瓜!','position',[50 40 120 20],'fontsize',12); uicontrol('parent',h,'style','pushbutton','position',... [80 10 50 20],'string','确定','callback','delete(gcbf)'); end end
评论
    相关推荐