clcclearallclosealla=imread('x.jpg');figure(1),imshow(a);title('检测图像');%读入图像并显示hsv=rgb2hsv(a);h=hsv(:,:,1);s=hsv(:,:,2);v=hsv(:,:,3);figure(2),imshow(hsv);title('HSV图像');%转换为hsv图像并显示bw1=h0.9|h0.05;bw1=bw1.*(s0.5);%检测红色区域se=strel('disk',3);%创建一个指定半径R的平面圆盘形的结构元素bw2=imopen(bw1,se);%用结构元素SE实现二值图像的bw1的形态开运算。SE可以是单个结构元素对象或者结构元素对象数组。bw2=bwfill(bw2,'holes');%空洞填充,填充二进制图像的背景色%%%figure%%%imshow(bw2)[L,num]=bwlabel(bw2,8);%标记各区域,这里num返回的就是BW2中连通区域的个数。STATS=regionprops(L,'area','BoundingBox');%%对二值化数据进行连通域数据分析获取标记后的图像面积。外接长方形、和面积bw_area=zeros(1,num);bw_circle=zeros(1,num);%%%bw_center=zeros(num,2);figure(1),imshow(a);title('检测图像');%读入图像并显示holdonfori=1:num[r,c]=find(L==i);%返回的是L矩阵中数值为i的坐标sizer=size(r,1);bw_area(i)=length(r);ifbw_area(i)200|bw_area(i)10000continue;end%去掉过大过小区域bw_center=[];bw_center(1:sizer,1)=round(mean(r));%行坐标,求区域中心;mean(A)求每一列的均值;Round返回按指定位数进行四舍五入的数值bw_center(1:sizer,2)=round(mean(c));%列坐标rc=[r,c];d=sqrt(sum((rc'-bw_center').^2));%计算区域中各点到中心的距离max1=max(d);%求最大距离bw_circle(i)=bw_area(i)/(pi*max1*max1);%计算圆形度ifbw_circle(i)0.6bw_center(i)=0;continue;%去掉不够圆的区域endrectangle('Position',floor(STATS(i).BoundingBox),'EdgeColor','g','linewidth',3);%%取最大一个的外接长方形作为目标位置x=round(STATS(i).BoundingBox(1)+0.5*STATS(i).BoundingBox(3))-10;y=round(STATS(i).BoundingBox(2)+0.5*STATS(i).BoundingBox(4));text(x,y,'红色');end%在原图上标记红色信号灯区域holdoff