交通灯的识别
院 :
电气信息学院
业 : 医学信息工程 名 : 王 林 号 : 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
四.实验结果
原图
结果
五.实验总结
这个程序只能应用于这一幅图像在其他图像上很容易失误,数字识别没有做出来,总之做这个东西还是用到了很多图像处理的知识,思路借鉴了其他同学的一些想法,不过还是学到了很多东西,接下来还是要把数字识别,和定位方面的问题解决。
因篇幅问题不能全部显示,请点此查看更多更全内容