期末大作业报告
课程名称: 数字图像处理 设计题目: 车牌识别 学 院: 信息工程与自动化学院 专 业: 计算机科学与技术 年 级: xxxxx 学生姓名: xxxxxxx ( 学号 xxxxxxxxxxxxx) 指导教师: xxxx 日 期: 2012.6.10
教 务 处 制
车牌识别
摘要:数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方
法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。MATLAB中集成了功能强大的图像处理工具箱。由于MATLAB语言的语法特征与C语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式,而且这种语言可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。
关键词:车牌识别、数字图像处理、MATLAB
一、设计原理
车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
二、设计步骤
1. 提出总体设计方案:
(1)车牌图像预处理方法
因为车牌图像都是在室外拍摄的,所以不可避免地会受到光照、气候等因素的影响,而且拍摄者的手部抖动与车辆的移动会造成图像的模糊。要去除这些干扰就得先对车牌图像进行预处理。由于当前数码相机的像素较高,原始图像的数据一般比较大,输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度。因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。对图像进行灰度化处理后常用的方法是图像二值化、去除背景图像、增强处理、边缘检测、滤波等处理等。
(2)车牌定位方法
车牌定位在整个车牌识别系统中是非常关键的一部分,因为如果车牌无法定位或无法精确定位,就不可能进行后续的字符分割与字符识别工作。经过查阅文献,我发现车牌定位算法的种类非常多,但是至今没有一种通用的方法。考虑到本次课程大作业所用车牌的一些特点,可采用以下四种车牌定位的算法,下面具体介绍。
1)基于灰度边缘检测与形态学重构的方法。这种方法只要利用车牌区域局部对比度明显和有规律的纹理特征来定位,然后利用形态学方法将车牌区域与其它背景区域分离。
2)基于直线检测的方法。这种方法主要Hough变换的方法来检测车牌周围边框直线,利用车牌形状特性来定位车牌。
3)根据车牌的固有长宽比进行定位的方法。因为中外车牌的长宽比都是固定的3.1:1,在预处理完成后对二值化的图像进行膨胀腐蚀,计算联通区域长宽比确定车牌位置。
4)基于彩色图像的车牌定位方法。现在的牌照有四种类型:第一种是最常见的小型汽车所用的蓝底白字牌照;第二种是大型汽车所用的黄底黑字牌照;第三种是军用或警用的白底黑字、红字牌照;第四种是国外驻华机构用的黑底白字、红字牌照。基于彩色图像的车牌定位方法主要利用车牌颜色与车身其他部位颜色具有明显不同的差异来分割与提取车牌。
定位流程图:
(3)字符分割方法
字符分割是指将车牌区域分割成单个的字符区域,分割越准确,识别效果越好。目前有许多种车牌字符分割算法,由于在车牌字符分割中存在噪声干扰,边框、铆钉影响,车牌旋转和光照不均等问题,造成分割不准确,甚至分割错误,目前很难找到普遍适用的分割方法。常用的字符分割法主要是基于投影分析字符的分割方法和基于连通域分析的字符分割方法。 1)投影分析常采用的是水平投影法,即沿水平方向计算每一列属于车牌字符的象素数目,在字符的间隙处取得局部最小值,分割位置应在其附近。先根据车牌水平投影的统计特征呈现出明显“波峰——波谷——波峰”,进行水平方向上的粗分割,若字符出现合并和粘连现象,再采用递归回归办法进行二次字符分割。
2)投影法进行字符分割实现起较为简单,但在预处理效果不好的情况下,较难获得满足条件的列。若增加预处理,则使处理后的图像不可避免地损失一部分有用信息,还可能导致额外误差。基于连通域聚类分析切分车牌字符的方法按照属于同一个字符的像素构成一个连通域的原则,结合牌照字符的固定高度和间距比例关系等先验知识,较好地解决了汽车牌照在复杂背景条件下的字符切分问题,降低了对车牌定位准确度的要求,对不规范的车牌识别也具有一定的适用性。 (4)字符识别方法
标准的车牌共有七个字符,如上图所示。其中第1位为汉字,第2、3位为大写英文字母,4~7位为阿拉伯数字。目前还有一定数量的个性化车牌,因为保有量较少,故可以忽略不计。所以总共需要识别的字符约50个汉字,26个大写英文字母及10个阿拉伯数字。现在常用的字符识别主要是基于模版匹配和神经网络的方法。
1)模板匹配法是最简单的一种字符识别方法。将待识别字符经分割归一化成模板字体的大小,将它输入字符识别模块进行匹配。根据实际字符和模板图像之间匹配方差最小的原则,判定车牌图像字符所属类别。这种方法对于标准、规范的字符识别效果较好。但在复杂环境下的车牌字符会与理想模板字符不完全一致,这导致了识别结果存在较大误差。
2)模版匹配法简单、成熟,但其自适应不强。对于字符有断裂和粘连等情况容易造成误判。神经网络匹配法具有良好的容错性、自适应和学习能力,但样本的训练收敛速度慢,而大规模并行处理为此提供了解决途径。其中一种方法是采用并行识别的BP网络,让汉字、英文、阿拉伯数字,阿拉伯数字分别送到各自的网络识别。还有学者结合小波变化的优点,提出基于小波和BP神经网络的车牌字符识别新方法,采用小波变换提取字符特征,神经网络实现字符识别,加快了算法的执行,提高了识别率。
处理流程图: 图像输入图像预处理车牌定位字符分割字符识别图像输出 2. 各模块的实现(此处仅为处理后的结果图,详细代码见附录)
(1)输入待处理的原始图像: 原图:
I=imread('car2.png'); figure;
subplot(321); imshow(I); title('原图');
(2)图像的灰度化
彩色图像包含着大量的颜色信息,不但在存储上开销很大,而且在处理上也会降低系统的执行速度,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。由彩色转换为灰度的过程叫做灰度化处理。选择的标准是经过灰度变换后,像素的动态范围增加,图像的对比度扩展,使图像变得更加清晰、细腻、容易识别。
sx=[-1 0 1;-2 0 2;-1 0 1]; sy=[1 2 1;0 0 0;-1 -2 -1]; sox=imfilter(I1,sx); soy=imfilter(I1,sy); subplot(323); imshow(sox+soy);
title('边缘检测后图像'); se=[1;1;1];%线型构造函数 I3=imerode(sox+soy,se); subplot(324); imshow(I3);
title('腐蚀后的图像');
se=strel('rectangle',[25,25]); %矩形结构元素 I4=imclose(I3,se);%图像聚类、填充图像 subplot(325); imshow(I4);
title('填充后图像');
I5=bwareaopen(I4,1500);%去除聚团灰度值小于2000的部分 subplot(326); imshow(I5);
title('形态滤波后图像');
定位后
(7)车牌字符分割
确定车牌位置后下一步的任务就是进行字符切分分离出车牌号码的全部字符图像。考虑到基于投影分析字符的分割方法和基于连通域分析的字符分割方法实现起来比较复杂,于是我就综合前人方法总结出自己的算法。车牌字符分割包括字符分割和单个字符识别两个模块。考虑
到获取的图像可能存在一定缺陷,因此在进行字符分割之前要先对定位后的车牌图像进行预处理,以方便后面的工作。
车牌上共有7个字符,间距相等,设平均字宽为W,还有一个分隔符“﹒”占1/2字宽。通过之前的预处理,可以将分隔符“﹒”用滤波器去掉。设f(i,j)是文字的二维点阵图形,有文字处为1,否则为0。首先在
f(i,j)0处切割,若两个文字相粘连时,其间隔处便不会出现
kf(i,j)0,此时就要辅之以求平均字宽的方法。若某个字宽WW,说明Wk中含有一
个以上的文字,需要继续分割。由于在字符识别中我准备采用模板匹配的方法,因此需要将已分割出来的字符进行归一化处理。因为我所采用的模板的尺寸为4020,因此需要将分割出的字符也归一化为4020的尺寸。 首先对彩色车牌进行二值化:
对二值图像进行形态滤波:
最后得到目标车牌区域:
经过以上步骤得到分割后的图像:
(8)车牌字符识别
字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。建立数字库对该方法在车牌识别过程中很重要, 数字库准确才能保证检测出的数据正确。基于人工神经元网络的算法有两种,一种是先对特征提取待识别字符,然后用所获得的特征训练神经网络分配器;另一种是直接将待处理图像输入网络由网络自动实现特征提取直至识别结果。在本程序中用基于人工神经元网络识别车牌字符。在车牌字符识别部分, 字符集中包含约50个汉字, 26个大写英文字母及10个阿拉伯数字。总的字符样本并不太多。进行车牌识别前需要使用样本对神经网络进行训练,然后使用训练好的网络对车
牌进行识别。其具体流程为:使用汉字、字母、字母数字、数字四个样本分别对四个子网络进行训练,得到相应的节点数和权值。对已经定位好的车牌进行图像预处理,逐个的特征提取,然后从相应的文件中读取相应的节点数和权值,把车牌字符分别送入相应的网络进行识别,输出识别结果。
此处我们给出10个阿拉伯数字,8个字母作为样本:
将样本进行归一化为50X20大小,再将图像按列转换成一个1000X1的行向量,将上述18个图像的样本排列在一起构成1000X18的矩阵样本,尽可能多的采集汽车图像提取车牌,部分切分出车牌字符,构造出更多1000X18的矩形样本,用构造好的样本库对神经网络进行训练。
三、设计结果及分析
通过匹配得到的结果图为:
从上面结果可以看出,这张车牌的识别失败了,将8误识别为M了,再次经过培训后匹配出图像如图:
这在识别中误将8匹配成了P匹配结果再次失败了,因此需要在其他方面做些弥补,最后经过修改库里面里的8.jpg文件最终达到如下识别效果。进行匹配得到的结果图为:
此次结果正确。
经过实际测试,基于MATLAB的车牌识别系统可以实现基本的车牌识别功能,但是整个系统还存在一些缺陷。第一识别率无法达到百分之一百,这与字符模板本身的准确度有很大的关系;第二可以识别的图像种类有限,车牌必须占整个图像面积比较大才可以识别,如果车牌面积较小甚至无法对车牌进行定位。在车牌识别的过程中数字库的建立很重要,只有数字库的准确才能保证检测出来的数据正确。切割出来的数据要与数据库的数据作比较,所以数据库的数据尤为重要,必须使数据库里的数据具有普遍代表性。
四、总结
本次期末大作业要求我们在众多题目中选做一题,最后我选择了最车牌识别。在做这个大作业之前,我本以为车牌识别比较简单,但是接触以后才发现限制车牌识别的因素很多,要想识别任意图像是非常困难的。本次作业我主要是对车牌识别系统的软件部分进行了研究,分别
从图像预处理、车牌定位、字符分割以及字符识别等方面进行了系统的分析。做完这次车牌识别大作业后,我感觉它的工作量的确很大,花费了我不少时间,采集数据、一遍遍地尝试着各个图片有些图片不可以定位出车牌、有些不可以切割准确等等最后经过一次次的培训。通过这次期末大作业,我明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。通过这次期末大作业也让我学会了很多,主要有以下几点:1、巩固了数字图像处理课上所学的知识,比如滤波、膨胀、腐蚀、边缘提取等等。2、通过这次大作业使我对Matlab的使用更加熟练了。3、为了完成车牌识别系统,除参考老师给的资料之外,我还从网上查阅了不少资料,与同学交流经验和自学,并向老师请教,使自己学到了不少知识,也经历了不少艰辛,在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。4、通过这次作业我深刻感受到要实现一个系统的功能是一件很复杂的事。所以说实现一个比较完善的系统就需要对其中的每个部分进行优化设计,这也是我以后需要努力的。最后感谢王老师对我们的悉心指导。
五、参考文献
1. 白利波 车牌检测与识别算法研究[D]北京交通大学,2007,30-31.
2. 谢盛嘉 梁竞敏 车牌识别系统的设计与实现[J]微计算机信息 2010(6)
3. 王刚 冀小平 基于MATLAB的车牌识别系统的研究[J]电子设计工程2009(11) 4. 王广宇 车辆牌照识别系统的原理及算法研究[D]郑州大学 2000
5.崔江 王友仁.车牌自动识别方法中的关键技术研究[J]计算机测量与控制,2003.11(4) 6. 许志影 李晋平.MATLAB在图像处理中的应用[J].计算机与现代化,2004(4) 7.刘卫国 MATLAB程序设计与应用[M].北京:高等教育出版社,2002
8. 成瑜 汽车牌照自动识别技术研究[J].南京航空航天大学学报,2006,4:29-30
附录
Location函数:
function I2 = Location() I=imread('P1.jpg');%读取图像
figure(); subplot(3,2,1),imshow(I), title('原始图像');
I1=rgb2gray(I);%转化为灰度图像
subplot(3,2,2),imshow(I1),title('灰度图像');
I2=edge(I1,'robert',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); figure();
subplot(3,2,1),plot(0:y-1,Y1),title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素'); %%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%% PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2 for i=PY1:PY2 if(I6(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end subplot(3,2,2),plot(0:x-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('像数'); %%%%%%%求的车牌的列起始位置和终止位置%%%%%%%%% PX1=1; while ((X1(1,PX1)<3)&&(PX1 PX1=PX1-1; PX2=PX2+1; %分割出车牌图像% dw=I(PY1:PY2,PX1:PX2,:); subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像') if isrgb(I) I1 = rgb2gray(I); %将RGB图像转化为灰度图像 else I1=I; End g_max=double(max(max(I1))); g_min=double(min(min(I1))); T=round(g_max-(g_max-g_min)/2.1); % T 为二值化的阈值 [m,n]=size(I1);% d:二值图像 %h=graythresh(I1); I1=im2bw(dw,T/256); subplot(3,2,4); imshow(I1),title('二值化车牌图像'); I2=bwareaopen(I1,20); subplot(3,2,5); imshow(I2),title('形态学滤波后的二值化图像'); end Pretreatment函数: function inpt = Pretreatment(I) %% 训练样本前期处理 if isrgb(I) I1 = rgb2gray(I); else I1=I; end I1=imresize(I1,[50 25]);%将图片统一划为50*25大小 I1=im2bw(I1,0.9); [m,n]=size(I1); inpt=zeros(1,m*n); %% 将图像按列转换成一个行向量 for j=1:n for i=1:m inpt(1,m*(j-1)+i)=I1(i,j); end end end StringSplit函数: function [ PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6 ] = StringSplit(I2) [y1,x1,z1]=size(I2); I3=double(I2); TT=1; %%%%%%%去除图像顶端和底端的不感兴趣区域%%%%% Y1=zeros(y1,1); for i=1:y1 for j=1:x1 if(I3(i,j,1)==1) Y1(i,1)= Y1(i,1)+1 ; end end end Py1=1; Py0=1; while ((Y1(Py0,1)<20)&&(Py0 while((Y1(Py1,1)>=20)&&(Py1 imshow(I2),title('目标车牌区域'); %%%%%% 分割字符按行积累量%%%%%%% 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(5); plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量'); Px0=1;Px1=1; %%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%% for i=1:7 while ((X1(1,Px0)<3)&&(Px0 while (((X1(1,Px1)>=3)&&(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(3); subplot(1,7,i); imshow(Z); Px0=Px1; end end 主函数: close all; clear all; %% 归一化训练样本 I0=pretreatment(imread('BP/0.jpg')); I1=pretreatment(imread('BP/1.jpg')); I2=pretreatment(imread('BP/2.jpg')); I3=pretreatment(imread('BP/3.jpg')); I4=pretreatment(imread('BP/4.jpg')); I5=pretreatment(imread('BP/5.jpg')); I6=pretreatment(imread('BP/6.jpg')); I7=pretreatment(imread('BP/7.jpg')); I8=pretreatment(imread('BP/8.jpg')); I9=pretreatment(imread('BP/9.jpg')); I10=pretreatment(imread('BP/A.jpg')); I11=pretreatment(imread('BP/B.jpg')); I12=pretreatment(imread('BP/C.jpg')); I13=pretreatment(imread('BP/G.jpg')); I14=pretreatment(imread('BP/L.jpg')); I15=pretreatment(imread('BP/M.jpg')); I16=pretreatment(imread('BP/N.jpg')); I17=pretreatment(imread('BP/P.jpg')); P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14',I15',I16',I17']; T=eye(18,18); %输出样本 %% bp神经网络参数设置 net=newff(minmax(P),[1250,32,18],{'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); %训练样本 %% 测试 %I=imread('CAR/0.jpg'); DW=Location();%车牌定位 [PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(DW);%字符分割及处理 %% 测试字符,得到识别数值 PIN0=pretreatment(PIN0); PIN1=pretreatment(PIN1); PIN2=pretreatment(PIN2); PIN3=pretreatment(PIN3); PIN4=pretreatment(PIN4); PIN5=pretreatment(PIN5); PIN6=pretreatment(PIN6); P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6']; for i=2:7 T0= sim(net ,P0(:,i)); T1 = compet (T0) ; d = find(T1 == 1) - 1; if (d==10) str='A'; elseif (d==11) str='B'; elseif (d==12) str='C'; elseif (d==13) str='G'; elseif (d==14) str='L'; elseif (d==15) str='M'; elseif (d==16) str='N'; elseif (d==17) str='P'; elseif (d==0) str='0'; elseif (d==1) str='1'; elseif (d==2) str='2'; elseif (d==3) str='3'; elseif (d==4) str='4'; elseif (d==5) str='5'; elseif (d==6) str='6'; elseif (d==7) str='7'; elseif (d==8) str='8'; elseif (d==9) str='9'; else str=num2str(d); end switch i case 2 str2=str; case 3 str3=str; case 4 str4=str; case 5 str5=str; case 6 str6=str; otherwise str7=str; end end %% 识别出的结果以标题形式显示在图上 S=strcat('云',str2,str3,str4,str5,str6,str7); figure(); imshow(DW),title(S,'fontsize',40); 因篇幅问题不能全部显示,请点此查看更多更全内容