您的当前位置:首页正文

交通灯识别

2022-10-22 来源:易榕旅网
 学 专 姓 学 指 导

交通灯的识别

院 :

电气信息学院

业 : 医学信息工程 名 : 王 林 号 : 2013141444014

教 师 :

张劲

一、实验目的

输入一幅彩色rgb含有交通灯的图像,利用matlab构建程序在这幅rgb图像中找到红绿灯并识别颜色。

二、实验思路

得到一幅rgb图像,要在其中找出红绿灯的位置,然后根据r,g,b各分量得出结果。

图像识别中最难的是找到感兴趣的地方,并定位它,在这里比较简单,我们在识别一幅图像时,可以根据它本身的特点来进行划分,比较简单的得到我们感兴趣的部分。

然后将我们感兴趣的部分从原图像中抠出来,判断这个图像的rgb分量,得出结果。

三、实验步骤

我们的原图像

第一步,读取交通灯图像,边界提取,这里我们选用的是Canny算子,程序如图;

clc,clear; close all;

f=imread('1.jpg');

figure,imshow(f);title('原图'); g1=rgb2gray(f);

g2=edge(g1,'Canny');

figure,imshow(g2);title('边界提取'); 得到图像

第二步,

利用bwboundaries函数例程,得到连通域图像,我们感兴趣的部分就包含在里边,这时候我们得到下图

从图中看出来我们感兴趣的区域在中间是中等大小,这时候想到函数bwareaopen,它的作用是将面积小于一定值的连通区域删去,我们可以找到函数g2,看到我们感兴趣的区域k1=64,k2=117.从而先去除小于117的得到g31,用g2减去g31得到g32,得到1-116大小的连通,对g32再用一次bwareaopen,消去小于63的连通,得到下图

[B,L,N,A] = bwboundaries(g2);

for k=1:length(B), if(~sum(A(k,:)))

boundary = B{k};

g2(min(boundary(:,1)):max(boundary(:,1)),min(boundary(:,2)):max(boundary(:,2)))=false;

for l=find(A(:,k))' boundary = B{l};

g2(min(boundary(:,1)):max(boundary(:,1)),min(boundary(:,2)):max(boundary(:,2)))=true;

end end end

figure,imshow(g2); g31=bwareaopen(g2,120); g32=g2-g31;

g3=bwareaopen(g32,63);

figure,imshow(g3); %在二值图像中提取出感兴趣部分

第三步,将原始图像中感兴趣的部分抠出来,我们将原图的rgb分量各做图形,与标记图像g3相乘,得到三个图像,g4=cat(3,r,g,b)相加得到被标记的图像。 程序如下, r = f(:,:,1); for x=1:1:220

for y=1:1:329

if g3(x,y)==1 r(x,y)=r(x,y); else r(x,y)=0; end end end

g = f(:,:,2); for x=1:1:220

for y=1:1:329 if g3(x,y)==1

g(x,y)=g(x,y); else g(x,y)=0; end end end

b = f(:,:,3); for x=1:1:220

for y=1:1:329 if g3(x,y)==1

b(x,y)=b(x,y); else b(x,y)=0; end end end

g4=cat(3,r,g,b); figure

imshow(g4) 得到图像

第四步将被标记的图像转换到hsv图像,这时我们逐个检测每个点的h分量, h属于0-15记为红+1属于105-135标记为绿色+1属于45-75标记为黄色+1 最后判断那个值同时大于另外两个既得到结果 hsv_f = rgb2hsv(g4); H = hsv_f(:,:,1)*255; S = hsv_f(:,:,2)*255; V = hsv_f(:,:,3)*255; [y,x,z]=size(g4); Red_y=zeros(y,1); Green_y=zeros(y,1); Yellow_y=zeros(y,1); for i=1:y for j=1:x

if(((H(i,j)>=0)&&(H(i,j)<15)) &&(V(i,j)>50)&&(S(i,j)>30)) Red_y(i,1)= Red_y(i,1)+1;

elseif(((H(i,j)>=105)&&(H(i,j)<135)) &&(V(i,j)>50)&&(S(i,j)>30)) Green_y(i,1)= Green_y(i,1)+1;

elseif(((H(i,j)>=45)&&(H(i,j,1)<75)) &&(V(i,j)>50)&&(S(i,j)>30)) Yellow_y(i,1)= Yellow_y(i,1)+1; end end end

Max_Red_y=max(Red_y); Max_Green_y=max(Green_y); Max_Yellow_y=max(Yellow_y);

if (Max_Red_y>Max_Green_y)&&(Max_Red_y>Max_Yellow_y) disp('红灯');

else if (Max_Green_y>Max_Red_y)&&(Max_Green_y>Max_Yellow_y)

disp('绿灯');

else if(Max_Yellow_y>Max_Red_y)&&(Max_Yellow_y>Max_Green_y) disp('黄灯'); end end End

四.实验结果

原图

结果

五.实验总结

这个程序只能应用于这一幅图像在其他图像上很容易失误,数字识别没有做出来,总之做这个东西还是用到了很多图像处理的知识,思路借鉴了其他同学的一些想法,不过还是学到了很多东西,接下来还是要把数字识别,和定位方面的问题解决。

因篇幅问题不能全部显示,请点此查看更多更全内容