数字图像处理在车牌识别中的应用.docx
- 文档编号:5061439
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:299.60KB
数字图像处理在车牌识别中的应用.docx
《数字图像处理在车牌识别中的应用.docx》由会员分享,可在线阅读,更多相关《数字图像处理在车牌识别中的应用.docx(21页珍藏版)》请在冰豆网上搜索。
数字图像处理在车牌识别中的应用
图像处理在智能交通中的应用
——基于MATLAB的车牌识别
摘要:
针对交通管理系统的信息化、智能化发展趋势,通过对车牌特征和定位技术的探索,提出了汽车牌照字符识别系统。
本文采用多种滤波技术对车牌进行滤波处理,robert边缘检测算子进行边缘检测,运用区域分割法实现了车牌字符的分割,最后简述了字符识别原理和模板匹配在字符识别中的应用方法。
由实验结果可知,系统能准确实现车牌的定位、分割和识别,具有良好的性能。
关键词:
车牌识别,MATLAB,数字图像处理,模式识别,智能
第一部分引言
随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点。
针对此问题,人们运用新的科学技术,相继研制开发出了各种交通道路监视、管理系统。
这些系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控、管理和指挥交通的目的。
因此,智能交通系统ITS(intelligenttrafficsystem)已成为世界交通领域研究的重要课题。
车牌识别系统LPR(1icenseplaterecognition)作为智能交通系统的一个重要组成部分,已在高速公路、城市交通和停车场等项目的管理中占有无可取代的重要地位。
它在不影响汽车状态的情况下,由计算机自动完成车牌的识别,从而降低交通管理工作的复杂度。
本文应用图像处理技术、车牌定位技术、车牌校正技术、车牌分割技术、字符特征提取方法和模版匹配识别技术等解决了车辆牌照识别问题,并提出了车牌识别系统的设计方案。
第二部分车牌识别的原理和方法
通常,车牌识别过程分为图像预处理、车牌定位、车牌校正、车牌分割和车牌识别五个部分。
①图像预处理:
在整个车牌识别系统中,由于采集进来的图像为真彩图,再加上实际采集环境的影响以及采集硬件等原因,图像质量并不高,其背景和噪声会影响字符的正确分割和识别,所以在进行车牌分割和识别处理之前,需要先对车牌图像进行图像预处理操作。
②车牌定位:
首先对车牌的二值图片进行形态学滤波,使车牌区域形成一个连通区域,然后根据车牌的先验知识对所得到的连通区域进行筛选,获取车牌区域的具体位置,完成从图片中提取车牌的任务。
③车牌校正:
由于捕捉图片的摄像头与车身的角度问题,得到的车牌图片不是水平的。
为了顺利进行后续的分割和识别,必须对车牌进行角度校正。
在此,使用了Radon变换来对车牌进行校正。
④车牌分割:
首先对车牌进行水平投影,去除水平边框;再对车牌进行垂直投影。
通过对车牌进行投影分析可知,与最大值峰中心对应的为车牌中第二个字符和第三个字符的间隔,与第二大峰中心距离对应的即为车牌字符的宽度,并以此为依据对车牌进行分割。
⑤字符识别:
本文采用模板匹配方法来对车牌进行识别。
识别过程中,首先建立标准字库,再将分割所得到的字符进行归一化,将归一化处理后的字符与标准字库里的字符逐一比较,最后把误差最小的字符作为结果显示出来。
本文采用成熟的数字图像处理技术和Matlab仿真工具[3],使得文中所提出的算法得以实现。
如图1所示为采用Matlab实现车牌字符分割技术的程序流程。
第三部分图像预处理
3.1灰度化
数字图像分为彩色图像和灰度图像。
在RGB模型中,如果R=G=B,则表示一种灰度颜色,其中R=G=B的值叫做灰度值[4],通常用g来表示。
将彩色图像转换为灰度图像的过程叫做灰度化处理。
由于彩色图像的存储空间较大,因此,在对图像进行识别等处理过程中,需要将彩色图像转换为灰度图像,以加快后续工作的处理速度。
图像二值化公式:
g(x,y)=
其中,f(x,y)为原始灰度图像,g(x,y)为转化后图像,T为阈值。
在Matlab中,实现灰度化的程序语句如下:
I=imread(‘chepai.jpg’);//读入原始图像
figure,imshow(I);title(‘原始图像’);
图3.1车牌原图
3.2图像二值化
灰度图像有256个灰度级的单色图像,多级别图像能够呈现出较为丰富的明暗度,但对于目标搜索来说,总是希望尽可能地减少背景像素的干扰而保存或增强目标区的色素度。
图像的二值化可以把像素灰度级分成黑与白两级,即把原灰度图像转化为二值图像。
在Matlab语句中输入:
I1=rgb2gray(I);//灰度化
figure,imshow(I1);title(‘灰度图像’);
figure
(2),subplot(1,2,1),imshow(I1);title('灰度图');
figure
(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');
图3.2(a)灰度图与灰度直方图
图3.2(b)车牌二值图像
3.4robert算子边缘检测
边缘是指图像局部亮度变化最显著的部分[5]。
边缘主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础,图像分析和理解的第一步常常是边缘检测。
物体的边缘是图像最基本的特征,边缘是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。
边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间,因此它是图像分割所依赖的重要特征之一。
robert边缘算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:
g(x,y)=
其中,f(x,y)、f(x+1,y)、f(x,y+1)、f(x+1,y+1)分别为4领域的坐标。
robert算子是2
2算子模板,如下图示:
1
0
0
-1
0
1
-1
0
为得到较好的边缘检测性能,采用robert算子对图像进行边缘提取。
Roberts边缘检测是一种比较新的边缘检测算子,它利用高斯函数的一阶微分,能在噪声抑制和边缘检测之间取得很好的平衡。
与其它边缘算子相比,robert边缘算子边缘定位准,但是对噪声敏感。
适用于边缘明显且噪声较少的图像分割。
robert边缘检测算子是一种利用局部差分算子寻找边缘的算子,robert算子图像处理后结果边缘不是很平滑。
经分析,由于robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
图3.4robert算子边缘检测
3.5形态学滤波
数学形态是一种非线性滤波方法,可以用于抑制噪声,进行特征提取、边缘检测、图像分割等图像处理操作。
形态学滤波有四种基础操作:
腐蚀、膨胀、开操作和闭操作。
腐蚀的运算符为
,X用S来腐蚀写作X
S,其定义为X
S={x|S(x)
X}
上式表明X用S腐蚀的结果是所有x的集合,其中B平移x后仍在A中。
换句话说,用S来腐蚀X得到的集合是S完全包括X中时S的原点位置的集合。
车牌腐蚀图像见图3.5
图3.5腐蚀后图像
3.6对图像进行滤波后的结果
第四部分车牌定位
汽车牌照的定位是指从摄人的汽车图像中找到汽车牌照所在的位置,并把含有车牌的子区域提取出来。
从编程实现的角度来看,就是针对某汽车图像,通过运行某个定位算法,确定车牌子区域的对角坐标。
显然在汽车牌照识别系统中,车牌定位准确与否直接影响字符识别的准确率。
通过查找初始行top:
从上向下扫描,如果该行所有像素值为0(背景),继续扫描,直到像素值为1(字符)的行(初始行),则退出扫描循环。
查找最后一行bottom,初始列left,最后一列right,思路相似。
4.1车牌分割
在定位出车牌区域后,为了对车牌进行识别,必须把车牌字符进行切分,然后送人字符识别系统。
字符分割的任务就是把多行或多字符图像中的每个字符从整个图像中分割出来,使其成为单个字符。
车牌分割的难点在于噪声、粘连以及断裂对字符的影响。
本文所采用的方法是区域分割法。
其原理是利用同一区域内
灰度值的相似性,将相似区域合并,不同区域分开。
如下图所示:
综上,对车牌图像进行第一步进行定位处理,第二步进行分割处理。
如图4.1所示。
图4.1车牌定位和分割后图像
分割后的图像由于字符大小不统一,需要归一化处理。
本文中采用40*20大小模板来将原来不相同的字符统一到同一尺寸,达到标准化图像。
4.3车牌识别
字符识别是对车牌上的汉字、字母和数字进行确认的过程,是系统的核心。
本文采用的是基于模板匹配的字符识别方法。
4.4构建标准字库
本文采用的是基于模版匹在构建标准字库的过程中,用绘图工具绘制了A—Z、0-9和车牌地区名,并且以32行x16列的大小黑体字保存。
样本库中的编码规则如下。
①数字0-9,文件名为0.jpg-Sam9.jpg;
②字母A-Z,文件名为A.jpg-Z.jpg;
③7个省别汉字,文件名为京.jpg,辽.jpg,鲁.jpg,陕.jpg,苏.jpg,豫.jpg,浙.jpg。
4.5识别过程
确定中心距离的方法是:
将模版库中的字符图像矩阵与待识别字符图像矩阵作减法,求最小误差(即其相似度),将最相似的模板库中的字符图像矩阵的代码作为识别结果并显示出来。
实验结果表明,使用模版匹配方法可以成功地将车牌识别出来。
第五部分结束语
本文针对智能交通系统中的车牌识别问题,采用Matlab设计开发了车牌识别系统。
通过综合采用图像处理技术,实现了车牌的定位、倾斜校正、滤波、字符分割和识别功能,实验结果也证明了本文所提出的车牌识别方法是准确、可行的。
附录:
源程序如下:
function[d]=main(jpg)
closeall
clc
%I=imread('car1.JPG');
I=imread('chepai.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,'robert',0.15,'both');
figure(3),imshow(I2);title('robert算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);
figure(4),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[25,25]);
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);
tic
Blue_y=zeros(y,1);
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
Blue_y(i,1)=Blue_y(i,1)+1;%蓝色像素点统计
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2 PY2=PY2+1; end IY=I(PY1: PY2,: : ); %%%%%%X方向%%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 forj=1: x fori=PY1: PY2 if(myI(i,j,1)==1) Blue_x(1,j)=Blue_x(1,j)+1; end end end PX1=1; while((Blue_x(1,PX1)<3)&&(PX1 PX1=PX1+1; end PX2=x; while((Blue_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end PX1=PX1+50;%对车牌区域的校正 PX2=PX2-50; PY1=PY1+45; PY2=PY2-45; dw=I(PY1: PY2-8,PX1: PX2,: ); 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)/2);%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))); imwrite(d,'4.均值滤波后.jpg'); 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); elseifbwarea(d)/m/n<=0.235 d=imdilate(d,se); end imwrite(d,'5.膨胀或腐蚀处理后.jpg'); figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后') %寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(d); [m,n]=size(d); figure,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 %再切割 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); subplot(5,7,1),imshow(word1),title('1'); subplot(5,7,2),imshow(word2),title('2'); subplot(5,7,3),imshow(word3),title('3'); subplot(5,7,4),imshow(word4),title('4'); subplot(5,7,5),imshow(word5),title('5'); subplot(5,7,6),imshow(word6),title('6'); subplot(5,7,7),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]); subplot(5,7,15),imshow(word1),title('1'); subplot(5,7,16),imshow(word2),title('2'); subplot(5,7,17),imshow(word3),title('3'); subplot(5,7,18),imshow(word4),title('4'); subplot(5,7,19),imshow(word5),title('5'); subplot(5,7,20),imshow(word6),title('6'); subplot(5,7,21),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); findc=find(Error1==MinError); Code(l*2-1)=liccode(findc (1)+kmin-1); Code(l*2)=''; l=l+1; end figure(10),subplot(5,7,1: 7),imshow(dw),title('第一步车牌定位'), xlabel({'','第二步车牌分割'}); subplot(6,7,15),imshow(word1); subplot(6,7,16),imshow(word2); subplot(6,7,17),imshow(word3); subplot(6,7,18),imshow(word4); subplot(6,7,19),imshow(word5); subplot(6,7,20),imshow(word6); subplot(6,7,21),imshow(word7); subplot(6,7,22: 42),imshow('53.jpg'); xlabel(['第三步识别结果为: ',Code],'Color','b'); function[word,result]=getword(d) word=[];flag=0;y1=8;y2=0.5; whileflag==0 [m,n]=size(d); wide=0; whilesum(d(: wide+1))~=0&&wide<=n-2 wide=wide+1; end temp=qiege(imcrop(d,[11widem])); [m1,n1]=size(temp); ifwide
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 车牌 识别 中的 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)