--1基于图像处理技术的汽车牌照识别课程图像处理技术指导教师邓继忠专业名称03电子信息工程(1)班工程学院--21.课题组成汽车车牌的识别过程主要包括车牌定位、字符车牌分割和车牌字符识别三个关键环节。其识别流程如下:原始图像:由数码相机或其它扫描装置拍摄到的图像图像预处理:对动态采集到的图像进行滤波,边界增强等处理以克服图像干扰车牌定位:计算边缘图像的投影面积,寻找峰谷点,大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域。最后得到的便为车牌区域。字符分割:利用投影检测的字符定位分割方法得到单个的字符字符识别:利用模板匹配的方法与数据库中的字符进行匹配从而确认出字符,得到最后的汽车牌照,包括英文字母和数字。字符显示:字符匹配后显示出来。2.实现过程本文以一幅汽车图像为例,结合图像处理各方面的知识,利用CVI软件进行程序编程,实现了从车牌的预处理到字符识别的完整过程。各部分的处理情况如下:1.1原始图像图1汽车原始图像本试验为了降低难度系数,在原始图像上采用车牌比较清晰,成像效果较为理想的车牌图像作为试验对象。实际上车牌图像在形成、传输或变换过程中,受多种因素的影响,如:光学系统失真、系统噪声、暴光不足或过量、相对运动等,往往会与原始景物之间或图像与原始图像之间产生了某种差异,这种差异称为降质或退化。这种降质或退化对我们的处理往往会造成影响。因此在图像处理之前采用某种成像较好的图像,降低难度系数。1.2图像预处理原始图像有缺陷,可能存在杂质,边缘模糊等情况,图像处理之前必须进行预处理,包原始图像图像预处理车牌定位字符分割字符识别显示--3括去除噪音杂质,去除边界,图像二值化等处理。因为噪声主要是一些含高频的突变成分,因此可以通过一个低通滤波器来消除图像中包含的噪声,并使低频成分得到增强。滤波的方式有两种,一种是空间域滤波,一种是频率域滤波。在空间域,常见的滤波方式有两种方式,均值滤波和中值滤波。本文通过IMAQ软件提供的IPI_LowHighPass函数实现去除杂质的处理。通过IPI_RejectBorder函数实现去除边界的处理。这时图像还含有多个灰度值,要进行二值化处理,选择一个合适的域值进行二值化处理,在这里通过调用函数IPI_Threshold对车牌图像作二值化处理,在二值化处理之前已经作了选择何种二值化方法的处理。车牌经过预处理后,得到较理想符合程序处理的图像。由于原始图像较理想,包含的杂质较少,故经过处理的图像差别不大。以下是经过处理后的图像:图2去除杂质后的反色图像图3二值化后的图像1.3车牌提取经过预处理提取得到的图像,车牌区域在水平垂直方向灰度面积值具有明显频繁的跳变,在垂直方向上的面积投影则出现峰-谷-峰的特性。根据这种峰谷特点,自动检测车牌位置峰点检测的车牌区域定位方法,并对初步定位后的车牌进一步使用微定位技术。该方法包括三部分:(1)车牌的横向定位;(2)车牌的纵向定位;(3)车牌的微定位--4图5车牌定位后的图像一般对应于车牌位置的投影值灰度值为0的较大,在整个图像中则出现谷点与峰值。只要能找到谷点与峰值,就能大致确定出车牌照的位置,缩小车牌搜索范围。1.4字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,常采用垂直面积投影法来实现。面积投影法的公式如下:由于字符块在竖直方向上的投影必然在字符间或字符内的间隙处取得局部最小值,并且这个位置应满足车牌的字符书写格式、字符尺寸和其他一些条件的限制。下图是在垂直方向上的面积投影图。从图形中我们很直观的看出投影值中出现了8条间隙,即出现了8个谷点与峰值点,有字符的列其灰度值比较高,无字符的则相对比较低。依据这一点,再结合图的特征,很容易得到每个字符的起始终止位置。图6车牌垂直方向上的面积投影图具体如下:在分割出来的车牌区域中,在垂直方向上进行扫描,车牌已经二值化,所以在扫描的过程中,遇到车牌数字的象素点其灰度值应该是255,在该列上统计组成数字的象素点,运用循环语句:for(i=0;i=车牌图像列数;i++)for(j=0;j=车牌图像行数;j++)a[i]++;a[i]是统计在每一列上的象素点数。如果以a[i]为投影数组,以图像的列数为投影区间长度,在均方图上显示出来即得到图6中--5的图像。从中我们可以很清楚的看到有数字的地方,其纵坐标的值明显要高。这时候我们可以再用一个判断语句将车牌数字分割出来,即事先设定一个标志位flag=0;for(i=0;i=车牌列数;i++){if(a[i]=4&&flag==0){if(a[i+1]=4)/*扫描下一列,以确定是数字边界,而非噪声点*/{c[j++]=i;/*保存车牌数字起止地址的数组*/flag=1;/*确定扫描到有数字的边界,置标志位为flag=1,以扫描数字的结}束地址*/}if(a[i]4&&flag==1)/*扫描车牌结束地址*/{if(a[i+1]4){c[j++]=i;flag=0;}}}对于车牌水平方向上的切割方法类似。切割完成后,图像如下:图7字符切割图像一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。将其归一化到标准模板,以方便提取特征值,进行模板匹配。1.5字符识别字符的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR算法以及基于人工神经网络的OCR算法。基于模板匹配的OCR的基本过程是:首先对待识别字符进行二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。用人工神经网络进行字符识别主要有两种方法:一种方法是先对待识别字符进行特征提取,然后用所获得的特征来训练神经网络分类器。识别效果与字符特征的提取有关,而字符特征提取往往比较耗时。因此,字符特征的提取就成为研究的关键。另一种方法则充分利用神经网络的特点,直接把待处理图像输入网络,由网络自动实现特征提取直--6至识别。模板匹配的主要特点是实现简单,当字符较规整时对字符图像的缺损、污迹干扰适应力强且识别率相当高。综合模板匹配的这些优点我们采用提取特征值的方法为车牌字符识别的主要方法。字符识别的算法如下:汽车拍照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种、警别等有特定含义的字符简称;紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。所以建立字符模板库也极为方便。其他模板设计的方法与此相同。1.5.1模板设计分析字符分割得到的图像以及其他车牌图像中字符的特点,将模板大小定为45*70;背景为黑色,代表灰度值0,字符为白色。代表灰度值255。这里直接使用IMAQ中的函数Resample();直接将字符缩放至45*70的标准模板大小。设计过程中字符的识别为先取得汽车牌照字符的标准模板(该模板很重要,将作为以后车牌识别的参考模板,并且已经输入模板库),然后用CVI统计待识别的车牌数字的8位特征值,将这个8位特征值与标准字符特征值进行比较里面,获得差值最小即最佳匹配的字符作为最终识别结果。8位特征值的获取是在该分割出来的字符上进行行列扫描,统计每一个字符的行列上灰度累加值,选取3列5行上的值作为8位特征值。获得字符八位特征值具体如下:for(num=0;num7;num++)/*num是字符号,一般车牌为7个数字*/{v[num][0]=maxval(a,10);//a为记录每一列上字符象素点数数组,10为第10列,这里运用指针传递函数获得数组首地址v[num][1]=maxval(a,22);v[num][2]=maxval(a,30);v[num][3]=maxval(b,61);//b为记录每一行上字符象素点数数组,61为第61行,这读入字符图像与特征值库中的特征值逐一进行相关运算寻找相关度最大值所对应的模板输出此模板所对应的值--7里运用指针传递函数获得数组首地址v[num][4]=maxval(b,48);v[num][5]=maxval(b,34);v[num][6]=maxval(b,22);v[num][7]=maxval(b,9);}函数maxval()的定义如下:unsignedchar(int*m,intx){intmax;max=m[x];//假设改列为最大值,后面为比较,修改最大值if(m[x-2]max)max=m[x-2];if(m[x-1]max)max=m[x-1];if(m[x+1]max)max=m[x+1];if(m[x+2]max)max=m[x+2];return(max);}该函数的作用是为提高匹配精度,考虑到相关性,比较与该列相邻的左右两列,获得最大特征值的一列作为特征值,最后返回该值。1.5.2识别过程字符识别中模板匹配方法是实现离散输入模式分类的有效途径之一,其实质是度量输入与样本之间的某种相似性,取相似性最大者为输入模式所属类别,它根据字符的直观形象抽取特征,用相关匹配原理进行识别,即是在一定范围内取得图像的特征值,将该特征值与标准字符特征值一一匹配,取方差,在门限值内方差值最小者该字符即为匹配字符。如果threshouldλ则识别,否则拒识,这里λ为拒识域值。本次实验中直接取相关最大值为判定域值。具体过程如下:已经设置了标准八位字符库,按照0~9,A~Z,粤,黑,浙……的顺序排列好。放在int数组chV[50][8],这里假设一共有50个字符。匹配查找程序:unsignedintmatching(intnum)//字符匹配程序{intfalse,match=0,i,j,k=0,k1=36,sum[50],min;//match=0,假设用0开始匹配if(num==0){k=36;k1=50;match=36;}//若是第一个字符则为汉字,其在chV[50][8]中的位置是30开始,所以应该修改匹配开始值,即开始应为36,结束应为50;if(num==1){k=10;k1=36;match=10;}//若是第二个字符,则应该是字母,则匹配应该从A:10开始,结束点是Z:36。for(i=k;ik1;i++){sum[i]=0;for(j=0;j8;j++)--8{sum[i]=sum[i]+(chV[i][j]-v[num][j])*(chV[i][j]-v[num][j]);}//进行差方运算,记录与标准模板库中特征值的差值}min=sum[k];for(i=k+1;ik1;i++){if(sum[i]min){min=sum[i];match=i;}}//获得与标准模板库中差值最小的匹配号if(minthreshold)//若大于识别门限阀值,则设置标记号,拒绝识别。{match=255;}return(match);}最后将匹配的数字显示出来,其具体如下:unsignedcharn2asc(unsignedcharn)//获得字符的ASC2码值,这里的n即为前面模板的匹配返回值i;{unsignedchara;if(n==255)a=0;//超过门限识别值,值标记a=0;else{if(n10)a=n+48;//ASC2码值elsea=n+55;}return(a);}最后获得匹配字符的ASC2码值,即可打印显示出来。由于该软件缺少汉字识别的模板,故设置一个switch语句识别汉字,其具体如下:if(i==0)//必须为第一个字符即汉字{switch(mch[i])//条件是获得的汉字匹配号{case36://36的位置在标准模板库中为粤字{//printf(\nthecarnumberis:粤);SetCtrlVal(PANEL,PANEL_textdisplay,粤);//在CVI上显示出来}case37:……--9case38:……case39:…………//}}