基于神经网络的车牌识别.docx
《基于神经网络的车牌识别.docx》由会员分享,可在线阅读,更多相关《基于神经网络的车牌识别.docx(24页珍藏版)》请在冰豆网上搜索。
![基于神经网络的车牌识别.docx](https://file1.bdocx.com/fileroot1/2023-7/9/297d29ae-34ac-4785-af74-9a0c1b685bb7/297d29ae-34ac-4785-af74-9a0c1b685bb71.gif)
基于神经网络的车牌识别
车牌识别系统设计
摘要:
车牌识别系统(LicensePlateRecognition,简称LPR)是智能交通系统(ITS)的核心组成部分,在现代交通管理系统中发挥着举足轻重的作用。
本文运用神经网络算法从车牌图像预处理、车牌定位、车牌字符分割和车牌字符识别这几个方面对车牌识别技术进行研究,运用MATLAB仿真,实现对车牌识别系统的设计。
关键词:
神经网络算法,图像预处理,车牌定位,车牌字符分割,车牌识别
DesignofLicensePlateRecognitionSystem
Abstract:
LicensePlateRecognitionSystem(LPR)isthecorecomponentofIntelligentTransportationSystems(ITS).LPRplaysanimportantroleinamoderntrafficmanagementsystem.Thispaperappliedneuralnetworkalgorithmtothelicenseplateimagepre-processing,licenseplatelicenseplatecharactersegmentationandcharacterrecognitiontostudythelicenseplaterecognitiontechnology.TheseaspectsoflicenseplaterecognitiontechnologyarestudiedwithMATLABsimulationtoachievethedesignofthelicenseplaterecognitionsystem.
Keywords:
neuralnetworkalgorithms,imagepre-processing,licenseplatelocation,licenseplatecharactersegmentation,licenseplaterecognition
一.引言
随着我国经济的快速发展,人民生活水平的不断提高,私有车辆越来越多,对交通控制、安全管理的要求也日益提高,智能交通管理(IntelligenceTransportationSystem,简称ITS)已成为当前交通管理发展的主要方向,而车牌识别技术(LPR)作为智能交通系统的核心,起着举足轻重的作用,利用该技术可以实现对车辆的自动登记、验证、监视和报警,高速公路收费,对停车场进行管理,特殊场所车辆的出入许可等[1]。
汽车牌照自动识别系统是应用图像处理技术、模式识别技术和神经网络技术,从复杂背景中准确提取、识别出汽车牌照。
自动车牌识别技术是解决交通管理问题的重要手段,是计算机图像处理技术和模式识别技术在智能交通领域的典型应用。
由于神经网络具有良好的自学习和自适应能力,同时有很强的分类能力、容错能力和鲁棒性,可以实现输入到输出的非线性映射,可在有干扰的情况下对字符实现分类识别,能够解决车牌字符速度和识别正确率等问题,故被广泛地用于汽车牌照识别[2]。
本文设计使用BP神经网络运用MATLAB仿真,对车牌字符进行识别。
二.系统总体设计
车牌识别系统的构成如图1所示
图1车牌识别系统的构成
其中各个模块的研究内容包括:
1.车牌图像采集:
通过安装在过道路口或者车辆出入通道的摄像机实时捕捉车辆视屏图像,并传输到计算机上以便于实时的处理。
2.车牌图像预处理:
主要完成包括图像灰度变化,图像边缘检测、图像二值化等来突出车牌的特征,以便于更好的车牌定位。
3.车牌定位:
从摄入的汽车图像中找到车牌的位置,并把含有车牌图像的区域提取出来,以供后端的字符分割处理
4.车牌字符分割:
对搜索定位后的车牌区域进行字符分割,将车牌分为N个单一的字符
5.车牌识别:
对于提取出的单个字符,先进行归一化操作,再运用训练好的神经网络进行字符识别。
6.结果显示:
显示处理后的车牌并与原始车牌相比较
三.各个模块设计
3.1车牌图像采集
当系统发现有车辆通过感应线圈或监视图像发生变化时,触发图像采集系统,通过CCD摄像机摄取采集出车牌图像,然后车牌自动识别模块对车牌图像进行预处理、车牌定位、字符分割、字符识别等一系列处理识别出车牌号码,识别结果和原始车牌图像通过网络传输至监控中心,留待以后车牌查询和交通流量统计[3]。
本次设计主要是实现对已经采集到的车牌图像进行识别
3.2车牌图像预处理
汽车牌照中的字符主要由有限汉字、字母和数字组成,采用固定的印刷体格式。
由于图像上字符光照不均、车牌本身污损、汽车行驶速度较快、牌照颜色类型较多、拍摄角度及地况等主客观原因会使车牌字符发生畸变,从而造成识别上的困难,因此,为提高牌照的字符识别率,必须进行预处理,以便得到较为清晰的待识别的单个字符.这些预处理包括灰度变换、边缘检测、腐蚀、填充、形态滤波处理等[4]。
预处理的效果对随后的定位处理有很大的影响,所以选择可靠的预处理算法也是非常重要的。
图像预处理程序设计流程图如下:
图2车牌图像预处理流程
预处理的结果显示如下图3
图3车牌图像预处理
3.3车牌定位
车牌定位方法的出发点是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。
在车牌识别中,定位的成功与否以及定位的准确程度将会直接决定后期能否进行车牌识别以及识别的准确度。
车牌定位方法涉及到的具体方法有:
基于边缘检测的方法、区域生长法,构造灰度模型法,二值图像的数学形态学运算法,灰度图像的数学形态学运算法,自适应边界搜索法,DFT变换法,模糊聚类法等[5]。
这里采用基于边缘检测的方法,首先去除图像中的背景,然后得到汽车牌照的特征区域,再通过一定的方式定位这个区域,最后把汽车牌照从图像中分割出来。
所谓“边缘”就是指其周围像素灰度有阶跃变化的那些像素的集合。
“边缘”的两侧分属于两个区域,每个区域的灰度均匀一致,而这两个区域的灰度在特征上存在一定的差异。
边缘检测的任务是精确定位边缘和抑制噪声。
检测的方法有多种,例如Roberts边缘算子、Prewitt算子、Sobel算子以及拉普拉斯边缘检测。
这些方法正是利用物体边缘处灰度变化剧烈这一特点来检测图像的边缘。
各算子对不同边缘类型的敏感程度不同,产生的效果也不同,经过大量实验分析可知,Roberts边缘算子是一种利用局部方差算子寻找边缘的算子,定位比较精确;Prewitt算子和Sobel算子对噪声有一定的抑制能力,但不能完全排除伪边缘;拉普拉斯算子是二阶微分算子,对图像中的阶跃型边缘点定位准确且具有旋转不变性,但容易丢失一部分边缘的方向信息,同时抗噪能力较差。
针对不同的环境和要求,选择合适的算子来对图像进行边缘检测才能达到好的效果。
具体定位流程如下。
图4车牌定位流程图
车牌处理结果如图5所示:
图5车牌定位处理结果
3.4车牌字符分割
字符的分割是指将车牌区域分割成若干个单个的字符区域,把单个有意义的字符从字符串中提取出来,作为独立的字符图像。
字符分割的成败与否直接影响到单字的识别效果,如果分割出的字符出现了断裂、粘连,则系统难以识别。
本次设计中采用的是垂直投影字符分割方法,即先将图像二值化,然后进行水平倾斜以及竖直倾斜校正,去除一些噪声,然后将车牌像素灰度值按垂直方向累加,即所谓的垂直投影。
由于字符块的垂直投影必然在字符间距或字符内的间隙处取得局部最小值,所以分割位置应该在局部最小值处[6]。
此方法比较简单易行,程序设计简单,便于设计和操作,因此比较常用。
由于在车牌定位中得到的是彩色的车牌区域图像,故在字符分割前需对图像进行预处理。
图6列方向像素点灰度值累积和
图7车牌字符分割结果
图8车牌字符归一化后显示结果
3.5车牌字符识别
3.5.1BP神经网络简介
BP(BackPropagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。
输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。
当实际输出与期望输出不符时,进入误差的反向传播阶段。
误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。
周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。
BP神经网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。
(1)节点输出模型
隐节点输出模型:
Oj=f(∑Wij×Xi-qj)
输出节点输出模型:
Yk=f(∑Tjk×Oj-qk)
f-非线形作用函数;q-神经单元阈值。
(2)作用函数模型
作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid函数:
f(x)=1/(1+e)
(3)误差计算模型
误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:
Ep=1/2×∑(tpi-Opi)
tpi-i节点的期望输出值;Opi-i节点计算输出值。
(4)自学习模型
神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵Wij的设定和误差修正过程。
BP网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。
自学习模型为
△Wij(n+1)=h×Фi×Oj+a×△Wij(n)
h-学习因子;Фi-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。
下图为BP神经网络结构
图9BP神经网络结构
3.5.2神经网络训练
BP神经网络学习是典型的有导师学习,其训练主要是利用误差反向传播算法,不断修正网络权值矩阵。
因为一般的车牌均由汉字、英文字母和数字组成,根据车牌字符的上述特点,在用BP神经网络进行训练和识别时,所选用的样本需包括字符的这些特点,加上本次实验的特殊性,由于待识别车牌图像有限,所得到的车牌字符不是很全,这里为简化起见,只对汉字渝,数字0~9和字母A、L、M、N、R这几个字符进行训练。
训练样本如下图10所示:
汉字:
数字0~9:
字母:
图10训练样本
3.5.3神经网络识别结果
图11神经网络训练
用训练好的神经网络对样本进行识别,图12为车牌识别结果:
图12不同车牌识别结果
四.结论
汽车牌照的自动识别技术作为智能交通的一部分已经得到了越来越广泛的应用,良好的自动识别技术对现代化交通来说具有重要意义。
本设计运用神经网络算法对汽车牌照进行识别,实现了对车牌预处理,车牌定位车牌分割,车牌识别,处在的不足在于,由于不同的汽车牌照其倾斜度和所在位置不一,对于不同的车牌需要改变分割参数才能实现。
参考文献
[1]廖金周,宣国荣.车牌的自动分割[J].微型电脑应用,1999,(7):
P32-34
[2]廖翔云,许锦标,龚仕伟.车牌识别技术研究[J].微机发展,2003,(6)
[3]杜圣康,毛力.汽车牌照识别系统的设计与实现[J].电脑学习,2008,(5):
P15-16
[4]马腾飞,郑永果,赵卫东,基于边缘检测与HOUGH变换的车牌字符分割算法[J],系统方针学报,2006,18
(1):
391-393
[5]齐林,张向东,一种汽车牌照字符分割的新方法[J].EIC.Vo1.152008:
92-94
[6]李连昌,兰志强,丛奎荣,元学鹏.车牌自动识别技术研究进展[J].P:
34-38
附录:
%%主程序%%
clc;
closeall;
clearall;
I=imread('C:
\wangyuanyuan\DSC01317.jpg');
dw=cpdw(I);%车牌定位
[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=zffg(I);%字符分割及处理
PIN0=ycl(PIN0);
PIN1=ycl(PIN1);
PIN2=ycl(PIN2);
PIN3=ycl(PIN3);
PIN4=ycl(PIN4);
PIN5=ycl(PIN5);
PIN6=ycl(PIN6);
P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6'];
%%%%归一化训练样本%%%%
I0=ycl(imread('C:
\wangyuanyuan\yangben\0.jpg'));
I1=ycl(imread('C:
\wangyuanyuan\yangben\1.jpg'));
I2=ycl(imread('C:
\wangyuanyuan\yangben\2.jpg'));
I3=ycl(imread('C:
\wangyuanyuan\yangben\3.jpg'));
I4=ycl(imread('C:
\wangyuanyuan\yangben\4.jpg'));
I5=ycl(imread('C:
\wangyuanyuan\yangben\5.jpg'));
I6=ycl(imread('C:
\wangyuanyuan\yangben\6.jpg'));
I7=ycl(imread('C:
\wangyuanyuan\yangben\7.jpg'));
I8=ycl(imread('C:
\wangyuanyuan\yangben\8.jpg'));
I9=ycl(imread('C:
\wangyuanyuan\yangben\9.jpg'));
I10=ycl(imread('C:
\wangyuanyuan\yangben\A.jpg'));
I11=ycl(imread('C:
\wangyuanyuan\yangben\L.jpg'));
I12=ycl(imread('C:
\wangyuanyuan\yangben\M.jpg'));
I13=ycl(imread('C:
\wangyuanyuan\yangben\N.jpg'));
I14=ycl(imread('C:
\wangyuanyuan\yangben\R.jpg'));
%输入样本%
P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14'];
%输出样本%
T=eye(15,15);
%建立神经网络模型%
%%bp神经网络参数设置%%;
net=newff(minmax(P),[100,15],{'logsig','logsig','logsig'},'trainrp');
net.inputWeights{1,1}.initFcn='randnr';
net.layerWeights{2,1}.initFcn='randnr';
net.trainparam.epochs=5000;
net.trainparam.show=50;
net.trainparam.lr=0.003;
net.trainparam.goal=0.0000000001;
net=init(net);
%%%训练样本%%%
[net,tr]=train(net,P,T);
%%%%测试字符,得到识别数值%%%%
fori=2:
7
T0=sim(net,P0(:
i));
T1=compet(T0);
d=find(T1==1)-1;
if(d==10)
str='A';
elseif(d==11)
str='L';
elseif(d==12)
str='M';
elseif(d==13)
str='N';
elseif(d==14)
str='R';
else
str=num2str(d);
end
switchi
case2
str1=str;
case3
str2=str;
case4
str3=str;
case5
str4=str;
case6
str5=str;
otherwise
str6=str;
end
end
%%%显示定位后分割出的车牌彩图,识别结果以标题形式显示在图上%%%
s=strcat('渝',str1,str2,str3,str4,str5,str6);
figure();
imshow(dw),title(s);
车牌定位程序
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);
fori=1:
y
forj=1:
x
if(I6(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
end
end
end
[tempMaxY]=max(Y1);
%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%
PY1=MaxY;
while((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Y1(PY2,1)>=100)&&(PY2PY2=PY2+1;
end
IY=I(PY1:
PY2,:
:
);
X1=zeros(1,x);
forj=1:
x
fori=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)&&(PX1PX1=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
字符分割程序
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);
forj=1:
x1
fori=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;
%%%%%%%%%%%%分割字符%%%%%%%%%%%%%
fori=1:
7
while((X1(1,Px0)<3)&&(Px0Px0=Px0+1;
end
Px1=Px0;
while(((X1(1,Px1)>=3)&&(Px1Px1=Px1+1;
end
Z=I1(:
Px0:
Px1,:
);
switchstrcat('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,[4520]);%将字符图片统一划为50*20大小
figure(5);
subplot(3,7,i);
imshow(q);
figure();
subplot(3,7,i);
imshow(q);
end
imwrite(PIN0,'C:
\wangyuanyuan\zifu\0.jpg','jpg');
imwrite(PIN1,'C:
\wangyuanyuan\zifu\1.jpg','jpg');
imwrite(PIN2,'C:
\wangyuanyuan\zifu\2.jpg','jpg');
imwrite(PIN3,'C:
\wangyuanyuan\zifu\3.jpg','jpg'