基于MATLAB的车牌分割与识别1Word格式.doc
《基于MATLAB的车牌分割与识别1Word格式.doc》由会员分享,可在线阅读,更多相关《基于MATLAB的车牌分割与识别1Word格式.doc(9页珍藏版)》请在冰豆网上搜索。
本文利用BP神经网络进行车牌的识别:
①能够利用MATLAB通过预处理,将汽车图片的车牌定位和分割;
②能够将提取出的车牌图像进行分割,将车牌中的每个字符提取出来;
③能够建立一个BP神经网络,训练网络
④能够利用BP神经网络进行车牌的识别
2.车牌识别的过程
图2.1给出了车牌识别的整个过程:
图2.1车牌识别的过程
3.数据获取
在车牌识别中,需要两种数据:
一种是车牌的图像;
另一种就是训练BP神经网络的数据:
对获取的字符进行归一化处理,使得各个字符变成了一个个大小相同的字符。
然后要从这些字符中提取最能体现一个字符特点的特征向量。
将提取出的训练样本中的特征向量输入BP网络中就可以对网络进行训练。
为了克服字符存在倾斜和偏移是都会对识别产生误差,可选取13段特征提取法来进行特征提取,作为BP神经网络的数据。
13段特征提取法的操作过程:
首先把字符平均分成8份,统计每一份内的黑色的像素点个数作为8个特征,如图1.1所示;
图3.1特征提取
然后统计水平方向中间两列和竖直方向中间两列的黑色像素点的个数作为4个特征,如图1.2所示;
图1.1特征提取
最后统计所有黑色像素点的个数作为第13个特征。
采用13段特征提取法对所有的大小相同字符进行处理,得到BP神经网络训练样本的数据。
4.车牌识别时所采用的技术
进行车牌识别的关键技术就是:
首先,要讲车牌从汽车图片中提取出来,然后要将提取出的车牌再次进行分割,车牌中各字符的图片;
第二,就是要将这些字符图片进行处理,得到统一大小的图片;
第三,采用
4.1车牌提取
采用MATLAB,从多个汽车图片中获取多个车牌图像
在提取车牌之前,首先要对车牌进行一些预处理操作,例如我们要对图3进行
车牌提取,其预处理主要MATLAB程序为:
图2要提取的车牌
I=imread('
图像地址\图像名'
);
%读取图像
I1=rgb2gray(I);
%转化为灰度图像,加快处理速度
I2=edge(I1,'
robert'
0.09,'
both'
%采用robert算子进行边缘检测
se=[1;
1;
1];
%线型结构元素
I3=imerode(I2,se);
%腐蚀图像
se=strel('
rectangle'
[25,25]);
%矩形结构元素
I4=imclose(I3,se);
%图像聚类、填充图像
I5=bwareaopen(I4,2000);
%进行形态滤波,去除聚团灰度值小于2000的部分
通过上述的处理可得到的如图4所示的图像:
图3图像处理的结果
由于形态滤波后将图片中的车牌形成了一个连通的区域,所以可以对所得的形态滤波后的图像进行车牌的定位与切割。
进行切割时,要分别计算图像的行、列像素点的分布,因为只有在车牌的位置才有像素点。
对行、列上的像素点的统计程序为:
X1=zeros(1,x);
[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
figure;
plot(0:
y-1,Y1),title('
行方向像素点灰度值累计和'
),xlabel(‘行值’),ylabel('
像素'
%列方向
fori=1:
if(I6(i,j,1)==1)
X1(1,j)=X1(1,j)+1;
end
end
x-1,X1),title('
列方向像素点灰度值累计和'
),xlabel('
列值'
),ylabel('
图4行方向像素点灰度值累计和
图5列方向像素点灰度值累计和
通过运行上述程序段,可以得到如图5和图6的行、列方向的像素点灰度值累计和,同时也得到了车牌在图片中的行、列的起始位置,可以通过这四个位置将车牌从原图像中分割出来,如图7所示。
%求的车牌的行起始位置和终止位置
PY1=MaxY;
while((Y1(PY1,1)>
=50)&
&
(PY1>
1))
PY1=PY1-1;
end
PY2=MaxY;
while((Y1(PY2,1)>
(PY2<
y))
PY2=PY2+1;
end
%求的车牌的列起始位置和终止位置
PX1=1;
while((X1(1,PX1)<
3)&
(PX1<
x))
PX1=PX1+1;
PX2=x;
while((X1(1,PX2)<
(PX2>
PX1))
PX2=PX2-1;
PX1=PX1-1;
PX2=PX2+1;
%分割出车牌图像
dw=I(PY1:
PY2,PX1:
PX2,:
imshow(dw),title('
定位剪切后的彩色车牌图像'
)
图6分割出的车牌图像
4.2车牌中字符的提取
车牌中字符的提取类似于从图像中提取车牌的过程。
首先进行各种预处理,然后根据列方向上的像素点的统计值,分割出每个字符。
如图8所示:
图7分割出的车牌字符
分割提取多个车牌中的字符,然后将字符图片归一化为128*128的大小:
I1=imresize(I1,[128128])
4.3特征提取
将采用前面介绍的13段特征提取法对归一化后的图片进行特征提取。
在进行特征提取之前,需要先将图片转换成二值化格式
首先,将图片分成类似图1的8份,然后分别计算每一份的像素为1的点的个数,生成一个8×
1的向量:
Z1=zeros(8,1);
fori=0:
1
forj=0:
3
if(i==0&
j==0)n=1;
end
if(i==1&
j==0)n=2;
j==1)n=3;
j==1)n=4;
end
j==2)n=5;
if(i==1&
j==2)n=6;
if(i==0&
j==3)n=7;
if(i==1&
j==3)n=8;
end
fork=64*i+1:
64*i+64
form=32*j+1:
32*j+32
if(I1(k,m,1)==1)
Z1(n,1)=Z1(n,1)+1;
end
end
end
接着将图片分别分成类似于图2的4份,然后分别计算每一份的像素为1的点的个数,生成一个4×
1的向量;
Z2=zeros(4,1);
Z2(3,1)=Z1(3,1)+Z1(4,1);
Z2(4,1)=Z1(5,1)+Z1(6,1);
2
forj=32*i+1:
32*i+i
fork=1:
128
if(I1(j,k,1)==1)
Z2(i,1)=Z2(i,1)+1;
第三步是计算图片中所有像素点为1的个数,生成一个1×
Z3=zeros(1,1);
forj=1:
if(I1(i,j,1==1))
Z3(1,1)=Z3(1,1)+1;
最后将前面生成的3个向量结合成一个13×
1的向量,作为BP神经网络的训练样本。
4.4BP神经网络
BP神经网络是一种反向传播的多层前馈型神经网络。
在一个BP神经网络包含了一个输入层、单个或多个隐含层以及一个输出层。
每个层根据需要包含了多个神经元,层与层之间采用全连接方式,同层之神经元之间不存在连接。
BP神经网络的学习过程分为正向传播和反向传播两种交替过程。
正向传播是在处理样本时,从输入层输入,向前把结果输出到第一隐含层,然后第一隐含层将接数据处理后作为输出,该输出作为第二隐含层的输入,依次类推,直到输出层的输出为止;
反向传播是指通过比较输出层的实际输出和预期结果,得到误差,然后通过相关的误差调整方式,从最后一个隐含层到输出层之间的网络权重,依次类推,直到输入层与第一隐含层之间的网络权值调整为止。
反向传播算法通过迭代处理的方式,不断的调整连接神经元的网络权权重,使得最终输出结果和预期结果的误差最小
由于三层的BP神经网络的性能较好,所以此处采用含一层隐含层的三层BP神经网络。
因为BP神经网络的输入向量采用的是样本字符的特征向量,而样本的特征向量有13个元素,所以设计的BP神经网络的输入层神经元的个数为13;
而由于车牌中包括汉字、字母和数字,可以设计三个分别能够识别这三种字符的BP神经网络。
以识别数字的BP神经网络为例。
因为输出的为数字,所以设定BP神经网络的输出神经元个数为10,然后根据经验,设定BP神经网络的隐含层神经元的个数为12。
①BP神经网络的构建和训练:
net=newff(minmax(P),[12,10],{'
tansig'
'
logsig'
},'
trainln'
%新建一个BP神经网络,其中P为训练样本
net.trainparam.epochs=5000;
net.trainparam