1、对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进行定位。具体步骤如下:首先对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。再进行形态学滤波去除其它区域。I=imread(CAR/0.jpg); %读取图片I1=rgb2gray(I); %转化为灰度图像I2=edge(I1,robert,0.09,both %采用robert算子进行边缘检测se=1;1;1; %线型结构元素 I3=imerode(I2,se); %腐蚀图像se=strel(rectangle,25,25); %矩
2、形结构元素I4=imclose(I3,se); %图像聚类、填充图像I5=bwareaopen(I4,2000); %去除聚团灰度值小于2000的部分通过对比原始图片,我们可以发现形态滤波后的图像已经很接近正确的车牌位置了,因此后期处理将通过这张图来找出车牌位置。3.车牌定位观察经过预处理后得到的图像发现车牌位置有明显的矩形有明显的矩形图样,通过对矩形区域的定位即可获得具体的车牌位置。(1)车牌的行起始和终止位置的确定y,x,=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
3、,1)= Y1(i,1)+1; endendfigure();subplot(1,3,1);plot(0:y-1,Y1),title(行像素灰度值累计),xlabel(行值),ylabel(像素和 temp, MaxY=max(Y1);PY1=MaxY;while (Y1(PY1,1)=80)&(PY11) PY1=PY1-7;PY2=MaxY;while (Y1(PY2,1)(PY2y) PY2=PY2+7;(2)车牌的列起始位置和终止位置的确定%绘制列曲线图X1=zeros(1,x);for j=1: for i=PY1:PY2 X1(1,j)= X1(1,j)+1;subplot(1,3
4、,2);x-1,X1),title(列像素灰度值累计列值像数和PX1=1;while (X1(1,PX1)3)&(PX1x) PX1=PX1+7;PX2=x;while (X1(1,PX2)PX1) PX2=PX2-7;(3)最后拼合获取的车牌在图像的行列位置DW=I(PY1:PY2,PX1:PX2,:subplot(1,3,3);imshow(DW),title(车牌定位后图像4.字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。% 车牌图像转为灰度if isrgb(I) I1 = rgb2gray(I);e
5、lse I1 = I;% 二值化车牌图像I1 = im2bw(I1,graythresh(I1);%二值化图像I2 = bwareaopen(I1,16);%去除小于16像素的区块subplot(1,2,1);imshow(I2),title(二值化车牌图像% 分割字符按行积累量y,x=size(I2);I3=double(I2); for i=1: if(I3(i,j,1)=1)subplot(1,2,2);车牌列像素点累计% 分割字符Px0=1;Px1=1;7 while (X1(1,Px0)(Px0=3)&(Px1x)|(Px1-Px0)10) Px1=Px1+1; Z=I2(:,Px0
6、:Px1,: switch strcat(Z,num2str(i) case Z1 PIN0=Z;Z2 PIN1=Z;Z3 PIN2=Z;Z4 PIN3=Z;Z5 PIN4=Z;Z6 PIN5=Z; otherwise PIN6=Z; subplot(1,7,i); imshow(Z); Px0=Px1;分割成七块后的车牌图像5.建立字符模板数据库模板库的合理建造是字符识别准确的关键之一,所以在字符识别之前必须把模板库设置好。汽车牌照的字符一般有 7 个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种 警别等有特定含义的字符简称;紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它
7、的字符数有限, 十个阿拉伯数字09, 26 个大写英文字母 AZ 以及相关的车牌用汉字:京、沪、苏、台、港、澳、甲、乙、丙、使、领、学、试、境、消、边、警等,以及新式军牌中的汉字南、兰、广、北、沈、济、空、海等;车牌颜色:蓝、白、黑、黄等。所以建立字符模板库也极为方便。通过前面实验获取的几幅不同的车牌图片截取到的图片加上使用PhotoShop制作的部分图片如下:建立模板数据库时必须对这些图片进行统一处理,因为对前面处理分割后的车牌图像的测量得知单个字符的最佳宽高比是1:2,所以将这些图片归一化为5025大小;因为之后的字符识别考虑使用神经网络算法进行字符识别,所以再将上面归一化后的模板图像的样
8、本排列在一起构成125018的矩阵样本,程序设计如下:function inpt = Pretreatment(I)% 训练样本前期处理 I1=I;I1=imresize(I1,50 25);%将图片统一划为50*25大小I1=im2bw(I1,0.9);m,n=size(I1);inpt=zeros(1,m*n);% 将图像按列转换成一个行向量nm inpt(1,m*(j-1)+i)=I1(i,j);这是一个自定义函数的Pretreatment.m 文件,可以解决频繁写重复代码的问题,前面的图像预处理及车牌定位的代码可以写进Location.m文件中,通过代码DW = Location(I)
9、; 取得车牌定位后的图像;同时字符分割的代码亦可写进StringSplit.m 文件中,可以通过代码PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6=StringSplit(DW); 取得的字符分割后的图像。6.字符识别字符的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR算法以及基于人工神经网络的OCR算法。基于模板匹配的OCR的基本过程是:首先对待识别字符进行二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。用人工神经网络进行字符识别主要有两种方法:一种方法是先对待识别字符进行特征提取,然后用所获得的
10、特征来训练神经网络分类器。识别效果与字符特征的提取有关,而字符特征提取往往比较耗时。因此,字符特征的提取就成为研究的关键。另一种方法则充分利用神经网络的特点,直接把待处理图像输入网络,由网络自动实现特征提取直至识别。本文主要研究基于人工神经网络的方法来识别车牌字符。设计代码如下:close all;clear all;% 归一化训练样本I0=pretreatment(imread(BP/0.jpg);I1=pretreatment(imread(BP/1.jpgI2=pretreatment(imread(BP/2.jpgI3=pretreatment(imread(BP/3.jpgI4=pr
11、etreatment(imread(BP/4.jpgI5=pretreatment(imread(BP/5.jpgI6=pretreatment(imread(BP/6.jpgI7=pretreatment(imread(BP/7.jpgI8=pretreatment(imread(BP/8.jpgI9=pretreatment(imread(BP/9.jpgI10=pretreatment(imread(BP/A.jpgI11=pretreatment(imread(BP/B.jpgI12=pretreatment(imread(BP/C.jpgI13=pretreatment(imread
12、(BP/D.jpgI14=pretreatment(imread(BP/G.jpgI15=pretreatment(imread(BP/K.jpgI16=pretreatment(imread(BP/L.jpgI17=pretreatment(imread(BP/M.jpgP=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,trainrpnet.inputWeights1,1.ini
13、tFcn =randnr;net.layerWeights2,1.initFcn =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); %训练样本% 测试DW=Location(I);%车牌定位PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6=StringSplit(DW);%字符分割及处理% 测试字符,得到识别数值PIN0=pretrea
14、tment(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,PIN6for i=2: T0= sim(net ,P0(:,i); T1 = compet (T0) ; d = find(T1 = 1) - 1; if (d=10) str=A elseif (d=11)B else
15、if (d=12)C elseif (d=13)D elseif (d=14)G elseif (d=15)K elseif (d=16)L elseif (d=17)M elseif (d=0)0 elseif (d=1)1 elseif (d=2)2 elseif (d=3)3 elseif (d=4)4 elseif (d=5)5 elseif (d=6)6 elseif (d=7)7 elseif (d=8)8 elseif (d=9)9 else str=num2str(d); switch i case 2 str2=str; case 3 str3=str; case 4 str
16、4=str; case 5 str5=str; case 6 str6=str; str7=str;% 识别出的结果以标题形式显示在图上S=strcat(粤,str2,str3,str4,str5,str6,str7);imshow(DW),title(S);第一次训练后识别出的车牌号码:发现第二个字符识别错误,在进行第二次识别:可以看出完成了准确识别车牌的目的。三、总结在汽车车牌识别的整个过程中,查找了很多资料,综合了各方面的信息。车牌实现的每一步都有许多的方法,各种方法都有其优劣,但是对于具体的图像处理,并不是每一种理论在实践中都可以实现,即使实现了也很难说哪一种方法最合适,还得在具体的实
17、验中比较选择。第二点在程序调试的过程中要耐心的检查每一个错误。测试结果表明,本设计有以下几条优点:(1)充分利用MATLAB中已有的函数库,使整个程序设计简单易行;(2)使用了MATLAB的自定义函数功能,使程序设计更简洁。但也发现了更多的缺点:(1)程序的局限性:只能针对图像中一辆汽车的牌照进行识别;对于图像内的元素较复杂的照片可能无法进行识别。(2)神经网络的训练要花费30秒以上的训练时间才能进行下一步的字符识别,效率太慢。(3)程序可能会受软件环境的影响识别准确性,据测试,MATLAB的2010a 版比2009a版识别效率高,准确性也高点。车牌识别程序设计能够得以顺利完成。在很大程度上得
18、利于MATLAB这套软件, MATLAB功能强大,它包括数值计算和符号计算,并且计算结果和编程可视化。这为编程调试创造了一个便利的环境。作为图像处理最适用的工具之一,其突出的特点是它包含一个图像处理工具包,这个工具包由一系列支持图像处理操作的函数组成。所支持的图像处理操作有:图像的几何操作、邻域和区域操作、图像变换、图像恢复与增强、线性滤波和滤波器设计、变换(DCT 变换等) 、图像分析和统计、二值图像操作等。在图像的显示方面,MATLAB 提供了图像文件读入函数imread ( ) ,用来读取如: bmp 、tif 、jpg、pcx、tiff 、jpeg、hdf 、xwd 等格式图像文件;图像写出函数imwrite () ,还有图像显示函数image ( ) 、imshow() 等等。这些,都使编程效率大为提高。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1