目录

一、项目背景与概要

1.1 项目背景

1.2 项目概要

二、颜色显著增强

2.1思路

2.2 算法实现

三、信号灯检测

3.1 思路

3.2 算法实现

四、信号灯识别

4.1 思路

4.2 颜色分类

4.3 形状判断-圆形

4.4 形状判断-箭头

4.5 实际识别

五、系统设计

六、总结与感悟

七、参考文献


  本文设计了一种基于Matlab的交通信号灯检测识别系统,主要包含颜色显著增强、信号灯检测与识别三个核心模块。系统通过RGB颜色空间分析,采用差分运算突出红、黄、绿三色特征,利用二值化和形态学处理定位信号灯区域。

  在识别阶段,结合颜色量化统计和圆形度属性判断,实现对信号灯颜色和形状(圆形/箭头方向)的准确分类。系统集成GUI界面,提供图像处理全流程可视化展示,最终输出包含颜色和形状的识别结果。

  实验表明,该系统能有效识别复杂环境下的交通信号灯,为智慧交通和无人驾驶提供了可行的技术方案。

一、项目背景与概要

1.1 项目背景

  在AI科技高速发展的今天,智慧交通和无人驾驶盛行。为了保障出行的安全,它们的一个重要课题就是进行交通信号灯的识别。在交通路口辨别交通信号灯是我们在交通出行的重要一个环节,只有具备成功识别信号灯的功能,新时代的智慧交通和无人驾驶才能逐步变成现实。

而我们对交通信号灯进行分析。日常的交通信号灯按照可以分为三类:红灯,黄灯和绿灯,它们分别具有不同的功能。红灯表示禁止通行,黄灯表示警示和慢行,绿灯表示允许通行。 

但实际上交通信号灯并不只是有颜色上的差别,实际上,它们也有形状上的差别,有时候交通信号灯显示的是方向箭头或者是数字。根据是否包含图案,交通信号灯可分为两类,一类是无图案的,一类是有图案的。那么我们的识别就要从颜色和图案入手,经过一系列处理,最终得到正确结果。

1.2 项目概要

我们小组设计的基于matlab的交通信号灯检测系统,可以在matlab的GUI界面里面进行红绿灯图像的读取,展示一系列的处理流程,如颜色的增强,信号灯的检测识别,最终结果的导出和显示。

 要求:(1)能通过交互按钮从文件夹里面读取图片文件

2能以颜色显著增强的算法定位出信号灯所在的区域

3能对信号灯区域进行检测和识别

4能进行识别结果的正确输出,包括颜色和图案。

二、颜色显著增强

2.1思路

    在一副图像中,除了信号灯之外,还有许多其他的元素,如路面,行人,轿车。我们想要对交通信号灯的图像进行处理,首先要定位到交通信号灯所处的位置。这个时候,我们就要分析交通信号灯的特征,找到特征才能方便进行位置定位。

以传统的机动车信号灯进行分析,是有红,黄,绿三个等位置间隔的圆形单元组成,呈现明显的颜色特征,我们可以通过对颜色特征进行分析,来定位信号灯所处的位置。

 在RGB颜色空间中,红绿蓝被称为三基色,图像的每一种颜色都可以由红绿蓝三基色按照一定的比例构成,而我们的目的就是突出红色,黄色,绿色的显著特性,得到红色,黄色,绿色的显著图。

我们对RGB三通道提取得到R,G,B分量,同时对图像进行灰度化得到亮度图V。将提取到的G分量减去V得到红色的显著图,将得到的G分量减去V得到绿色的显著图。

其中,黄色分量与蓝色分量互补,用255减去蓝色分量得到黄色分量。

2.2 算法实现

% 灰度分量
V = rgb2gray(img);
% 红绿黄分量
R = img(:,:,1);
G = img(:,:,2);
Y = 255-img(:,:,3);
% 红色显著图
xz_red = imsubtract(R,V);
xz_red = imadjust(xz_red, [0.35 0.55], [0 1]);
% 绿色显著图
xz_green = imsubtract(G,V);
xz_green = imadjust(xz_green, [0.10 0.30], [0 1]);
% 黄色显著图
xz_yellow = imsubtract(Y,255-V);
xz_yellow = imadjust(xz_yellow, [0.20 0.40], [0 1]);

我们用V = rgb2gray(img)来得到灰度图像,用R = img(:,:,1)来得到颜色分量,其中后面的1,2,3分别对应红色分量,绿色分量,蓝色分量。黄色分量由Y = 255-img(:,:,3)得到。

  使用xz_red = imsubtract(R,V)函数将灰度分量从红色分量中减去,再用imadjust函数进行调整,得到红色显著图,其他的两个颜色同样。

如图:

我们采用简单的差分运算,可以有效突出颜色的显著度,有利于快速定位出红灯,绿灯,黄灯的候选区。确定颜色分量。

我们对图像的颜色分量进行检测,得到红色,黄色,绿色显著图,其中的红色显著图有较为明显的亮点,说明对信号灯的定位成功,进入下一步的信号灯的检测与裁剪。

三、信号灯检测

3.1 思路

想要对交通信号灯进行识别,首先就要在检测过程中定位交通信号灯所处的局部位置。

我们可以通过通过二值化分割的方法来显著增强信号灯区域的对比度,然后进行裁剪,将图像中不属于交通信号灯的部分删去,只保留交通信号灯区域的图像。

最后再进行一定的形态学运算,如图像闭合,图像平滑和填充,最后输出局部图像。

3.2 算法实现

从表1可以看出,经过红色,黄色,绿色的显著增强后,红色信号灯区域呈现明显的亮度特点,我们进行信号灯候选区域的分割的比较简单的办法是

(1)直接进行二值化图像,将颜色分量高于阈值的像素点的灰度设置为1,将低于阈值的像素点的灰度设置为0。

(2)然后将二值化图作为蒙版送回原图像,进行图像分割。只保留下颜色分量大于一定阈值的图像位置,而删去其他部分。

(3)最后裁剪下来的图像,利用imclose()和imdilate()函数进行形态学闭合和形态学膨胀,有利于填充图像中的小孔和缝隙,对于连接邻近的对象即平滑对象边界非常有用。进行裁剪图像的输出。

% 二值化
bw = im2bw(handles.xz_red, graythresh(handles.xz_red)) + ...
im2bw(handles.xz_green, graythresh(handles.xz_green)) + ...
im2bw(handles.xz_yellow, graythresh(handles.xz_yellow));
bw = logical(bw);
% 形态学闭合
bw = imclose(bw, strel('disk', 9));
% 消除干扰区域
bw = bwareaopen(bw, 50);
% 形态学膨胀
bw = imdilate(bw, strel('disk', 9));
% 获取位置信息
stats = regionprops(bw, 'BoundingBox');
rect = round(cat(1, stats.BoundingBox));

进行实际测试如表2,对于我们的原图像,先进行二值化图像,得到红色显著区域,利用二值化图像来在原图像中定位红色显著区域所在的位置,用区域矩形进行标记可视化。最后进行裁剪。利用图像的膨胀算法来进行图像的填充和扩展,进行输出。

    上表说明信号灯检测的目标完成。

四、信号灯识别

4.1 思路

信号灯检测定位后,进行裁剪,可得到信号灯局部图像。最后结合信号灯的颜色特征和形状特征,可以进行分类识别。如颜色特征可采用局部图的红,黄,绿的颜色量化计数来分类识别。形状主要有圆形和箭头形两种。形状特征可采用圆形度属性来进行分类识别。最后可以结合信号灯区域的颜色特征和形状特征进行信号灯的分类识别

4.2 颜色分类

  采用颜色量化数统计的方法。参考第二章的颜色显著图的识别过程,我们可以对局部图做同样的颜色显著运算,得到三张二值化图像。最后统计红,黄,绿三个颜色显著图中的有效像素的数量,提取最多有效像素数量的显著图所属的颜色类别作为颜色判别的依据。关键代码如下。

% 区域裁剪
imi = imcrop(handles.I, rect(i,:));
% 亮度图
Vi = rgb2gray(imi);
% 红绿黄分量
Ri = imi(:,:,1);
Gi = imi(:,:,2);
Yi = 255-imi(:,:,3);
% 红色显著图
xz_redi = imsubtract(Ri,Vi);
xz_redi = imadjust(xz_redi, [0.3 0.6], [0 1]);
% 绿色显著图
xz_greeni = imsubtract(Gi,Vi);
xz_greeni = imadjust(xz_greeni, [0.1 0.2], [0 1]);
% 黄色显著图
xz_yellowi = imsubtract(Yi,255-Vi);
xz_yellowi = imadjust(xz_yellowi, [0.2 0.4], [0 1]);
% 计数统计
xzsi = {xz_redi, xz_yellowi, xz_greeni};
for k = 1 : 3
% 二值化
bwi_bin = im2bw(xzsi{k},graythresh(xzsi{k}));
% 颜色量化计数
color_numer(k) = sum(sum(bwi_bin));
end
% 提取计数最多的颜色
[~, ind] = max(color_numer);
cns = '红黄绿';
res = [res cns(ind) '-' xz '|'];
res_list{i} = [cns(ind) '-' xz];
end
axes(handles.axes4);
title(['识别结果:' res]);
handles.res_list = res_list;
guidata(hObject, handles);

 将三张颜色显著图进行二值化后对有效像素进行计数统计,提取计数最多的颜色作为颜色的识别结果。

4.3 形状判断-圆形

采用圆形度属性来进行判断。圆形度属性是衡量一个局部区域的圆形特征的一个参量。根据圆形信号灯,箭头信号灯的特点,我们知道圆形信号灯的圆形度属性远远大于箭头信号灯的圆形度属性,所以采用圆形度属性作为分类判别的依据。

圆形度的计算公式为其中Area表示区域面积,perimeter表示区域周长,当检测图形越接近圆形时,它的圆形度就越接近于1。当检测图形越不接近圆形时,它的圆形度就越接近于0。

代码如下。

% 提取信号灯的圆形度
bwi = imcrop(bw, rect(i,:));
stats = regionprops(bwi, 'Circularity');
circularity = stats(1).Circularity;
% 根据圆形度与1的绝对误差判断形状类别
if abs(circularity-1) < 0.1
xz = '圆';
else
xz = '箭头';

regionprops()函数可以来测量图像区域的属性,如面积,质心和边界框等。

我们可以用stats = regionprops(bwi, 'Circularity')来直接提取区域的圆形度属性。

其中,bw是我们在信号灯检测环节得到的裁剪图像,bwi是利用bwi=imcrop()函数在前图像bw基础上裁剪出来的矩形图像,圆形度circularity的判断是在bwi图像上进行的。

当圆形度circularity的值与1的差的绝对值小于0.1时,即abs(circularity-1) < 0.1时,就判断为圆形。否则就判断为箭头。

4.4 形状判断-箭头

我们由形状判断-圆形不通过而判断为箭头。对于箭头还要判断上下左右的比例,判断它是哪个方向的箭头。

根据交通信号灯的标准,箭头一共有三个方向,向左,向右,向上。

我们可以采用十字网格对箭头进行拆分,如果是朝右的箭头,按照左右拆分的方法,计算两侧的像素比例,则可以发现右侧的像素数量比上左侧的像素数量得到的比例值远远大于1,而其他方向的箭头不能得到这样的效果,故可以作为朝右的箭头的一个分类依据。

朝左的箭头的图像进行左右拆分,则左侧的像素数量比上右侧的像素数量得到的比例值远大于1,而其他方向的箭头不能得到这样的效果。故可以成为朝左箭头的一个分类依据。

朝上的箭头的图像进行上下拆分,用上侧的像素数量比上下侧的像素数量得到的比例值远大1,而其他方向的箭头不能得到这样的效果,故可以成为朝上箭头的一个分类依据。

代码实现如下

% 均分裁剪
sz = size(bwi);
% 上区域
bwi_up = bwi(1:round(sz(1)/2), :);
% 下区域
bwi_down = bwi(1+round(sz(1)/2):end, :);
% 左区域
bwi_left = bwi(:, 1:round(sz(2)/2));
% 右区域
bwi_right = bwi(:, 1+round(sz(2)/2):end);
% 计算上下、左右、右左的比例
rate(1) = length(find(bwi_up(:)))/length(find(bwi_down(:)));
rate(2) = length(find(bwi_left(:)))/length(find(bwi_right(:)));
rate(3) = length(find(bwi_right(:)))/length(find(bwi_left(:)));
% 提取最大比例
[~, ind] = max(rate);
cns = '上左右';
res = cns(ind);
xz = [xz '-' cns(ind)];
end

首先进行区域划分,将图像分为上区域,下区域,左区域,右区域,然后分别计算三个分类标准的值。分别是(1)朝上箭头:上区域的像素数量/下区域的像素数量(2)朝左箭头:左区域的像素数量/右区域的像素数量(3)朝右箭头:右区域的像素数量/左区域的像素数量。

然后进行比较,用三个分类标准中,值最大的那个分类的箭头朝向作为识别的箭头的朝向。

4.5 实际识别

  对一副图像进行实际识别,先进行二值化图像得到信号灯模板,用来裁剪图像得到信号灯局部图,最后进行颜色判断和形状判断,输出结果为【红-箭头-左】,输出结果正确。

五、系统设计

我们为了进行友好的交互,将所有功能集成在一起并输出相应的处理结果,我们开发了一个GUI界面,命名为基于matlab颜色分割的道路信号灯检测识别系统。

我们在左侧的控制面板放置了六个按钮,集成了图像读取,颜色显著增强,信号灯检测,信号灯识别,信号灯导出等功能。在右侧的显示面板中放置了4个图像显示框,分别显示四幅处理过程中的图像。

在图像读取模块中,会打开选择文件对话框,将所选择的道路交通图进行读取,然后显示到右侧的原图像显示框中。

在颜色显著增强模块中,显示面板的四幅图像分别是原图像,红色显著图,黄色显著图,绿色显著图,对应着我们的颜色显著化处理环节。可以对红,绿,蓝三个分量进行显著增强,并显示出二值化后的显著图。

在信号灯检测模块中,显示面板中的四幅图像分别是原图像,二值化图,信号灯标志图,信号灯裁剪图,对应着我们的信号灯检测环节。它可以输出颜色显著区域的二值化图,并以显著颜色区域为模板进行区域标注,然后进行裁剪和图像形态学处理,并输出信号灯局部图。

在信号灯识别模块中,显示面板的四幅图像分别是原图像,二值化图,信号灯标记图,识别结果。它在信号灯检测模块的基础上,可以对信号灯裁剪图进行颜色识别和图形识别,判断是什么颜色的信号灯,是圆形信号灯还是箭头信号灯,并输出识别结果在信号灯裁剪图上方。

 在信号灯导出模块中,我们可以将识别结果以excel的形式导出,它对图像的基本信息,包括信号灯颜色,信号灯形状进行了汇总。

在退出程序模块可以退出程序。

六、总结与感悟

随着现代科学技术的发展,自动识别技术应用到了更为广阔的领域之中,而交通灯信号识别在无人驾驶和智慧交通方面具有相当广阔的应用前景。

我们的基于matlab的交通信号灯识别系统就是基于此目的研发的,我们小组在设计命题下来时,对如何针对这个课题进行系统开发交换了意见,包括如何提取出信号灯所在的局部图像的方法,以及如何对信号灯的颜色和形状特征进行分类识别两大研发重点进行讨论。

最终以像素阈值进行二值化的颜色显著算法获得了理想的结果。因为交通信号灯在图像上的最明显的特征就是它的颜色。所以我们用颜色显著图作为模板进行图像裁剪后,可以得到信号灯局部图像。

为了完善图像,我们还增加了图像闭合,图像膨胀运算等形态学运算,使裁剪出来的局部图效果良好。

在进行识别时,我们小组一致认为,进行有效像素的计数可以很好的进行三种颜色的分类。比如识别红灯时,我们程序里红色显著图的有效像素数量便远远大于绿色显著图和黄色显著图的有效像素数量。用这个方法可以得到很好的分类结果。

在进行图案识别时,在如何识别箭头方向上,我们查阅了很多资料,最终获得了灵感,可以通过对半划分,比较两半的像素比例值来得到箭头方向。

确定下各种算法和实现流程之后,我们收集了街道上的交通灯拍照进行识别,分模块测试,确认系统的运行。

为了能提供一个良好的交互界面和集成所有功能,我们设计了一个GUI界面,布置按钮和显示框图,将所有功能集成在上面运行,最终得到了一个关于基于matlab的交通信号灯识别系统的完整设计。

在这次课程设计之中,我们收获了非常多。包括查阅资料的过程中,我们掌握了matlab的很多函数的用法,以及函数的输入格式。也掌握了关于一个完整的系统设计的全流程,最终得到了一个满意的结果。在这个过程中,离不开全组员的共同努力和提供意见。

七、参考文献

[1] 汪应洛. 信号识别与系统[M]. 第3版. 北京: 机械工业出版社, 2003: 471-472.

[2] Hu S S. The principle of automatic control[M]. 5th ed. Beijing: Science Press, 2007: 471-472.

[3] 周坤玲. 基于matlab的图形识别与建模[D]. 北京: 北京交通大学, 2013

[4] 周美立. 相似性科学[M]. 北京: 科学出版社, 2004

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐