一、课题名称[Q1321814823]
基于MATLAB模板匹配的车牌识别系统
二、课题背景
随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点。针对此问题,人们运用新的科学技术,相继研制开发出了各种交通道路监视、管理系统。这些系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控、管理和指挥交通的目的。因此,智能交通系统ITS(intelligent traffic system)已成为世界交通领域研究的重要课题。 车牌识别系统LPR(1icense plate recognition)作为智能交通系统的一个重要组成部分,已在高速公路、城市交通和停车场等项目的管理中占有无可取代的重要地位。它在不影响汽车状态的情况下,由计算机自动完成车牌的识别,从而降低交通管理工作的复杂度。
三、识别流程
①图像预处理:在整个车牌识别系统中,由于采集进来的图像为真彩图,再加上实际采集环境的影响以及采集硬件等原因,图像质量并不高,其背景和噪声会影响字符的正确分割。和识别,所以在进行车牌分割和识别处理之前,需要先对车牌图像进行图像预处理操作。
②车牌定位:首先对车牌的二值图片进行形态学滤波,使车牌区域形成一个连通区域,然后根据车牌的先验知识对所得到的连通区域进行筛选,获取车牌区域的具体位置,完成从图片中提取车牌的任务。
③车牌校正:由于捕捉图片的摄像头与车身的角度问题,得到的车牌图片不是水平的。为了顺利进行后续的分割和识别,必须对车牌进行角度校正。在此,使用了Radon变换来对车牌进行校正。
④车牌分割:首先对车牌进行水平投影,去除水平边框;再对车牌进行垂直投影。通过对车牌进行投影分析可知,与最大值峰中心对应的为车牌中第二个字符和第三个字符的间隔,与第二大峰中心距离对应的即为车牌字符的宽度,并以此为依据对车牌进行分割。
⑤字符识别:本文采用模板匹配方法来对车牌进行识别。识别过程中,首先建立标准字库,再将分割所得到的字符进行归一化,将归一化处理后的字符与标准字库里的字符逐一比较,最后把误差最小的字符作为结果显示出来。采用成熟的数字图像处理技术和Matlab仿真工具。
四、程序实现
1、读取图像
[fn,pn,fi]=uigetfile('*.bmp','选择图片');
Scolor=imread([pn fn]);
imshow(Scolor);
title('车牌原始图像');
2、图像预处理
Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图
s=strel('disk',13);%strei函数13
Bgray=imopen(Sgray,s);%打开sgray s图像
Egray=imsubtract(Sgray,Bgray);%两幅图相减
grd=edge(Egray,'canny',0.09,'both');
se=[1;1;1]; %线型结构元素
I3=imerode(grd,se); %腐蚀图像
bg1=imclose(I3,strel('rectangle',[8,18]));%取矩形框的闭运算即平滑8,18
bg3=imopen(bg1,strel('rectangle',[8,14]));%取矩形框的开运算8,18
bg2=bwareaopen(bg3,700);%去除聚团灰度值小于1000的部分800
3、车牌定位
for j=1:x
for i=PY1:PY2
if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
% subplot(1,3,2);
% plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');
PX1=1;
while ((X1(1,PX1)<3)&&(PX1
PX1=PX1+1;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
DW=Scolor(PY1:PY2,PX1:PX2,:);
axes(handles.axes2);
imshow(DW),title('车牌定位图像');
4、字符分割
function e=qiege(d)
[m,n]=size(d);
top=1;bottom=m;left=1;right=n; % init
while sum(d(top,:))==0 && top<=m
top=top+1;
end
while sum(d(bottom,:))==0 && bottom>1
bottom=bottom-1;
end
while sum(d(:,left))==0 && left
left=left+1;
end
while sum(d(:,right))==0 && right>=1
right=right-1;
end
dd=right-left;
hh=bottom-top;
e=imcrop(d,[left top dd hh]);
5、字符识别
liccode=char(['0':'9' 'A':'Z' '藏川甘赣贵桂黑沪吉济冀津晋京警兰辽领鲁蒙闽宁青琼陕使苏皖湘新学渝豫粤云浙']); %建立自动识别字符代码表
tt=1;
l=1;
for I=1:7
ii=int2str(I);
t=imread([ii,'.jpg']);
t=255-t;
level=graythresh(t);
t=im2bw(t,level);
SegBw2=imresize(t,[22 14],'nearest');
if tt==1 %第一位汉字识别
kmin=37;
kmax=72;
t=~t;
SegBw2=imresize(t,[22 14],'nearest');
elseif tt==2 %第二位 A~Z 字母识别
kmin=11;
kmax=36;
else %第三位以后是字母或数字识别
kmin=1;
kmax=36;
end
for k2=kmin:kmax
fname=strcat('code module\Sam',liccode(k2),'.jpg');
%SamBw2 = imread(fname);
SamBw22 = imread(fname);
SamBw22 = rgb2gray(SamBw22);
SamBw2=imresize(SamBw22,[22 14],'nearest');
level=graythresh(SamBw2);
SamBw2=im2bw(SamBw2,level);
for i=1:22
for j=1:14
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
% 以上相当于两幅图相减得到第三幅图
Dmax=0;
for k1=1:22
for l1=1:14
if ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )
Dmax=Dmax+1;
end
end
end
Error(k2)=Dmax;
end
Error1=Error(kmin:kmax);
MinError=min(Error1);
findc=find(Error1==MinError);
if tt==1
findc=findc+36;
end
if tt==2
findc=findc+10;
end
tt=tt+1;
res=liccode(findc);
shibiejieguo(1,l)=res;
l=l+1;
end
五、GUI实现
六、更多课题推荐
请加我QQ609553134