matlab的交通灯信号识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clc
clear all
close all
a=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=h>0.9|h<0.05;
bw1=bw1.*(s>0.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('检测图像');%读入图像并显示
hold on
for i=1:num
[r,c]=find(L==i);%返回的是L矩阵中数值为i的坐标
sizer=size(r,1);
bw_area(i)=length(r);
if bw_area(i)<200|bw_area(i)>10000
continue;
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);%计算圆形度
if bw_circle(i)<0.6
bw_center(i)=0;
continue; %去掉不够圆的区域
end
rectangle('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 %在原图上标记红色信号灯区域
hold off