1、信息处理课程设计基于 Matlab GUI 的车牌识别学院:计算机学院指导教师:杨小东班级:信科 12(3)班姓名:郭柱材学号:081234511摘要:此次课程的主题为信息处理,本设计为基于 Matlab GUI 车牌识别系统,以此例学习研究有关于图像处理方面的原理知识及应用。此次车牌识别系统的设计过程可分为五大模块:原图预处理,车牌提取,车牌预处理,字符分割,字符模板匹配,基于 Matlab GUI 的程序界面化。最终成功实现通过人机交互界面提取车牌并识别车牌字符的功能。关键词:车牌识别,Matlab,GUI2目录一. 绪论 .31.1 车牌号识别技现实意义 31.2 车牌识别技术的研究现状
2、 31.3 车牌识别技术的未来发展趋势 4二.车牌识别技术简介 .5三.车牌识别系统设计流程 .63.1 源图像预处理 .63.1.1.车牌读取 .63.1.2.车牌图像灰度化 .73.1.3.边缘检测 .83.1.4.灰度图腐蚀 .93.1.5.图像平滑处理 .103.1.6.移除小对象 .113.2 车牌提取 123.3 车牌图像预处理 143.4 字符分割 153.5 字符模板匹配识别 19四.系统界面化 23五.补充代码 25六总结 .293一. 绪论1.1 车牌号识别技现实意义随着我国公路交通事业的发展,车辆的数量正在迅速增长,在给出行提供方便的同时,车辆管理上存在的问题日益突出,人
3、工管理的方式已经不能满足实际的需要。微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。作为信息来源的自动检测、图像识别技术越来越受到人们的重视。近年来计算机的飞速发展和数字图像技术的日趋成熟,为传统的交通管理带来巨大转变,先进的计算机处理技术,不但可以将人力从繁琐的人工观察、监测中解放出来,而且能够大大提高其精确度,汽车牌照自动识别系统就是在这样的背景与目的下进行开发的。汽车牌照等相关信息的自动采集和管理对于交通车辆管理、园区车辆管理、停车场管理、交警稽查等方面有着十分重要的意义,成为信息处理技术的一项重要研究课题。1.2 车牌识别技术的研究现状自 1988 年车辆牌照识别(L
4、icensePlateReeognition, LPR)技术推出以来,人们就对其进行了广泛的研究。国外己有不少相关的文章发表,有的己经非常成熟,投入实际使用。在各种应用中有对静态图像处理的系统,如 Huang 一 MuHwang的APC 一 BASEDCARLICENSEPLATEREADER在收费站硬件设施较好的条件下,平均 0.7 秒内识别率达到 97%,如此一些系统的成功实现大大受益于国外车牌的规范统一。从实用产品来看,比较有名的是以色列的 Hi 一 TeehSolutions 公司、Zamir 公司、匈牙利的 AdaptiveReeognition 公司和新加坡的 Optasia 公司
5、等。我国车牌自动识别的研究起步较晚,大约发生在八十年代末。1988 年戴营等人利用常见的图像处理技术方法提出汉字识别的分类是在提取汉字特征的基础上进行的。根据汉字的投影直方图(ProjectionHIStogram),选取浮动阂值,进行量化处理后,形成一个变长链码,再用动态规划法,求出与标准模式链码的最小距离,实现细分类,完成汉字省名的自动识别。上海交通大学计算机戚飞虎等4人研究的基于彩色分割的牌照自动识别系统;华中科技大黄心汉等人研究的基于板匹配和神经网络的牌照识别系统;以及浙江大学图形图像研究所潘云鹤等人研究的“车牌通”产品等。此外,西安交通大学的图像处理和识别研究室、清华大学人工智能国家
6、重点实验室等各大高校也正在做类似的研究。1.3 车牌识别技术的未来发展趋势车牌识别产品的竞争将更多的强调成像、图像预处理、算法、业务逻辑等系统各环节的相互配合。特别是物理成像以及图像预处理的水平可能会成为下阶段发展的关键,其原因在于当识别算法的发展达到一定的高度,短期内很难会出现非常突破性的变革,这时如何能够通过成像、光源、降噪等环节来为核心算法扫清障碍就成为了影响产品最终性能的制衡点。此外,与整体安防行业的发展相应,以下几个趋势对车牌识别产品的影响将会非常深远:1.3 更高的分辨率及画面质量作为一种典型的模式识别算法,车牌识别一直期望有更高的图像分辨率。如果相机的分辨率可以提升千万量级,车牌
7、识别的识别指标将会更加逼近“几乎不出错”的极限,而且车牌识别能够稳定工作的区域也会明显增大。除了分辨率提升外,画面质量也是同等重要的问题,近年来高清相机的分辨率虽然提升的速度很快,但在动态范围的表现上却差强人意,导致在一些场景下出现亮处细节和暗处细节无法兼顾的问题,这将是下阶段相机发展的关键点之一。2更高的计算能力和集成度高清相机的发展必然导致车牌识别算法需要更大的计算资源,嵌入式平台核心芯片的更新速度将会直接影响车牌识别产品的形态以及发展方向,可以预见,今后更多的相关业务将会被放置在车牌识别智能相机上。3更高的易用性、更强的适应能力目前车牌识别算法本身的难题主要集中在车牌受到各种干扰时如何保
8、证尽可能准确地识别,例如大型车常见的车牌污损、私家车辆规避限号的车牌遮挡、光照环境形成的阴影干扰等等。此外,车牌识别产品的参数配置一直相对繁琐,这很大程度上是为了能够通过精确的调整相机成像、补光、算法的各个环节来5确保达到最好的识别效果。如何利用好高分辨率和高计算能力来降低系统的操作难度,进一步解决这些经典的技术问题,提高系统配置的自动化水平是车牌识别产品下阶段需要着重投入的方向。二.车牌识别技术简介一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部
9、分,一个车牌识别系统的基本结构如图 2.1 所示:原始图像图像预处理车牌位置提取字符分割字符识别输出结果图 2.1 车牌识别系统基本结构框图(一):原始图像:由停车场固定彩色摄像机、数码相机或其他扫描装置拍摄到的图像。(二):图像预处理:对动态采集到的图像进行滤波,边界增强等处理以克服图像处理。(三):车牌位置提取:通过运算得到图像的边缘,再计算边缘图像的投影面积,寻找谷峰点以大概确定车牌的位置,再计算连通域的宽高比,剔除不在阈值范围内的连通域,最后便得到了车牌区域。(四):车牌预处理:对提取到的车牌进行二值化,滤波,删除小面积等预处理车牌预处理6(五):字符分割:利用投影检测的字符定位分割方
10、法得到单个的字符。(六):字符识别:利用模板匹配的方法与数据库中的字符进行匹配从而确认出字符。(七):输出结果:得到最后的汽车牌照,包括汉字、字母和数字。三.车牌识别系统设计流程3.1 源图像预处理3.1.1.车牌读取目前常用的图像格式主要有*.PCX、*.BMP、*.JPG 、*.TIFF、*.GIF 等,本设计采集到的图片格式为*.JPG 格式,这种格式的图像占有的存储空间小,而且是使用最广的图片保存和传输格式,大多数的摄像设备也都是以*.JPG 格式保存图像的。利用图像工具的图像读取函数 imread() 来读取一副图像,其使用格式为:%uigetfile(读取文件名和路径) 图片名.J
11、PG(文件名和类型)filename ,pathname=uigetfile(*.JPG,选择图片);str=pathname, filename; I=imread(str);figure,imshow(I); %显示要处理的图像title(原始处理图像);73.1.2.车牌图像灰度化由于车牌底色跟上面的字符的颜色对比度很大,所以将 RGB 图像转化为灰度图时,车牌底色跟字符的灰度值也会相差很大,这样就可以很明显的显现出车牌区域,便于后续处理。本系统使用的是 MATLAB 内的灰度图转换函数rgb2gray(),其图像灰度值计算公式为:G=0.299R+0.578G+0.114B; 程序源代
12、码为:I1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(I1);title(灰度图);%画出灰度图的灰度直方图figure(2),subplot(1,2,2),imhist(I1);title(灰度直方图);83.1.3.边缘检测在 Matlab 中利用函数 edge()实现边缘检测,在 edge()函数中有 Sobel 算子,Prewitt 算子,Roberts 算子,Log 算子,Canny 算子及 Robert 算子,几种算法相比之下,Roberts 算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,他采用对角线方向相邻两象素之差近
13、似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感, 无法抑制噪声的影响。 因此本课题使用了 Robert 算子。程序源代码为:I2=edge(I1,roberts,0.23,both); %0.23 为敏感度阀值93.1.4.灰度图腐蚀所谓腐蚀即一种消除边界点,使边界向内部收缩的过程。利用它可以消除小而且无意义的物体。腐蚀的规则是输出图像的最小值是输入图像领域中的最小值,在一个二值图像中,只要有一个像素值为 0,则相应的输出像素值为 0。假设 B 对 X 腐蚀所产生的二值图像 E 是满足以下条件的点(x,y) 的集合:如果 B的原点平移到点(x,y),那么 B 将完全
14、包含于 X 中。本系统使用 imerode()函数:程序源代码为:se=1,1,1;I3=imerode(I2,se);103.1.5.图像平滑处理得到车牌区域的图像轮廓线后,由于图像的数字化误差和噪声直接影响了脚点的提取,因此在脚点提取之前必须对图像进行平滑处理,Matlab 有一个图像平滑处理函数 imclose(),它与开运算相反,融合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。结构单元中 Se 一个小于对象闭合图形,只要两个封闭域的距离小于 Se,就将这两个连接成一个连通域。其中 Se 是一个一个 10*10的矩形,使用矩形是因为车牌是一个矩形,这样,可以是提取的图像最接近预期效
15、果。由于车牌图像经过腐蚀以后只剩下车牌区域以及车的标志。程序源代码为:se=strel(rectangle,10,10); I4=imclose(I3,se);113.1.6.移除小对象图像平滑处理了,可能会有多个闭合区域,对于不是车牌区域的必须予以删除,Matlab 提供了一个函数 bwareaopen(),用于删除二值图像中面积小于一个定值的对象, 本设计中面积小于 2500 的对象都需要被删除。I5=bwareaopen(I4,2500); %删除 I4 中面积小于 2500123.2 车牌提取将原图像预处理后,采用水平垂直双向投影法,将图像分别投影到 X、Y 坐标轴,然后分别沿 X、Y
16、 轴扫描图像。当沿 Y 轴扫描时,一边扫描一边统计图像中白色像素点的个数,第一次扫描到白色像素点最多的行时停止扫描,并记录下白色像素点最多的行,然后以这行为基点,分别向上、向下扫描直到统计的像素点小于像素点阀值时,停止扫描,记录上下行的,即为车牌在图像中的上边沿和下边沿所在的行数源程序代码为y,x,z=size(I5); %返回图像 I5 的大小(行,列,面)myI=double(I5);tic%以图片行数 y 建立一个零向量,只有一列,数值全为 0,用于记录白色像素值Blue_y=zeros(y,1); for i=1:y %从图片第一行开始,从上往下检索for j=1:x %从图片第一列开
17、始,从左往右检索if(myI(i,j,1)=1) %如果该点为白色,13Blue_y(i,1)=Blue_y(i,1)+1;%Blue_y(i,1)为第 i 行,第一列(只有一列)的值,初值都为 0,存储白色像素的多少endendendtemp MaxY=max(Blue_y); %temp 记录蓝色像素最大为多少,MaxY 记录蓝色像素最多的一行PY1=MaxY; while (Blue_y(PY1,1)=5) %图片往上扩展endPY2=MaxY;while (Blue_y(PY2,1)=3)endCP=I(PY1+45:PY2-18,PX1+5: PX2-15,:);显示结果为3.3 车
18、牌图像预处理由于图像车牌号区域提取后获得的是从原始图像中剪切的,是 RGB 图像,后续的分割处理同样采取投影法,故同样需要先将 RGB 图像转换成灰度值,再将灰度图转化成二进制图,转化的方法就是限定一个阀值,如果大于阀值则为1,小于阀值为 0。将车牌二值化后还需对车牌灰度图像进行删除小对象处理。经过以上处理过程后可以得到黑底白字的车牌图片。其中删除小对象处理主要是为了删除第二个字符和第三个字符之间的那一15个点符号,为后续进行分割处理做好准备。3.4 字符分割完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符
19、内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。2007 年颁布的我国车牌规范( 普通中小型汽车) 规定车牌总长 440mm,牌照中的 7 个字符的实际总长为 409mm 左右,宽 140mm,每个字符 45mm 宽,90mm 高,字符间距为 10mm,其中第二个字符与第三个字符的间距较为特殊,为 15.5mm,最后一个字符与第一个字符距边界 25mm。这样,如果平均分配每个字符在牌照中占据的宽度,那么每个字符宽度为:width/7(width 为车牌图像的宽度) 。但是,实际上,
20、第二个第三个字符之间存在一个黑点,牌照左右两边与图像边缘也都有一定的宽度,所以每个字符的宽度应该小于 width/7。考虑所有的情况,一般情况下最小的宽度为 width/9。因此,字符的宽度可以从16width/9 到 width/7 之间渐进的变化得到,程序流程图为N YNY源程序代码为:d=fenge(d);m,n=size(d);figure,subplot(2,1,1),imshow(d),title(n);k1=1;k2=1;s=sum(d);j=1; %假定图像为 nm 矩阵,sum 命令对图像的 x 维进行开始车牌二值图像切除周边空白垂直投影从左往右查找,垂直投影白色像素点累计小
21、于 10 的值得 wide以水平区域(0 , wide)剪切出字符将剩余部分保存结束判断是否为标准字符字符个数是否为 7个保存这个字符17求和得到一个 1m 矢量,每一点的值代表该 y 坐标上所有点光强之和。while j=n while (s(j)=0)j=j+1;endk1=j;while(s(j)=0 %Y,U=min(A):返回行向量 Y 和U,Y 向量记录 A 的每列的最小值, U 向量记录每列最小值的行号d(:,k1+num+5)=0;endend%在切割d=fenge(d);%切割出 7 个字符y1=10;y2=0.25;flag=0;word1=;while(flag=0)m,
22、n=size(d);left=1;wide=0;while(sum(d(:,wide+1)=0)wide=wide+1;endif widey2flag=1;word1=temp; %第一个字符endd(:,1:wide)=0;d=fenge(d);endend% 分割出第二个字符word2,d=getword(d);% 分割出第三个字符word3,d=getword(d);% 分割出第四个字符word4,d=getword(d);% 分割出第五个字符word5,d=getword(d);% 分割出第六个字符word6,d=getword(d);% 分割出第七个字符word7,d=getwor
23、d(d);m,n=size(word1);%将待识别字符的图像进行归一化处理,使其长宽与模板字符图像长宽一致,模板使用的是 40*20 的图片尺寸,待识别字符图像归一化代码为:19word1=imresize(word1,40 20);word2=imresize(word2,40 20);word3=imresize(word3,40 20);word4=imresize(word4,40 20);word5=imresize(word5,40 20);word6=imresize(word6,40 20);word7=imresize(word7,40 20);字符切割且标准化后为3.5
24、字符模板匹配识别目前字符识别方法主要有神经网络识别法和模板匹配法。人工神经网络是模拟人脑思维功能和组织建立起来的数学模型,但总体来说其应用还是相对复杂的。模板匹配法是将从待识别的图象或图象区域 f(i,j)中提取的若干特征量与模板 T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。本系统使用的是较为简单的模板匹配法来识别字符的。 字符模板匹配法的流程为20源程序代码为Modelword=char(0:9 A:Z 粤京桂川);%建立模板字符列表Sub
25、Tu=zeros(32,16); %建立一个 32*16 的零数组,记录两图相减后的结果L=1; for n=1:7 %n 记录 17 个字符ns=int2str(n);t=imread(ns,.jpg);%读取分割后的字符P_word=imresize(t,32 16,nearest);P_word=double(P_word)20;建立模板字库表读取分割出来的字符第一个字符与模板中的汉字模板进行比对,对应的字库下标为 3740识别完成,输出此模板对应的值第二个字符与模板中的字母模板进行比对,对应的字库下标为 1136后五个字符与模板中的字母与数字模板进行比对,对应的字库下标为 136求带识
26、别字符与模板字符的相关系数,相关系数越大,说明其相似度越大21if L=1 %如果 L=1,则识别车牌上的第一个字符(汉字),汉字在模板字符列表的序号是 3740wmin=37;wmax=40;elseif L=2 %如果 L=2,识别第二个英文字符,英文在模板字符列表的序号是1136wmin=11;wmax=36;else L=3 %如果 L=3,识别的字符可能是数字或字母,在模板字符列表的序号是 136wmin=1;wmax=36;endfor W=wmin:wmax %当确定检验字符的类型后,在其序号范围内一个一个字符的匹配fname=strcat(E:MATLAB字符模板,Modelw
27、ord(W),.bmp); %strcat 连接字符串,得到第 W 个模板字符的文件名M_word=imread(fname); %读取模板字符M_word=double(M_word)1;for a=1:32 %字符车牌图片统一化为 40*20 后,从每一行,每一列开始一一与模板对应的位置像素值比较(相减)for b=1:16SubTu(a,b)=P_word(a,b)-M_word(a,b);endend22num=0;for c=1:32for d=1:16if (SubTu(c,d) 0 | SubTu(c,d) y2d(:,1:wide)=0;if sum(sum(d)=0d=fen
28、ge(d);%切割出最小范围else word=;flag=1;endelseword=fenge(imcrop(d,1 1 wide m);d(:,1:wide)=0;if sum(sum(d)=026d=fenge(d);flag=1;else d=;endendendresult=d;(2)%创建切割函数function e=fenge(d)m,n=size(d); %处理后的车牌图像大小为 m*n%初始化top=1;bottom=m;left=1;right=n;%从图像上下边分别往中间开始,检测到有字(d(x,y)=1)时停止while (sum(d(top,:)=0end%从图像左
29、右边分别往中间开始,检测到有字(d(x,y)=1)时停止while (sum(d(:,left)=027end%切割字符的长宽dd=right-left;hh=bottom-top;%返回切割后的图像e=imcrop(d,left top ddhh); %imcrop(图象名,x 起点,y 起点,x 宽度,y 宽度) %imcrop(x,20 20 50 50)从( 20,20 )开始剪下 50*50 的区域菜单栏的视图的回调函数原图像预处理I=getappdata(handles.figure1,I);I1=getappdata(handles.figure1,I1);I2=getappda
30、ta(handles.figure1,I2);I3=getappdata(handles.figure1,I3);I4=getappdata(handles.figure1,I4);I5=getappdata(handles.figure1,I5);figure(5),subplot(2,3,1),imshow(I);title(1.原始车牌图像);figure(5),subplot(2,3,2),imshow(I1);title(2.灰度图); figure(5),subplot(2,3,3),imshow(I2);title(3.robert 算子边缘检测);figure(5),subpl
31、ot(2,3,4),imshow(I3);title(4.腐蚀后的图像);figure(5),subplot(2,3,5),imshow(I4);title(5.平滑图像的轮廓);figure(5),subplot(2,3,6),imshow(I5);title(6.从图像中删除小对象);车牌信息globalBlue_x;globalBlue_y;I1=getappdata(handles.figure1,I1);CP=getappdata(handles.figure1,CP);I6=getappdata(handles.figure1,I6);28I7=getappdata(handles
32、.figure1,I7);figure(2),subplot(2,3,1),imshow(I1);title(灰度图);figure(2),subplot(2,3,2),imhist(I1);title(灰度直方图);figure(2),subplot(2,3,4),imshow(CP);title(车牌原图);figure(2),subplot(2,3,5),plot(Blue_x),title(行向蓝色点统计);figure(2),subplot(2,3,6),plot(Blue_y),title(纵向蓝色点统计 );车牌预处理b=getappdata(handles.figure1,b)
33、;d=getappdata(handles.figure1,d);d1=getappdata(handles.figure1,d1);d2=getappdata(handles.figure1,d2);CP=getappdata(handles.figure1,CP);figure(8),subplot(2,2,1),imshow(CP),title(1.车牌原图像);figure(8),subplot(2,2,2),imshow(b),title(2.车牌灰度图像 );figure(8),subplot(2,2,3),imshow(d),title(3.=车牌二值图像);figure(8),
34、subplot(2,2,4),imshow(d2);title(4.从图像中删除小对象 );字符分割word1=getappdata(handles.figure1,word1);word2=getappdata(handles.figure1,word2);word3=getappdata(handles.figure1,word3);word4=getappdata(handles.figure1,word4);word5=getappdata(handles.figure1,word5);word6=getappdata(handles.figure1,word6);word7=geta
35、ppdata(handles.figure1,word7);figure(9),subplot(1,7,1),imshow(word1),title(1);figure(9),subplot(1,7,2),imshow(word2),title(2);29figure(9),subplot(1,7,3),imshow(word3),title(3);figure(9),subplot(1,7,4),imshow(word4),title(4);figure(9),subplot(1,7,5),imshow(word5),title(5);figure(9),subplot(1,7,6),ims
36、how(word6),title(6);figure(9),subplot(1,7,7),imshow(word7),title(7);六总结本此课程设计为基于 MatlabGUI 的车牌识别系统,在本文中简述了有关车牌识别技术的四个方面的内容:(1) 在第一部分内容中简单介绍了车牌识别在现实生活中对交通管理领域的重要意义,现如今国内外对车牌识别技术的研究成果,以及车牌识别技术未来的发展方向,使车牌识别准确度进一步提高,让其使用过程简单有效。(2) 在第二部分中本文概述了车牌识别的简易流程:一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬
37、件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部分。(3) 第三部分内容详细的介绍了车牌识别过程的具体步骤以及其中需要用到的函数和具体源程序代码,在 Matlab 中提供了许多库函数以供用户使用,我们可以直接调用函数进行图像的处理,其中我们需要了解每个函数的基本用法和参数设定,通过不断调整参数达到最佳效果。(4) 第四部分内容中简单介绍了 Matlab 的 GUI 用法,将上面的车牌识别过程的源代码封装到可视化界面中,实现便于操作的人机交互界面。本次课程设计总体来说比较成功,通过本次设计让我初步掌握了有关使用Matlab 进行图像处理的知识,了解了车牌识别的具体过程及原理。在整个系统设计过程中会遇到大大小小各种问题,例如对于处在特定环境的车牌我们要找