《基于MATLAB的车牌识别系统设计(24页).docx》由会员分享,可在线阅读,更多相关《基于MATLAB的车牌识别系统设计(24页).docx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于MATLAB的车牌识别系统设计-第 - 22 - 页数字图像处理课程设计基于MATLAB的车牌识别摘要车牌照自动识别是计算机视觉与模式识别技术在智能交通领域的重要应用。是实现交通管理的重要环节之一。本文通过对输入的车牌图像处理,运用字符分割、字符识别的方法提取车牌上的字符串,其目的是识别出车牌的字符,以方便车辆资料的管理以及其安全保障。字符识别是整个车牌识别过程中最重要的一环,识别的关键在于特征的提取和分类器的选择,本文先对字符大小进行归一化,提取字符特征时充分考虑字符的结构特征,对字符的识别则采用最近邻法所以识别效果理想且时效性好。由实验得出,本文算法能比较准确的对牌照进行分割并进行识
2、别。多种预处理与识别技术提高了系统的识别能力,对车辆牌照自动识别在实际中应用有一定的参考和借鉴价值。关键字:车牌识别、预处理、字符分割、字符识别目录摘要 1一、 绪论1、车牌识别研究背景意义32、车牌识别研究内容3二、原理概述 4三、车牌识别系统程序设计 41、图像预处理41.1灰度处理51.2均值滤波61.3去干扰处理71.4最小值滤波71.5腐蚀膨胀 .81.6小结102、字符切割 102.1确定字符范围 102.2切割字符 122.3、小结153、字符识别 153.1、字符识别方法153.2、字符比较 16四、结论 20附录: 附一:算法流程图 附二:总程序绪论1、车牌识别研究背景意义随
3、着我国公路交通事业的发展,车辆的数量正在迅速增长,在给出行提供方便的同时,车辆管理上存在的问题日益突出,人工管理的方式已经不能满足实际的需要。作为信息来源的自动检测、图像识别技术越来越受到人们的重视。近年来计算机的飞速发展和数字图像技术的日趋成熟,为传统的交通管理带来巨大转变,先进的计算机处理技术,不但可以将人力从繁琐的人工观察、监测中解放出来,而且能够大大提高其精确度,汽车牌照自动识别系统就是在这样的背景与目的下进行开发的。汽车牌照等相关信息的自动采集和管理对于交通车辆管理、园区车辆管理、停车场管理、交警稽查等方面有着十分重要的意义,成为信息处理技术的一项重要研究课题。车牌识别的难点:由于环
4、境、道路或人为因素造成汽车牌照污染严重,这种情况下国外发达国家不允许上路,而在我国仍可上路行驶。使得车牌的对比度降低,特征不是很明显,即使在定位准确的情况下,字符的识别也会受到很大影响。2、车牌识别研究内容车牌识别系统是一特定目标位对象的专用计算机系统,该系统能从一幅图像中自动提取车牌图像、自动分割字符,进而对分割字符的图像进行图像识别。系统一般由硬件和软件构成。硬件设备一般由车体感应设备、辅助光源、摄像机、图像采集卡和计算机。软件部分是系统的核心,主要实现车牌自符的识别功能。该文主要从软件部分进行设计实验。车牌识别的关键技术有:车牌定位、字符切割和字符识别等。字符切割时完成车牌区域图像的切分
5、处理从而得到所需要的单个字符图象。目前常用的方法有:基于投影的方法和基于连通字符的提取等方法。字符识别是利用字符识别的原理识别提取出的字符图像,目前常用的方法有:基于模板匹配的方法、基于特征的方法和神经网络法等。二、原理概述一个完整的车牌识别系统设计要完成从图像采集到字符识别输出,基本可以分成硬件部分和软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部分,根据课程要求我们主要进行软件部分设计,基本结构如图2.1所示:原始图像图像预处理字符分割字符识别输出结果图 2.1 车牌识别系统基本结构框图1、 图像预处理:对车牌图像进行图像转换、滤波、
6、图像增强等。2、 字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像。3、 字符识别:对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码三、车牌识别系统程序设计输入车牌图像灰度校正平滑处理1、图像预处理图3.1预处理流程图1.1灰度处理我国车牌颜色及其RGB值如下,蓝底(0,0,255)白字(255,255,255)、黄底(255,255,0)黑字(0,0,0)、黑底(0,0,0)白字(255,255,255)、红底(255,0,0)黑字(0,0,0),由于车牌的底色不同,所以从RG
7、B图像直接进行车牌区域提取存在很大困难,但不管哪种底色的车牌,其底色与上面的字符颜色的对比度大,将RGB图像转化成灰度图像时,车牌底色跟字符的灰度值会相差很大。例如蓝色(255,0,0)与白色(255,255,255)在R通道中并无区分,而在G、R 通道或是灰度图象中数值相差很大。同理对白底黑字的牌照可用R 通道,绿底白字的牌照可以用G 通道就可以明显呈现出牌照区域的位置,便于后续处理。原图、灰度对于将彩色图象转换成灰度图象时, 在不考虑车牌定位和裁剪的情况下,需要将彩色图像转换成灰度图像,转换时图像灰度值H可由下面的公式计算:H=0.299R+0.587G+0.114BH=B+G+R3在MA
8、TLAB软件中,可用以下语句实现:a=imread(a.jpg);subplot(211),imshow(a);a2=rgb2gray(a);subplot(212),imshow(a2);为了方便字符切割和字符识别,需要将灰度图像进行二值化处理,以此来达到简化操作、加快运算速度的目的。通过以下程序可以实现:a3=im2bw(a2);或:m,n=size(a2);for i=1:m; for j=1:n; if a2(i,j)128 a2(i,j)=255; else a2(i,j)=0; end endend1.2均值滤波经过二值化之后有些小的噪点、毛刺或者分支需要去除。常用的滤波方法主要有
9、中值滤波和均值滤波。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。将某个像素邻域中的像素按灰度值进行排序然后选择该序列的中间值作为输出的像素值让周围像素灰度值的差比较大的像素改取与周围的像素值接近的值从而可以消除孤立的噪声点。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素,再用模板中的全体像素的平均值来代替原来像素值。均值滤波对高斯噪声有较好的抑制作用,故本设计选择均值滤波方式。经过均值滤波后图像变得更加圆滑、噪点减少。参考程序如下:a4=filter2(fspecial(average,7),a3);或:k1=floor(
10、3/2)+1;k2=floor(3/2)+1;X=a2;M,N=size(X);uint8 Y=zeros(M,N);funBox=zeros(3,3);for i=1:M-3 for j=1:N-3 funBox=X(i:i+3,j:j+3); s=sum(funBox(:); h=s/9; Y(i+k1,j+k2)=h; end;end;1.3去干扰处理车牌中前两个字符和后五个字符之间存在一个白点,影响后续的字符分割部分,由于白点位置的固定(28%33%),可对其填充达到去除的目的。参考程序如下:m,n=size(d);for i=1:m for j=floor(28*n/100):flo
11、or(33*n/100) d(i,j)=0; endend1.4最小值滤波当车牌污染严重噪声过多时,采用上述预处理方法强度不够,存在处理过后噪点仍然过多的情况,如图所示。这将会影响字符切割结果,所以需要对这种情况进行特殊处理和算法改进。在该情况下,对该灰度图像进行最小值滤波后再进行后续处理结果会更清晰,大大地减小了噪声对字符切割的影响。通过程序语句实现:a2=ordfilt2(a2,1,ones(5,5);或:m,n=size(a2);K=3;N=K/2;N1=ceil(N);G=zeros(K,K);for i=ceil(N):m-floor(N) for j=ceil(N):n-floor
12、(N) G=a2(i-(N1-1):i+(N1-1),j-(N1-1):j+(N1-1); a2(i,j)=min(min(G); end;end;最小值滤波处理前 最小值滤波处理后 图3.21.5腐蚀膨胀当车牌污染严重或者噪声过多时,往往会造成车牌的字符断裂,此时需要对字符进行腐蚀膨胀之后再进行切割处理。腐蚀膨胀处理后图像中较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线的断裂,同时还能平滑轮廓的一部分。通过调用函数实现:%腐蚀膨胀 se = strel(line,5,100); a2 = imdilate(a2,se); 腐蚀膨胀处理前 腐蚀膨胀处理后 图3.3 腐蚀膨胀处理 改进后的预处
13、理流程图如下:预处理图像切割是否成功字符切割字符识别是输出结果否污染严重影响切割腐蚀膨胀最小值滤波 图3.4预处理流程图1.6、小结通过实验表明,本设计在切割失败后在新的预处理循环中加入最小值滤波和腐蚀膨胀对于车牌污染严重不能识别的现象起到了良好的改进效果,减少了切割失败的情况,提高了车牌识别的准确率。2、字符切割字符分割的方法:垂直投影法:对车牌照区域做吹执法方向上的投影,周线在水平方向上从左至右的检各个坐标的垂直投影数值,当找到第一个局部最小值点的时候,认为这个点是最左字符的边界。得到两边字符的边界之后用同样的方法可以找到每个字符的边界。这种方法有效的李永乐车牌图像在垂直方向上的投影会在字
14、符块之间取得最小值的原理。此方法的关键在于确定好切分宽度的阀值和投影的最小标准。基于彩色车牌字符的分割方法:它是通过提取车牌中字符区域不同于其他区域的特殊色彩特征来区别字符区域和背景区域,从而在车牌中分割出字符。其缺点是难以解决在照明不均匀环境下准确性的问题,并且速度慢,难以达到实时识别的要求。基于边缘检测的方法:它通过提取图像边缘信息进行分析,进而测得车牌字符边缘。其缺点是要求图像边缘的连续性要好,但实际拍摄的车牌字符边框往往不连续。总体比较取舍之后,本设计采用垂直投影法进行字符切割2.1确定字符范围完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。
15、由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。 将经过图像预处理的图像进行灰度垂直投影,可知车牌区域的垂直投影可以清晰地看出7个区域,即车牌的7个字符图像的垂直投影,如图所示。通过垂直投影图的特征,分割字符就转化为只需得到每个区域的左右边界即可。 图3.5垂直投影图2.2切割字符字符切割包括两种处理,第一是切去多余部分,即确定有效的最小的范围,去除字符周围多余的黑色部分;第二是对投影有值的区域进行字符切割,即确定字符边界,切出有效的包含
16、字符的区域。切去多余部分函数:function e=qiege(d)m,n=size(d);top=1;bottom=m;left=1;right=n; % initwhile sum(d(top,:)=0 & top=1 bottom=bottom-1;endwhile sum(d(:,left)=0 & left=1 right=right-1;enddd=right-left;hh=bottom-top;e=imcrop(d,left top dd hh);切割字符函数:function word,result=getword(d)global flag1;word=;flag=0;y1
17、=8;y2=0.5; while flag=0 m,n=size(d); wide=0; while sum(d(:,wide+1)=0 & wide=n-2 wide=wide+1; end temp=qiege(imcrop(d,1 1 wide m); m1,n1=size(temp); if widey2 d(:,1:wide)=0; if sum(sum(d)=0 d=qiege(d); else word=;flag=1; end else word=qiege(imcrop(d,1 1 wide m); d(:,1:wide)=0; if sum(sum(d)=0; d=qieg
18、e(d);flag=1; else d=; end end if n1/m10.9 flag1=1; end %判断是否切割成功 endresult=d;字符切割流程图如下:预处理后图像切去无效部分切割该字符将该字符范围涂黑归一化处理并输出是从左确定第一个字符范围宽度及有效像素比重是否满足要求否 3.6字符切割流程图字符归一化算法:由于图像采集时图像的像素值不一样,经切割出来的字符的大小也会不一样,所以在进行匹配前必须先进行字符图像归一化。使图像字符大小跟模板图像大小一致,Matlab提供一个改变图像大小的函数imresize(I,Size,Model),Model是插值运算方法,这里选用ne
19、arest最近邻插值法,经归一化后的图像如下。 3.7归一化处理图2.3小结通过比较不同的切割算法,本设计采用的垂直投影具有较好且容易实现的特点,在实验过程中均能准确实现字符的切割。通过归一化处理后,切割出的字符与字符库进行比较识别率很好。3、 字符识别读取分割字符逐个字符匹配是否为最小值查找自动字符识别代码表输出结果否是模板字库字符 3.8字符识别流程图3.1字符识别方法 (1) 模板匹配。模板匹配并不需要特征提取过程。字符的图象直接作为特征,与字典中的模板相比,相似度最高的模板类即为识别结果。这种方法简单易行,可以并行处理;但是一个模板只能识别同样大小、同种字体的字符,对于倾斜、无良好的适
20、应能力。 (2)利用变换特征的方法。对字符图象进行二进制变换(如Walsh, Hardama变换)或更复杂的变换(如Karhunen-Loeve, Fourier,Cosine,Slant变换等),变换后的特征的维数大大降低。但是这些变换不是旋转不变的,因此对于倾斜变形的字符的识别会有较大的偏差。二进制变换的计算虽然简单,但变换后的特征没有明显的物理意义。K-L变换虽然从最小均方误差角度来说是最佳的,但是运算量太大,难以实用。总之,变换特征的运算复杂度较高。 (3)投影直方图法。利用字符图象在水平及垂直方向的投影作为特征。该方法对倾斜旋转非常敏感,细分能力差。综合优缺点,本设计选择模板匹配的方
21、法。3.2字符匹配该方法的前提字符匹配识别要前提建立可以与之相比较的字库表,将标准车牌中所含的汉字、字母和数字进行分割归一化处理(40*20)后制作成标准的字库模板如下图。将已切割并进行了归一化处理的单个字符相比较,逐个字符进行匹配比较,再将待识别的字符的特征值和模板字符相减,找到相减值为最小的那个即为匹配得最好的字符。字符识别流程如下:读取分割字符第一个字符与模板中的汉字模板匹配识别完成,输出此模板对应值第二个字符与模板中的字母模板匹配后五个字符与模板中的数字、字母模板匹配待识别字符与模板字符相减,值越小相似度越大,找到最小的一个即为匹配的最好的 3.8字符识别流程图匹配方法采用将目标图像与
22、模板图像逐点做差,得到第三幅图像,参考程序如下:for I=1:7for i=1:40 for j=1:20 Image_Diff(i,j)=Image_Original(i,j)-Image_Mold(i,j); endEndDmax=0;for k1=1:40 for l1=1:20 if (Image_Diff(k1,l1) 0 | Image_Diff(k1,l1)0 ) Dmax=Dmax+1; end endendError(k2)=Dmax;end最后计算第三幅二进制图像中像素值为1的个数,数值最小的即为匹配出来的结果,经对比可得相似度最高的数字。统计第三幅二进制图像中像素值为1
23、的个数,数值最小的即为匹配出来的结果,经对比可得相似度最高的数字,然后查找所建立的自动识别字符代码表,达到识别的目的。参考程序如下:liccode=char(0:9 A:Z 苏豫陕鲁贵京津沪渝冀云辽黑湘皖闽新浙赣鄂桂甘晋蒙吉粤青藏川宁琼); %建立自动识别字符代码表for I=1:7 %共七个字符,逐个识别 MinError=Error(kmin); for q=kmin:kmax if Error(q)=MinError MinError=Error(q); p=q; end end Code(l)=liccode(p); l=l+1; endfigure,imshow(a),title(车
24、牌号码为 , Code,Color,b)1.后五位字符切割过后数字“1”切割过细,归一化后比例失调影响字符识别,容易错误识别成其他字符;3.9归一化处理图2.后五位车牌中“O”和“0”过于接近,因此国家规定车牌中后五位不允许出现字母“O”,均为数字“0”;3.后五位数字“0”和字母“D”相近,出现“0”时有可能会识别成“D”。3.10特殊处理字符改进后的算法:否后五位字符切割“1”像素点个数是否大于500归一化20 40字符为“1”是输出该值否与前最小值相近值之差是否小于10依次与模板相减计算相近值是字符为“0”是否为模板“O”每次取两个中最小值是否3.11改进后算法流程图结论:本课题对车牌识
25、别系统的软件部分进行了研究,分别从图像预处理、车牌定位、字符分割以及字符识别等方面进行了系统的分析。主要工作内容及结论如下:(1)整理和总结了国内外在车牌分割、字符识别方面的研究成果和发展方向,以及车牌识别的特点。(2)在车牌定位我们采用基于灰度跳变的定位方法,采用先对图像进行预处理,再进行二值化操作的方法。实验表明本方法既保留了车牌区域的信息,又减少了噪声的干扰,从而简化了二值化处理过程,实验表明本方法既保留了车牌区域的信息,又减少了噪声的干扰,从而简化了二值化处理过程,提高了后续处理的速度。(3)在车牌预处理流程中本设计在原来的技术上通过最小值滤波和腐蚀膨胀进行了算法的改进,基本解决了噪声
26、较多和字符断裂影响实验结果的问题,在在最后字符识别的过程中根据车牌相关规定将可能出现的“o”,”0”不分的情况进行了强制定义而得到了算法的改进。(4)用MATLAB编程运行结果可以得出,本设计采用的图像预处理、字符切割,字符识别识别等对车牌的定位都是非常有效的,而本设计提出的垂直投影方法准确实现的车牌字符的分割,对多个车牌进行实验,均有很高的正确率。本设计虽然只对蓝底白字车牌进行分割识别,对于其他色彩车牌识别需要对车牌预处理算法进行调整,而车牌字符的分割算法仍然行之有效。因此,本设计提出的车牌字符的分割算法实验证明是准确、有效、可行的。function d=Mfinish()global fl
27、ag1;flag2=0;while(flag2=3 % kmin=1; kmax=36; end for k2=kmin:kmax %O% if l=3&k2=25 continue; end fname=strcat(,liccode(k2),.jpg); SamBw2 = imread(fname); SamBw2 = im2bw(SamBw2); % for i=1:40 for j=1:20 SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j); end end % Dmax=0; for k1=1:40 for l1=1:20 if ( SubBw2(k1,l1)
28、0 | SubBw2(k1,l1) 0 ) Dmax=Dmax+1; end end end Error(k2)=Dmax; end % wh=0; for i1=1:40 for j1=1:20 if SegBw2(i1,j1)=1 wh=wh+1; end end end p=kmin; MinError=Error(kmin); % for q=kmin:kmax if wh500 %1 if Error(q)0&MinError-Error(q)10 %0D continue; end MinError=Error(q); p=q; end else p=2;% end end % C
29、ode(l)=liccode(p); l=l+1; end%figure,imshow(a),title( , Code,Color,b)if flag1=0 bb = char(10) , Code ; msgbox(bb,); imwrite(a,strcat(num2str(Code),.jpg);% break;endend%function word,result=getword(d)global flag1;word=;flag=0;y1=8;y2=0.5; while flag=0 m,n=size(d); wide=0; % while sum(d(:,wide+1)=0 & wide=n-2 wide=wide+1; end temp=qiege(imcrop(d,1 1 wide m); m1,n1=size(temp); % if widey2