车牌识别.docx
- 文档编号:16533711
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:20
- 大小:495.56KB
车牌识别.docx
《车牌识别.docx》由会员分享,可在线阅读,更多相关《车牌识别.docx(20页珍藏版)》请在冰点文库上搜索。
车牌识别
车牌识别系统
1概述
随着我国公路交通事业的发展,车辆的数量正在迅速增长,在给出行提供方便的同时,车辆管理上存在的问题日益突出,人工管理的方式已经不能满足实际的需要。
微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。
作为信息来源的自动检测、图像识别技术越来越受到人们的重视。
近年来计算机的飞速发展和数字图像技术的日趋成熟,为传统的交通管理带来巨大转变,先进的计算机处理技术,不但可以将人力从繁琐的人工观察、监测中解放出来,而且能够大大提高其精确度,汽车牌照自动识别系统就是在这样的背景与目的下进行开发的。
汽车牌照等相关信息的自动采集和管理对于交通车辆管理、园区车辆管理、停车场管理、交警稽查等方面有着十分重要的意义,成为信息处理技术的一项重要研究课题。
车牌系统是计算机视觉和模式识别技术在智能交通领域的重要应用课题之一。
车牌识别系统是一特定目标位对象的专用计算机系统,该系统能从一幅图像中自动提取车牌图像、自动分割自符,进而对分割自符的图像进行图像识别。
系统一般由硬件和软件构成。
硬件设备一般由车体感应设备、辅助光源、摄像机、图像采集卡和计算机。
软件部分是系统的核心,主要实现车牌自符的识别功能。
车牌识别学科主要有模式识别、人工智能、图像处理、计算机视觉和信号处理等。
这些领域的许多技术都可以应用到车牌识别系统中,车牌识别技术的研究也必然推动这些相关学科的发展。
车牌识别的关键技术有:
车牌定位、字符切割和字符识别等。
车牌定位是要完成从图像中确定车牌位置并提取车牌区域图像,目前常用的方法有:
基于直线检测的方法、机遇与域值化的方法、基于灰度边缘检测方法、基于彩色图像的车牌分割方法、神经网络法和基于矢量量化的牌照的定位的方法等。
字符切割时完成车牌区域图像的切分处理从而得到所需要的单个字符图象。
目前常用的方法有:
基于投影的方法和基于连通字符的提取等方法。
字符识别是利用字符识别的原理识别提取出的字符图像,目前常用的方法有:
基于模板匹配的方法、基于特征的方法和神经网络法等。
2原理
一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部分,一个车牌识别系统的基本结构如图2.1所示:
图2.1车牌识别系统基本结构框图
一:
原始图像:
由停车场固定彩色摄像机、数码相机或其他扫描装置拍摄到的图像。
二:
图像预处理:
对动态采集到的图像进行滤波,边界增强等处理以克服图像处理。
三:
车牌位置提取:
通过运算得到图像的边缘,再计算边缘图像的投影面积,寻找谷峰点以大概确定车牌的位置,再计算连通域的宽高比,剔除不在阈值范围内的连通域,最后便得到了车牌区域。
四:
字符分割:
利用投影检测的字符定位分割方法得到单个的字符。
五:
字符识别:
利用模板匹配的方法与数据库中的字符进行匹配从而确认出字符。
六:
输出结果:
得到最后的汽车牌照,包括汉字、字母和数字。
车牌号图像识别要进行牌照号码、颜色识别。
为了进行牌照识别,需要以下几个基本的步骤:
a.牌照定位,定位图片中的牌照位置;
b.牌照字符分割,把牌照中的字符分割出来;
c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。
牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。
(1)牌照定位:
自然环境下,由于汽车图像背景复杂、光照不均匀等原因,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。
一般采用的方案是首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。
通过以上步骤,牌照一般能够被定位。
(2)牌照字符分割:
在完成牌照区域的定位后,还需要将牌照区域分割成单个字符,然后进行字符识别,最后输出结果。
字符分割一般采用垂直投影法。
垂直投影法的原理是由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。
所以利用垂直投影法对复杂环境下的汽车图像的字符分割有较好的效果。
(3)牌照字符识别:
字符识别方法目前主要得算法有两种即基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
基于人工神经元网络的算法有两种:
一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。
实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。
牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。
这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。
为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。
3数据处理
图像读取及车牌区域提取主要有:
图像灰度图转化、图像边缘检测、灰度图腐蚀、图像的平滑处理以及车牌区域的边界值计算。
其程序流程图如下:
输入车牌图像
灰度校正
平滑处理
提取边缘
3.1预处理及边缘提取框图
目前比较常用的图像格式有*.BMP、*.JPG、*.GIF、*.PCX、*.TIFF等,本课题采集到的图片是*.JPG的格式。
因为使用*.JPG图像时有一个软件开发联合会组织制定、有损压缩格式,能够将图像压缩在很小的储存空间,而且广泛支持Internet标准,是面前使用最广的图片保存和传输格式,大多数摄像设备都以*.JPG格式保存。
利用图像工具箱的
Car_Image_RGB=imread(‘Image_Name’);
即可将图像读取出来,这样读取得到的是RGB图像,RGB图像分别用红、绿、蓝三个色度值为一组代表每个像素的颜色,因此Car_Image_RGB是一个错误!
未找到引用源。
的数组,m、n表示图像像素的行、列数。
3.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),由于车牌的底色不同,所以从RGB图像直接进行车牌区域提取存在很大困难,但不管哪种底色的车牌,其底色与上面的字符颜色的对比度大,将RGB图像转化成灰度图像时,车牌底色跟字符的灰度值会相差很大。
例如蓝色(255,0,0)与白色(255,255,255)在R通道中并无区分,而在G、R通道或是灰度图象中数值相差很大。
同理对白底黑字的牌照可用R通道,绿底白字的牌照可以用G通道就可以明显呈现出牌照区域的位置,便于后续处理。
原图、灰度对于将彩色图象转换成灰度图象时,图象灰度值H可由下面的公式计算:
(3.1)
(3.2)
(3.1)式使用了权值加重法,(3.2)式使用均值法,使用权值法的好处是可以突出某个通道,Matlab内的RGB转灰度图函数rgb2gray()就是使用的(3.1)式权值比例公式,这样就可以利用边缘检测方法,识别出临近区域灰度值相差大的分界区。
通过程序运行其效果图见图3.2和图3.3:
3.2原始图像
3.3灰度化后的图像
3.1.2图像的边缘检测
在Matlab中利用函数edge()实现边缘检测,具体的用法如下所示:
Car_Image_Bin=edge(Car_Image_Gray,'robert',0.15,'both');
在edge()函数中有Sobel算子,Prewitt算子,Roberts算子,Log算子,Canny算子及Robert算子,几种算法相比之下,Roberts算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。
检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。
因此本课题使用了Robert算子。
使用边缘检测,腐蚀效果如图3.4所示:
图3.4边缘效果图
从边缘效果图可以看出,经过处理以后车牌的轮廓已经非常明显了,车牌区域及汽车标志的边缘呈现白色条纹,基本上达到了边缘检测的效果。
但是,在车牌附近的其他区域也由于各种干扰的影响,也存在一些白色区域。
所以要对图像做进一步的处理,用灰度图腐蚀来消除多余的边界点。
3.1.3灰度图腐蚀
所谓腐蚀即一种消除边界点,使边界向内部收缩的过程。
利用它可以消除小而且无意义的物体。
腐蚀的规则是输出图像的最小值是输入图像领域中的最小值,在一个二值图像中,只要有一个像素值为0,则相应的输出像素值为0。
假设B对X腐蚀所产生的二值图像E是满足以下条件的点(x,y)的集合:
如果B的原点平移到点(x,y),那么B将完全包含于X中。
本系统使用imerode()函数,
Car_Image_Erode=imerode(Car_Image_Bin,Se);
其中结构元素Se又被形象成为刷子,用于测试输入图像,一般比待处理图像小很多。
结构元素的大小形状任意,一般是二维的。
二维结构元素为数值0和1组成的矩阵,结构元素中数值为1的点决定结构元素的领域像素在进行腐蚀操作时是否需要参加运算。
结构元素太大,会造成腐蚀过度,造成信息丢失,太小起不了预期的效果,这里使用矩阵的线性结构元素,Se=[1:
1:
1]。
腐蚀后如图:
3.5腐蚀效果图
3.1.3车牌定位
观察经过预处理后得到的图像,车牌位置已经具有明显的矩形图样,通过对矩形区域的定位即可获得具体的车牌位置。
其过程是首先将二值图像中所有为白色的点的坐标放入数组location_of_1中,对这些坐标进行计算,寻找x坐标与y坐标之和最大的点a与最小的点b,最大点a即为车牌的左上角,最小点b为车牌的右下角,通过这两个坐标就可以将车牌分割出来了。
如图所示:
图3.6定位剪切后的图
4程序
function[d]=main(jpg)
I=imread('car.jpg');
figure
(1),imshow(I);title('原图');
I1=rgb2gray(I);
figure
(2),subplot(1,2,1),imshow(I1);title('灰度图');
%figure
(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');
I2=edge(I1,'roberts',0.08,'both');
figure(3),imshow(I2);title('robert算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);
figure(4),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[40,40]);%生成一个矩阵
I4=imclose(I3,se);%闭运算
figure(5),imshow(I4);title('填充图像');
I5=bwareaopen(I4,2000);
figure(6),imshow(I5);title('形态滤波');
[y,x,z]=size(I5);
myI=double(I5);
%begin横向扫描
tic
white_y=zeros(y,1);
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
%如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色
%则Blue_y的相应行的元素white_y(i,1)值加1
white_y(i,1)=white_y(i,1)+1;%蓝色像素点统计
end
end
end
[tempMaxY]=max(white_y);%temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置)
PY1=MaxY;
while((white_y(PY1,1)>=120)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((white_y(PY2,1)>=40)&&(PY2 PY2=PY2+1; end IY=I(PY1: PY2,: : ); %IY为原始图像I中截取的纵坐标在PY1: PY2之间的部分 %end横向扫描 %begin纵向扫描 white_x=zeros(1,x);%进一步确定x方向的车牌区域 forj=1: x fori=PY1: PY2 if(myI(i,j,1)==1) white_x(1,j)=white_x(1,j)+1; end end end PX1=1; while((white_x(1,PX1)<3)&&(PX1 PX1=PX1+1; end PX2=x; while((white_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end %end纵向扫描 PX1=PX1-2;%对车牌区域的校正 PX2=PX2+2; dw=I(PY1: PY2,: : ); t=toc; %figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域'); figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'dw.jpg'); [filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像'); jpg=strcat(filepath,filename); a=imread('dw.jpg'); b=rgb2gray(a); imwrite(b,'1.车牌灰度图像.jpg'); figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像') g_max=double(max(max(b))); g_min=double(min(min(b))); T=round(g_max-(g_max-g_min)/3);%T为二值化的阈值 [m,n]=size(b); d=(double(b)>=T);%d: 二值图像 imwrite(d,'2.车牌二值图像.jpg'); figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像') figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前') %滤波 h=fspecial('average',3);%均值绿波器 d=im2bw(round(filter2(h,d)));%BW=im2bw(I,level)将灰度图像I转换为二进制图像。 输出图像%BW将输入图像中亮度值大于level的像素替换为值1(白色),其他替换为值0(黑色 imwrite(d,'4.均值滤波后.jpg');%matlab里函数bwarea计算目标物的面积 figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后') %某些图像进行操作 %膨胀或腐蚀 %se=strel('square',3);%使用一个3X3的正方形结果元素对象对创建的图像膨胀 %'line'/'diamond'/'ball'... se=eye (2);%eye(n)returnsthen-by-nidentitymatrix单位矩阵 [m,n]=size(d); ifbwarea(d)/m/n>=0.365%计算面积 d=imerode(d,se);%imerode实现图像腐蚀d为待处理图像,se是结构元素对象 elseifbwarea(d)/m/n<=0.235 d=imdilate(d,se);%imdilate图像膨胀 end imwrite(d,'5.膨胀或腐蚀处理后.jpg'); figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后') %寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(d); %figure(100),subplot(3,2,4),imshow(d),title('qiege') [m,n]=size(d); %figure(9),subplot(2,1,1),imshow(d),title('n') k1=1;k2=1;s=sum(d);j=1; whilej~=n whiles(j)==0 j=j+1; end k1=j; whiles(j)~=0&&j<=n-1 j=j+1; end k2=j-1; ifk2-k1>=round(n/6.5) [val,num]=min(sum(d(: [k1+5: k2-5]))); d(: k1+num+5)=0;%分割 end end %figure(10),subplot(2,1,1),imshow(d),title('n1'); %再切割 d=qiege(d); %切割出7个字符 y1=10;y2=0.25;flag=0;word1=[]; whileflag==0 [m,n]=size(d); left=1;wide=0; whilesum(d(: wide+1))~=0 wide=wide+1; end ifwide d(: [1: wide])=0; d=qiege(d); else temp=qiege(imcrop(d,[11widem])); [m,n]=size(temp); all=sum(sum(temp)); two_thirds=sum(sum(temp([round(m/3): 2*round(m/3)],: ))); iftwo_thirds/all>y2 flag=1;word1=temp;%WORD1 end d(: [1: wide])=0;d=qiege(d); end end %分割出第二个字符 [word2,d]=getword(d); %分割出第三个字符 [word3,d]=getword(d); %分割出第四个字符 [word4,d]=getword(d); %分割出第五个字符 [word5,d]=getword(d); %分割出第六个字符 [word6,d]=getword(d); %分割出第七个字符 [word7,d]=getword(d); figure(9),imshow(word1),title('1'); figure(10),imshow(word2),title('2'); figure(11),imshow(word3),title('3'); figure(12),imshow(word4),title('4'); figure(13),imshow(word5),title('5'); figure(14),imshow(word6),title('6'); figure(15),imshow(word7),title('7'); [m,n]=size(word1); %商用系统程序中归一化大小为40*20,此处演示 word1=imresize(word1,[4020]); word2=imresize(word2,[4020]); word3=imresize(word3,[4020]); word4=imresize(word4,[4020]); word5=imresize(word5,[4020]); word6=imresize(word6,[4020]); word7=imresize(word7,[4020]); figure(16), subplot(3,7,8),imshow(word1),title('1'); subplot(3,7,9),imshow(word2),title('2'); subplot(3,7,10),imshow(word3),title('3'); subplot(3,7,11),imshow(word4),title('4'); subplot(3,7,12),imshow(word5),title('5'); subplot(3,7,13),imshow(word6),title('6'); subplot(3,7,14),imshow(word7),title('7'); imwrite(word1,'1.jpg'); imwrite(word2,'2.jpg'); imwrite(word3,'3.jpg'); imwrite(word4,'4.jpg'); imwrite(word5,'5.jpg'); imwrite(word6,'6.jpg'); imwrite(word7,'7.jpg'); liccode=char(['0': '9''A': 'Z''苏豫陕鲁']);%建立自动识别字符代码表 SubBw2=zeros(40,20); l=1; forI=1: 7 ii=int2str(I);%将整数转换为字符串 t=imread([ii,'.jpg']); SegBw2=imresize(t,[4020],'nearest');%实用最近邻插值法放大图像 ifl==1%第一位汉字识别 kmin=37; kmax=40; elseifl==2%第二位A~Z字母识别 kmin=11; kmax=36; elsel>=3%第三位以后是字母或数字识别 kmin=1; kmax=36; end fork2=kmin: kmax fname=strcat('字符模板\',liccode(k2),'.jpg'); SamBw2=imread(fname); fori=1: 40 forj=1: 20 SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j); end end %以上相当于两幅图相减得到第三幅图 Dmax=0; fork1=1: 40 forl1=1: 20 if(SubBw2(k1,l1)>0|SubBw2(k1,l1)<0) Dmax=Dmax+1; end end end Error(k2)=Dmax; end Error1=Error(kmin: kmax); MinError=min(Error1); find
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 车牌 识别