一、简介
基于matlab交通信号标志识别系统,社会步入了人工智能的高速发展时代,其中机器视觉的发展是人工智能面向用户交流体验的关键,机器对目标检测与识别是人工智能的“慧眼”。智能汽车需要有效地识别路侧的交通标志识别牌辅助汽车驾驶运行,但是在自然采集的原始图像环境复杂容易影响交通标志的检测识别,需要对原始图像增强预处理提高目标识别率。本文设计了基于 BP 神经网络的交通标志识别系统,并对不同的交通标志进行颜色模型分类,将预处理后的交通标志提取出来与训练模板进行训练识别交通标志,为智能汽车提供慧眼。
二、部分源码
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject 按钮1的句柄
% eventdata 保留-在未来的MATLAB版本中定义
% handles 具有句柄和用户数据的结构(参见GUIDATA)
%% 读图
[filename, cd1] = uigetfile( ...
{'*.tif;*.TIF;*.JPG;*.jpg;*.bmp;*.BMP;*.jpeg;*.JPEG;','Image file';...
'*.*', 'All file (*.*)'},'Pick an Image');
axes(handles.axes1);
cla;%清除坐标系,相当于初始化axes
axes(handles.axes2);
cla;
axes(handles.axes3);
cla;
axes(handles.axes4);
cla;
if filename
cd(cd1);%目录
d = imread(filename);%获取图片数据
cd(handles.cd0);
handles.I = d;
axes(handles.axes1);%创建坐标系
imshow(d);%显示灰度图
handles.filename = filename;
box on;%显示右边和上边框
end
handles.Color = 0;
cd(handles.cd0);
set(handles.text2,'string','');
guidata(hObject, handles);
% 执行按钮按下按钮2。
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject 按钮2的句柄
% eventdata 保留-在未来的MATLAB版本中定义
% handles 具有句柄和用户数据的结构(参见GUIDATA)
%% 提取标志
% 按照颜色来分
Color = 0; % 颜色标记 1是红 2 是蓝 3是黄色
i
case 1 %红
DI = Image(:,:,1);%灰度图
GI = (Image(:,:,1)>110 & Image(:,:,2)<150 & Image(:,:,3)<150 ...
& abs(double(Image(:,:,2))-double(Image(:,:,3)))<50 & abs(double(Image(:,:,1))-double(Image(:,:,2)))>30);
%二值图
case 2 %蓝
DI = Image(:,:,3);
GI = (Image(:,:,1)<100 & Image(:,:,2)<150 & Image(:,:,3)>120 ...
& abs(double(Image(:,:,2))-double(Image(:,:,3)))>30);
case 3 %黄
DI = rgb2gray(Image); %灰度图
GI = (Image(:,:,1)>160 & Image(:,:,2)>90 & Image(:,:,3)<90 ...
& abs(double(Image(:,:,1))-double(Image(:,:,2)))<100 & abs(double(Image(:,:,1))-double(Image(:,:,3)))>90);
end
axes(handles.axes2);
imshow(DI);
axes(handles.axes3);
imshow(GI);
handles.GI = GI;
guidata(hObject, handles);
% 执行按钮按下按钮3。
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject 按钮3的句柄
% eventdata 保留-在未来的MATLAB版本中定义
% handles 具有句柄和用户数据的结构(参见GUIDATA)
% 分割标志
d = handles.GI;
se = ones(3); % 腐蚀膨胀模版 三行三列的全1矩阵
imshow(d)
d =imdilate(d,se);%膨胀
d = bwareaopen(d,100); % 移除小对象 小区域肯定是噪声
%删除小面积对象 作用:删除二值图像d中面积小于100的对象,默认情况下使用8邻域
L = bwlabel(d,8); %标记连通 8连通
%L = bwlabel(BW,n)
% 返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,
% 这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8
Num = max(max(L)); % 有几个区域 返回行--个
S = zeros(1,Num); %1*num的全零矩阵
for i = 1:Num
S(i) = sum(sum(L == i));%列求和
end
[S,id] = sort(S,'descend'); %降序排列 id和S的size一样大
%[B,IX]=sort(A,...):IX为排序后备元素在原矩阵中的行位置或列位置的索引,
%为与A同样大小的标量矩阵,且每行(dim=2)或每列(dim=1)遍布1:行数m,或遍布1:列数n
Ran = zeros(Num,4); % 范围
Fig = zeros(1,Num); % 长宽比
for i = 1:Num
[ix,iy] = find(L == id(i));%寻找非零元素的索引和值
Ran(i,:) = [min(ix),max(ix),min(iy),max(iy)]; % 每一个区域的范围
end
for i 1:Num
Fig(i) = max(Ran(i,2)-Ran(i,1),Ran(i,4)-Ran(i,3))/min(Ran(i,2)-Ran(i,1),Ran(i,4)-Ran(i,3));
end
in = 0;
for i = 1:Num
if Fig(i) < 1.5 % 长宽比是接近1的 所以不会太离谱
in = i;
break;
end
end
if in == 0
in = 1; % 如果都不满足就认定面积最大的一个了 这时候肯定是有干扰的
end
if handles.Color ~= 3
xmin = Ran(in,1);
xmax = Ran(in,2);
ymin = Ran(in,3);
ymax = Ran(in,4);
II = handles.I(xmin:xmax,ymin:ymax,:);
elseif handles.Color == 3 % 黄色的多切一点 有黑色边框
xmin = Ran(in,1)-round((Ran(in,2)-Ran(in,1))*0.15);
xmax = Ran(in,2)+round((Ran(in,2)-Ran(in,1))*0.15);
ymin = Ran(in,3)-round((Ran(in,4)-Ran(in,3))*0.15);
ymax = Ran(in,4)+round((Ran(in,4)-Ran(in,3))*0.15);
II = handles.I(xmin:xmax,ymin:ymax,:);
end
axes(handles.axes4);
imshow(II);
handles.Divice = II;
guidata(hObject, handles);
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信