车牌识别系统设计
随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点。智能交通系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控、管理和指挥交通的目的。因此,它已成为世界交通领域研究的重要课题。 车牌识别系统作为智能交通系统的一个重要组成部分,已在高速公路、城市交通和停车场等项目的管理中占有无可取代的重要地位。它在不影响汽车状态的情况下,由计算机自动完成车牌的识别,从而降低交通管理工作的复杂度。
一、车牌识别的模块构成
预处理
车牌图像采集
边缘图像预处理
车牌定位
车牌字符分割
车牌识别
1.1 车牌识别过程
各个模块设计研究内容:
1.车牌图像采集:正常摄像头采集图像即可
2图像预处理:汽车牌照中的字符主要由有限汉字、字母和数字组成,采用固定的印刷体格式。由于正常采集的图像是真彩图像,而且会受采集设备和采集角度的影像,使得图像的质量良莠不齐,其背景和噪声会影响字符的正常分割和识别,所以在对图像进行车牌分割和识别处理之前,需要对车牌图像进行预处理。(预处理是在进行正常图像处理前重要的一步,这关乎图像的识别效率)预处理操作包括灰度变换(使得RGB三通道转变为单通道,减少影响)、边缘检测、腐蚀、填充、形态滤波等预处理操作(这些都是图像基本操作)
原始图像
灰度图像变换
边缘检测
腐蚀
填充
结果显示
1.2 车牌预处理流程
效果图
function [ dw ]= cpdw( I )
subplot(3,2,1),imshow(I),title('原始图像');
I1=rgb2gray(I);%转化为灰度图像
subplot(3,2,2),imshow(I1),title('灰度图像');
I2=edge(I1,'roberts',0.09,'both');%采用robert算子进行边缘检测
subplot(3,2,3),imshow(I2),title('边缘检测后图像');
se=[1;1;1];
I3=imerode(I2,se); %腐蚀图像
subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);%图像聚类、填充图像
subplot(3,2,5),imshow(I4),title('填充后图像');
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
subplot(3,2,6),imshow(I5),title('形态滤波后图像');
[y,x,z]=size(I5);
I6=double(I5);
Y1=zeros(y,1);
for i=1:y
for j=1:x
if(I6(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1;
end
end
end
[temp MaxY]=max(Y1);
%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Y1(PY2,1)>=100)&&(PY2<y))
PY2=PY2+1;
end
IY=I(PY1:PY2,:,:);
X1=zeros(1,x);
for j=1:x
for i=PY1:PY2
if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
%%%%%求的车牌的列起始位置和终止位置%%%%%%
PX1=1;
while ((X1(1,PX1)<3)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-1;
PX2=PX2+1;
%%分割出车牌图像%%
dw=I(PY1:PY2,PX1:PX2,:);
end
3.车牌字符定位:车牌定位的出发点是利用车牌区域的特征来判断车牌,将车牌区域整幅车辆图像分割出来。在车牌识别过程中,定位的成功以及准确程度将会直接影响后期车牌识别的准确程度。车牌识别涉及到的方法有:基于边缘检测的方法、区域生长法,构造灰度模型法,二值图像的数学形态运算法,灰度图像的数学形态运算法,自适应边界搜索法,DFT变换法,模糊聚类法等,这里采用边缘检测法.。首先对车牌的二值图片进行形态学滤波,然后根据图片的连通区域进行筛选,获取车牌具体位置,提取图片中的车牌区域。
原始图像
图像预处理
边缘算子及其二值
车牌定位
1.3 车牌定位流程
效果图
function [PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6] = zffg(I)
dw=cpdw(I);%车牌定位
figure(2);
subplot(3,2,1),imshow(dw),title('定位剪切后车牌图像')
I1 = rgb2gray(dw); %将RGB图像转化为灰度图像
subplot(3,2,2),imshow(I1),title('车牌灰度图像')
g_max=double(max(max(I1)));
g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值
[m,n]=size(I1);% d:二值图像
I1=im2bw(I1,T/256);
subplot(3,2,3);
imshow(I1),title('二值化车牌图像');
I1=bwareaopen(I1,20);
subplot(3,2,4);
imshow(I1),title('中值滤波后的二值化图像');
[y1,x1,z1]=size(I1);
I3=double(I1);
TT=1;
%%%%%% 分割字符按行积累量%%%%%
X1=zeros(1,x1);
for j=1:x1
for i=1:y1
if(I3(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
figure(3);
plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');
Px0=1;
Px1=1;
4.车牌字符分割:字符分割是指将车牌区域分割成若干个单个的字符区域, 把单个有意义的字符从字符串中提取出来,作为独立的字符图像。字符分割的成败直接影响到单字的识别效果,如果分割出的字符出现了断裂、粘连,则会使得识别效果变差甚至难以识别。本次采用垂直投影字符分割方法,即先将图像二值化,然后进行水平倾斜以及垂直倾斜校正,去除噪声,然后将车牌像素灰度值按垂直方向累加,即所谓的垂直投影。由于字符块的垂直投影必然在字符间距或字符内的间隙处取得局部最小值,因此分割位置应该在局部最小值处。(可以改进为先水平投影去除水平边框,再进行垂直投影,此时对投影分析可知,与最大峰中心对应的应为车牌中第二个字符和第三个字符的分割,与第二大峰中心距离对应的即可视为车牌字符的宽度,并以此作为分割依据)。
效果图
%%%%%%%%%%%%分割字符%%%%%%%%%%%%%
for i=1:7
while ((X1(1,Px0)<3)&&(Px0<x1))
Px0=Px0+1;
end
Px1=Px0;
while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<15))
Px1=Px1+1;
end
Z=I1(:,Px0:Px1,:);
switch strcat('Z',num2str(i))
case 'Z1'
PIN0=Z;
case 'Z2'
PIN1=Z;
case 'Z3'
PIN2=Z;
case 'Z4'
PIN3=Z;
case 'Z5'
PIN4=Z;
case 'Z6'
PIN5=Z;
otherwise
PIN6=Z;
end
figure(4);
subplot(3,7,i);
imshow(Z);
Px0=Px1;
q=imresize(Z,[45 20]);%将字符图片统一划为50*20大小
%figure(5);
subplot(3,7,i);
imshow(q);
%figure();
subplot(3,7,i);
imshow(q);
end
imwrite(PIN0,'.\3\0.jpg','jpg');
imwrite(PIN1,'.\3\1.jpg','jpg');
imwrite(PIN2,'.\3\2.jpg','jpg');
imwrite(PIN3,'.\3\3.jpg','jpg');
imwrite(PIN4,'.\3\4.jpg','jpg');
imwrite(PIN5,'.\3\5.jpg','jpg');
imwrite(PIN6,'.\3\6.jpg','jpg');%这里将分割后的字符图片读入新建的文件夹3中
5.车牌字符识别:神经网络/模板匹配
本次采用BP神经网络,BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。BP神经网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。
①节点输出模型:
隐节点输出模型:Oj=f(∑Wij×Xi-qj)
输出节点输出模型:Yk=f(∑Tjk×Oj-qk)
f-非线形作用函数;q -神经单元阈值
②作用函数模型:作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid函数: f(x)=1/(1+e)
③误差计算模型:误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:Ep=1/2×∑(tpi-Opi)
tpi- i节点的期望输出值;Opi-i节点计算输出值
④自学习模型:神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵Wij的设定和误差修正过程。BP网络有导师方式-需要设定期望值和无导师学习方式-只需输入模式之分。自学习模型为
△Wij(n+1)= h ×Фi×Oj+a×△Wij(n)
h -学习因子;Фi-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。下图为BP神经网络结构
图 1 BP神经网络结构
由于一般的车牌均由汉字、英文字母和数字组成,根据车牌上的字符特点,再用BP神经网络进行训练和识别时,所选用的样本需包含这些特点,在本次实验中由于待识别车牌数量有限,所得到的车牌字符有限,所以只对汉字渝、数字0-9和字母A、L、M、N、R这几个字符进行训练,训练样本存在文件夹2中。
字符识别结果:
效果图
总结:汽车牌照的自动识别技术作为智能交通的一部分已经得到了越来越广泛的应用,良好的自动识别技术对现代化交通来说具有重要意义。本设计运用神经网络算法对汽车牌照进行识别,实现了对车牌预处理,车牌定位车牌分割,车牌识别,处在的不足在于,由于不同的汽车牌照其倾斜度和所在位置不一,对于不同的车牌需要改变分割参数才能实现。
补充:可以采用模板匹配识别,首先建立标准字库,再将分割所得到的字符进行归一化处理,将归一化处理后的字符与标准库里的字符进行注意比较,最后将误差最小的字符作为识别结果显现出来。最后可以做GUI界面,做两种方法的对比。(下个博客实现)