春.docx
《春.docx》由会员分享,可在线阅读,更多相关《春.docx(17页珍藏版)》请在冰豆网上搜索。
春
长沙学院
课程设计说明书
题目
车牌提取系统设计
系(部)
电子与通信工程系
专业(班级)
11电子2班
姓名
王宇
学号
2011012407
指导教师
刘莉、谭志光、周远、孙利平
起止日期
2014.6.9-2014.6.13
长沙学院课程设计鉴定表
姓名
王宇
学号
2011012407
专业
电子信息工程
班级
电子二班
设计题目
车牌提取系统设计
指导教师
刘莉
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
评定等级:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
日期:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“中等”、“及格”、“不及格”五类;
目录
摘要1
关键词1
1MATLAB简介1
2车牌提取系统的基本原理2
3车牌提取系统的仿真3
4车牌提取系统的分析5
5车牌提取系统的界面设计6
6心得体会10
参考文献11
车牌提取系统的仿真设计
摘要
近几年,车牌识别系统作为智能交通的一个重要方向越来越受到重视。
车牌识别系统可以应用于停车场管理系统、智能交通管理系统、小区车辆管理系统等各个领域,对交通管理及治安管理有着十分重要的作用。
虽然目前已有一些车牌识别系统相关产品出现,但是对其算法的研究发展从没有停止。
本文首先对车牌识别系统的现有技术进行了更加深入的研究,在研究的基础上开发出一个基于MATLAB的车牌号识别系统。
该设计方案仅进行Matlab软件的开发,图像采用已经采集的车牌号清楚显示的汽车图片,软件包括车牌定位、车牌字符分割及车牌字符识别三个模块。
车牌定位模块中使用了基于小波变换的车牌边缘提取的算法,该算法对于各种底色的车牌具有良好的适应性;车牌的二值化采用了改进的Otus算法,重新划分了其两维直方图的区域;字符切割采用波谷检测法,以波谷为切割线,将车牌图片切割成七个字符图片;字符识别采用模块匹配法,将要识别的字符与预先构造好的字符模板进行比较,根据相似度确定字符。
根据上述算法搭建了一个测试平台,通过测试平台,对大量照片进行车牌识别,测试系统的性能。
测试结果表明,本课题设计的车牌识别系统可有效地实现车牌识别,为今后的产品化奠了很好的技术基础。
关键词:
车牌识别,车牌定位,字符分割,字符识别
1、MATLAB简介
MATLAB(矩阵实验室)是MATrixLABoratory的缩写,是一款由美国TheMathWorks公司出品的商业数学软件。
MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。
除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。
尽管MATLAB主要用于数值运算,但利用为数众多的附加工具箱(Toolbox)它也适合不同领域的应用,例如控制系统设计与分析、图像处理、信号处理与通讯、金融建模和分析等。
另外还有一个配套软件包Simulink,提供了一个可视化开发环境,常用于系统模拟、动态/嵌入式系统开发等方面。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
MATLAB应用:
MATLAB产品族可以用来进行以下各种工作:
●数值分析
●数值和符号计算
●工程与科学绘图
●控制系统的设计与仿真
●数字图像处理
●数字信号处理
●通讯系统设计与仿真
●财务与金融工程
MATLAB的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。
附加的工具箱(单独提供的专用MATLAB函数集)扩展了MATLAB环境,以解决这些应用领域内特定类型的问题。
2、车牌提取系统的基本原理
车辆牌照识别系统的基本工作原理为:
将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。
图车牌识别系统基本结构框图
一:
原始图像:
由停车场固定彩色摄像机、数码相机或其他扫描装置拍摄到的图像。
二:
图像预处理:
对动态采集到的图像进行滤波,边界增强等处理以克服图像处理。
三:
车牌位置提取:
通过运算得到图像的边缘,再计算边缘图像的投影面积,寻找谷峰点以大概确定车
牌的位置,再计算连通域的宽高比,剔除不在阈值范围内的连通域,最后便得到了车牌区域。
四:
字符分割:
利用投影检测的字符定位分割方法得到单个的字符。
五:
字符识别:
利用模板匹配的方法与数据库中的字符进行匹配从而确认出字符。
六:
输出结果:
得到最后的汽车牌照,包括汉字、字母和数字。
(1)牌照定位:
自然环境下,由于汽车图像背景复杂、光照不均匀等原因,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。
一般采用的方案是首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。
通过以上步骤,牌照一般能够被定位。
(2)牌照字符分割:
在完成牌照区域的定位后,还需要将牌照区域分割成单个字符,然后进行字符识别,最后输出结果。
字符分割一般采用垂直投影法。
垂直投影法的原理是由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。
所以利用垂直投影法对复杂环境下的汽车图像的字符分割有较好的效果。
(3)牌照字符识别:
字符识别方法目前主要得算法有两种即基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
基于人工神经元网络的算法有两种:
一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。
实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。
牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。
这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。
为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。
3车牌提取系统的仿真
源程序:
I=imread('car2.jpg');
I1=rgb2gray(I);
I2=edge(I1,'robert',0.15,'both');
se=[1;1;1];
I3=imerode(I2,se);
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
I5=bwareaopen(I4,2000);
[y,x,z]=size(I5);
myI=double(I5);
%Y方向车牌区域确定
tic
Blue_y=zeros(y,1);%y=zeros(450,1)
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
Blue_y(i,1)=Blue_y(i,1)+1;
end
end
end
[tempMaxY]=max(Blue_y);
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;
end
%Blue_y(272,1)=3Blue_y(271,1)=5
IY=I(PY1:
PY2,:
:
);
figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
%%%%%%X方向车牌区域确定%%%%%%%%%
Blue_x=zeros(1,x);
forj=1:
x
fori=PY1:
PY2
if(myI(i,j,1)==1)
Blue_x(1,j)=Blue_x(1,j)+1;
end
end
end
PX1=1;
while((Blue_x(1,PX1)<3)&&(PX1PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-1;
PX2=PX2+1;
dw=I(PY1:
PY2-8,PX1:
PX2,:
);
figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')
处理结果:
4、车牌提取系统的分析
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
当改变灰度值2000为20时,结果为
%Y方向车牌区域确定
tic
Blue_y=zeros(y,1);%y=zeros(450,1)
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
Blue_y(i,1)=Blue_y(i,1)+1;
end
end
end
[tempMaxY]=max(Blue_y);
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;
end
%Blue_y(272,1)=3Blue_y(271,1)=5
IY=I(PY1:
PY2,:
:
);
figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
当把选取区域扩大时,即改变(Blue_y(PY1,1)>=5)&&(PY1>1)和(Blue_y(PY1,1)>=5)&&(PY1>1)的范围,即得到结果为:
5、车牌提取系统的界面设计
整体界面:
运行界面:
源程序:
1、车牌定位
I=imread('car2.jpg');
I1=rgb2gray(I);
I2=edge(I1,'robert',0.15,'both');
se=[1;1;1];
I3=imerode(I2,se);
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
I5=bwareaopen(I4,2000);
[y,x,z]=size(I5);
myI=double(I5);
%Y方向车牌区域确定
tic
Blue_y=zeros(y,1);%y=zeros(450,1)
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
Blue_y(i,1)=Blue_y(i,1)+1;
end
end
end
[tempMaxY]=max(Blue_y);
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;
end
%Blue_y(272,1)=3Blue_y(271,1)=5
IY=I(PY1:
PY2,:
:
);
figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
%%%%%%X方向车牌区域确定%%%%%%%%%
Blue_x=zeros(1,x);
forj=1:
x
fori=PY1:
PY2
if(myI(i,j,1)==1)
Blue_x(1,j)=Blue_x(1,j)+1;
end
end
end
PX1=1;
while((Blue_x(1,PX1)<3)&&(PX1PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
%对车牌区域的校正
PX1=PX1-1;
PX2=PX2+1;
dw=I(PY1:
PY2-8,PX1:
PX2,:
);
figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')
2、字符分割
a=imread('dingwei.jpg');
b=rgb2gray(a);
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/3);
[m,n]=size(b);
d=(double(b)>=T);
%滤波
h=fspecial('average',3);
d=im2bw(round(filter2(h,d)));
%膨胀或腐蚀
se=eye
(2);
[m,n]=size(d);
ifbwarea(d)/m/n>=0.365
d=imerode(d,se);
elseifbwarea(d)/m/n<=0.235
d=imdilate(d,se);
end
imwrite(d,'5.膨胀或腐蚀处理后.jpg');
figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')
d=qiege(d);
[m,n]=size(d);
k1=1;k2=1;s=sum(d);j=1;
whilej~=n
whiles(j)==0
j=j+1;
end
k1=j;
whiles(j)~=0&&j<=n-1
j=j+1;
end
k2=j-1;
ifk2-k1>=round(n/6.5)
[val,num]=min(sum(d(:
[k1+5:
k2-5])));
d(:
k1+num+5)=0;%分割
end
end
%再切割
d=qiege(d);
%切割出7个字符
y1=10;y2=0.25;flag=0;word1=[];
whileflag==0
[m,n]=size(d);
left=1;wide=0;
whilesum(d(:
wide+1))~=0
wide=wide+1;
end
ifwided(:
[1:
wide])=0;
d=qiege(d);
else
temp=qiege(imcrop(d,[11widem]));
[m,n]=size(temp);
all=sum(sum(temp));
two_thirds=sum(sum(temp([round(m/3):
2*round(m/3)],:
)));
iftwo_thirds/all>y2
flag=1;word1=temp;%WORD1
end
d(:
[1:
wide])=0;d=qiege(d);
end
end
%分割出第二个字符
[word2,d]=getword(d);%word265*34
%分割出第三个字符
[word3,d]=getword(d);
%分割出第四个字符
[word4,d]=getword(d);
%分割出第五个字符
[word5,d]=getword(d);
%分割出第六个字符
[word6,d]=getword(d);
%分割出第七个字符
[word7,d]=getword(d);
subplot(5,7,1),imshow(word1),title('1');
subplot(5,7,2),imshow(word2),title('2');
subplot(5,7,3),imshow(word3),title('3');
subplot(5,7,4),imshow(word4),title('4');
subplot(5,7,5),imshow(word5),title('5');
subplot(5,7,6),imshow(word6),title('6');
subplot(5,7,7),imshow(word7),title('7');
[m,n]=size(word1);
%归一化大小为40*20
word1=imresize(word1,[4020]);
word2=imresize(word2,[4020]);
word3=imresize(word3,[4020]);
word4=imresize(word4,[4020]);
word5=imresize(word5,[4020]);
word6=imresize(word6,[4020]);
word7=imresize(word7,[4020]);
subplot(5,7,15),imshow(word1),title('1');
subplot(5,7,16),imshow(word2),title('2');
subplot(5,7,17),imshow(word3),title('3');
subplot(5,7,18),imshow(word4),title('4');
subplot(5,7,19),imshow(word5),title('5');
subplot(5,7,20),imshow(word6),title('6');
subplot(5,7,21),imshow(word7),title('7');
3、字符识别
dw=imread('dw.jpg')
liccode=char(['0':
'9''A':
'Z''苏豫陕鲁']);
SubBw2=zeros(40,20);
l=1;
forI=1:
7
ii=int2str(I);
t=imread([ii,'.jpg']);
SegBw2=imresize(t,[4020],'nearest');
ifl==1
kmin=37;
kmax=40;
elseifl==2
kmin=11;
kmax=36;
elsel>=3
kmin=1;
kmax=10;
end
fork2=kmin:
kmax
fname=strcat('字符模板\',liccode(k2),'.jpg');
SamBw2=imread(fname);
fori=1:
40
forj=1:
20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
Dmax=0;
fork1=1:
40
forl1=1:
20
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);
Code(l*2-1)=liccode(findc
(1)+kmin-1);
Code(l*2)='';
l=l+1;
end
figure(10),imshow(dw),title(['车牌号码:
',Code],'Color','r');
6心得体会
参考文献:
[1]邱关源.电路原理(五版).北京:
高等教育出版社,2006
[2]曹丙霞.protel原理图设计.北京:
电子工业出版社,2007
[3]周开利,邓春晖.MATLAB基础及应用教程.北京:
北京大学出版社,2007
[4]张威.MATLAB6.0基础与编程与入门。
西安:
西安电子科技大学出版社,2007
[5]张智星.MATLAB程序设计与应用。
北京:
清华大学出版社,2002