汽车车牌的号码识别报告书BYWenny.docx
- 文档编号:4063805
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:23
- 大小:988.68KB
汽车车牌的号码识别报告书BYWenny.docx
《汽车车牌的号码识别报告书BYWenny.docx》由会员分享,可在线阅读,更多相关《汽车车牌的号码识别报告书BYWenny.docx(23页珍藏版)》请在冰点文库上搜索。
汽车车牌的号码识别报告书BYWenny
目录
1技术要求1
2基本原理1
2.1彩色图像、灰度图像与图像二值化1
2.2车牌格式说明与车牌识别中的难点2
3建立模型描述3
3.1汽车车牌的号码识别程序流程图3
3.2图像灰度化3
3.3灰度拉伸4
3.4图像二值化与梯度锐化5
3.5汽车牌照区域定位6
3.6汽车牌照区域截取7
3.7牌照字符分割7
4源程序代码8
5调试过程及结论16
6心得体会19
7参考文献19
汽车车牌的号码识别
1技术要求
拍摄任意汽车车牌,能实现其中数字的提取并识别。
编程可用MATLAB或VC++。
要求用相机拍摄获取彩色汽车车牌的图片,对所拍摄车牌号图片进行相应处理(如,去噪、去除背景提取目标、边缘分割、轮廓提取等),最终获得车牌中的字母和数字。
2基本原理
智能交通是当前交通管理发展的主要方向,汽车牌照自动识别技术则是智能交通系统的核心组成部分,在城市道路、高速公路等项目的管理运营中占重要地位。
2.1彩色图像、灰度图像与图像二值化
数码照相机是图像输入设备的一种,能够进行景物拍摄并以数字格式存放拍摄的图像。
它的核心部件是CCD图像传感器,主流机型分辨率已在600万像素以上。
数码照相机的感光器件CCD可以对亮度分级但不能识别颜色,为此,数码照相机使用了红、绿、蓝三个彩色滤镜。
当光线从滤镜中穿过时就可以得到每种色光的反应值,再通过软件对得到的数据处理,从而确定每一像素点的颜色,获得RGB彩色图像。
通常情况下,获得的RGB彩色图像被传送到相机内部的一块芯片上,该芯片负责转换图像为存储格式(通常为JPEG格式),最后将该格式的图像保存在存储卡上。
模拟图像经采样后所得像素值即灰度值仍为连续量,将各像素灰度值从模拟量到离散量的转换称为图像灰度的量化。
一般量化后的像素值用一个字节8bit来表示,如此将黑-灰-白的连续变化的灰度值量化为0~255共256级灰度值。
灰度值范围0~255表示亮度从暗到明。
即,灰度图像只有灰度颜色而没有彩色,为灰度色域的单色图像。
黑白二值图像又称线画稿,只有黑白两种颜色,用一位颜色模式表示图像。
若样点颜色为黑则相应像素位元置为0,否则置1。
2.2车牌格式说明与车牌识别中的难点
我国标准车牌照是由汉字、英文字母和阿拉伯数字组成的,多为蓝底白字。
如图1所示,为自选号牌车牌示例。
图1.自选号牌车牌示例
在汽车车牌识别的过程中,主要存在以下难点:
1)获取的车牌图像质量不高。
车牌图像往往含有大量复杂的背景信息,遮盖了有用信息。
很多时候受到照明条件、天气条件、及运动失真的影响,会出现图像模糊、清晰度不高、目标区域过小、色彩失真等现象,影响了车牌的定位。
2)车牌悬挂位置不唯一。
在汽车的各个位置都可能出现车牌,而且不能保证车牌的水平悬挂,甚至有的车牌出现了扭曲。
3)我国标准车牌照是由汉字、英文字母和阿拉伯数字组成的,汉字的识别与字母和数字的识别有很大的不同,增加了识别的难度。
4)由于环境、道路或人为因素造成汽车牌照污染严重,这种情况下国外发达国家不允许上路,而在我国仍可上路行驶。
使得车牌的对比度降低,特征不是很明显,即使在定位准确的情况下,字符的识别也会受到很大影响。
3建立模型描述
3.1汽车车牌的号码识别程序流程图
图2.汽车车牌号码识别程序流程图
3.2图像灰度化
彩色图像分为R、G、B三个分量,分别显示出红、绿、蓝等各种颜色,灰度化就是使彩色的R、G、B分量相等的过程。
灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素值最小为0,是黑色)。
图像灰度化的算法主要有以下3种:
1)最大值法:
使转化后R、G、B的值等于转化前3个值中最大的一个,即:
这种方法转换的灰度图亮度很高。
2)平均值法:
使转化后R、G、B的值为转化前R、G、B的平均值
这种方法产生的灰度图像比较柔和。
3)加权平均值法:
按照一定的权值,对R、G、B的值加权平均,即:
其中,
、
、
分别为R、G、B的权值。
、
、
取不同的值,将形成不同的灰度图像。
由于人眼对绿色最为敏感,红色次之,对蓝色的敏感性最低,因此使
将得到较易识别的灰度图像。
一般情况下,当
、
、
时,得到的灰度图像效果最好。
在本次程序编排中,可使用MATLAB自带函数rgb2gray()实现加权平均值法转换彩色图像为灰度图像。
编写程序段如下:
%变换为灰度图像
I1=rgb2gray(I);
figure
(2)
subplot(2,1,1);
imshow(I1);
title('fig2.灰度变换结果I1');
subplot(2,1,2);
imhist(I1);
title('fig3.灰度变换结果I1对应灰度直方图');
3.3灰度拉伸
图像灰度化后,车牌部分和非车牌部分图像对比度并不很高,此时如果直接进行边缘提取,由于车牌界限较为模糊,难以提取出车牌边缘,因而难以准确定位车牌。
为增强牌照部位图像和其他部位图像的对比度,使其明暗鲜明,有利于提高识别率,需要将车辆图像进行灰度拉伸。
所谓灰度拉伸,是指根据灰度直方图的分布有选择地对灰度区间进行分段拉伸以增强对比度。
图3.灰度拉伸原理图
如图3所示,它将输入图像中某点
的灰度
,通过映射函数
,映射成输出图像中的灰度
。
在MATLAB中具体建模实现灰度拉伸变换时,设定参数点如下:
变换关系满足关系
3.4图像二值化与梯度锐化
将图像转换为只有两级灰度的黑白图像,可以使用阈值判定法,假定初始阈值设定为T,则
,这里
和
分别为最高、最低灰度值。
在MATLAB中可使用库函数im2bw()实现图像二值化。
图像锐化的目的是使得模糊的图像变清晰,增强图像的边缘等细节。
图像模糊的本质就是图像受到平均或积分运算,因而用它的逆运算微分求出信号变化率,有加强高频分量的作用,可以使图像轮廓清晰便于边缘抽取。
梯度锐化的具体实现可使用多种梯度算子为模版进行运算,包括Robert算子、Prewitt算子、Sobel算子、拉普拉斯算子等。
具体实现过程中可使用edge()函数利用各种算子作边缘检测,经试验,canny算子检测效果最好,检测结果保有一定边缘连续性适合于图像边缘标记与抽取。
编写梯度锐化语句,
I4=edge(I3,'canny',0.15,'both');
这里I3为被检测对象,canny定义算子类型,0.15定义像素宽度范围。
3.5汽车牌照区域定位
梯度锐化提取的车牌边缘很明显,但是车牌边缘并不是连续的,不利于根据其特征进行进一步的判断。
因此,需要对其进行形态学的处理,使其成为一个连通的整体,便于后续定位。
在进行形态学处理时,数学形态学的腐蚀和膨胀运算可使车牌区域的垂直边缘连接成一个整体,同时和周围的干扰区域分离,成为一个独立的区域。
水平结构元素可以是形如[1…1]的滑动窗口,结构元素的大小取决于车牌图像的大小,一般取所有车牌图像大小的统计均值。
相应代码如下:
%车牌定位
figure(5)
subplot(3,1,1);
se=[1;1;1];%线型结构元素
I5=imerode(I4,se);%腐蚀图像
imshow(I5),title('fig8.对梯度锐化结果腐蚀后边缘图像I5');
subplot(3,1,2);
se=strel('rectangle',[25,25]);%矩形结构元素
I6=imclose(I5,se);%图像聚类、填充图像
imshow(I6),title('fig9.填充后图像I6');
subplot(3,1,3);
I7=bwareaopen(I6,2000);%去除聚团灰度值小于2000的部分
imshow(I7),title('fig10.形态学滤波后图像I7');
3.6汽车牌照区域截取
由于前面开闭运算中有可能将部分车牌腐蚀掉,造成定位错误或者车牌缺失,所以先进行车牌的初步提取,去除伪车牌,然后结合车牌的纹理特征进行准确提取。
对经过开闭运算处理的图像进行区域提取,并计算区域特征参数,然后根据车牌的先验知识对区域特征参数进行比较,提取车牌区域。
据2007年实施的车牌标准规定,车前车牌长440mm,宽140mm。
其比例为440/140≈3.15。
根据图像像素的大小,这里可以选取筛选条件为宽在50到150之间,高在20到50之间,同时宽高比例应大于0.45,就可以比较准确的得到车牌的大致坐标位置。
在本例中还可将问题简化,转化为对自选牌照区域的像素值比较,通过自选车牌蓝底白字的主要特征截取车牌区域。
具体编码方式见第四小节。
3.7牌照字符分割
字符的切分是将牌照中单个字符分割出来以便于字符识别,字符切割的过程中以垂直投影、字符间距尺寸测定、字符长宽比、轮廓分析技术结合为基础进行的。
具体算法为:
车牌字符切分的具体算法为:
1)对车牌图像进行垂直投影,计算出字符的宽度后,确定字符的中间位置,并计算相邻两个字符之间的间距,即中间距离的差值。
取其最大值定为第二个字符和第三个字符之间的距离。
以此为分界线,分别向前、后两个方向进行切分,从而定位出每个字符的左右边界,并保存在数组里。
由于MATLAB的数组可以存放不同大小的数据,为字符边界信息的存储提供了极大的便利。
2)对每个切分出的字符进行水平投影,确定字符的具体的上下边界,保存到数组里。
3)由于用于最后识别的字库中字符模板为m*n像素,所以这里对切分出来的字符进行归一化处理,统一为m*n像素。
4)将归一化后的字符的信息保存在数组里,做为参数输入字符识别模块与模板比较进行字符识别。
其中,字符宽度和中心距离的算法首先对垂直投影进行峰谷分析,根据预先设定的阈值查找并记录每一个字符的上升点,及每一个字符的下降点。
计算前一个下降点到后一个上升点之间的距离就是两个字符之间的谷宽度。
然后计算相邻两个字符的上升点的差值,减去它们之间的谷宽度,就可以得到每一个字符的宽度。
用字符上升点的位置加上字符的宽度的一半,就可以得到字符的中间位置。
该算法操作起来比较方便,并且可以和字符左右边界的确定同时进行。
具体实现代码作为关键代码段在第四小节给出。
4源程序代码
下面将给出关键步骤实现的具体代码:
1)图像灰度拉伸
%图像灰度线性拉伸
f0=0;g0=0;%自定义灰度拉伸范围,为分段点赋值
f1=50;g1=20;
f2=180;g2=210;
f3=255;g3=255;
r1=(g1-g0)/(f1-f0);
b1=g0-r1*f0;
r2=(g2-g1)/(f2-f1);
b2=g1-r2*f1;
r3=(g3-g2)/(f3-f2);
b3=g2-r3*f2;
[m,n]=size(I1);
I2=double(I1);
fori=1:
m
forj=1:
n
f=I2(i,j);
g(i,j)=0;
if(f>=f1)&(f<=f2)
g(i,j)=r1*f+b2;
elseif(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;
end
end
end
end
I2=mat2gray(g);
figure(3)
subplot(2,1,1);
imshow(I2);
title('fig4.灰度线性拉伸结果I2');
subplot(2,1,2);
imhist(I2);
title('fig5.灰度线性拉伸结果I2对应灰度直方图');
2)车牌牌照区域的定位与截取
%车牌定位
figure(5)
subplot(3,1,1);
se=[1;1;1];%线型结构元素
I5=imerode(I4,se);%腐蚀图像
imshow(I5),title('fig8.对梯度锐化结果腐蚀后边缘图像I5');
subplot(3,1,2);
se=strel('rectangle',[25,25]);%矩形结构元素
I6=imclose(I5,se);%图像聚类、填充图像
imshow(I6),title('fig9.填充后图像I6');
subplot(3,1,3);
I7=bwareaopen(I6,2000);%去除聚团灰度值小于2000的部分
imshow(I7),title('fig10.形态学滤波后图像I7');
%分割出车牌部分
[y,x,z]=size(I7);
I8=double(I7);
Y1=zeros(y,1);
fori=1:
y
forj=1:
x
if(I8(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
end
end
end
[tempMaxY]=max(Y1);
PY1=MaxY;
while((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Y1(PY2,1)>=50)&&(PY2 PY2=PY2+1; end IY=I(PY1: PY2,: : ); X1=zeros(1,x); forj=1: x fori=PY1: PY2 if(I6(i,j,1)==1) X1(1,j)=X1(1,j)+1; end end end PX1=1; while((X1(1,PX1)<3)&&(PX1 PX1=PX1+1; end PX2=x; while((X1(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end PX1=PX1-1; PX2=PX2+1; cp1=I(PY1: PY2,PX1: PX2,: );%cpFORChePai figure(6) subplot(4,1,1); imshow(cp1); title('fig11.车牌定位彩图cp1'); subplot(4,1,2); cp2=rgb2gray(cp1); imshow(cp2); title('fig12.车牌定位灰度图cp2'); g_max=double(max(max(cp2))); g_min=double(min(min(cp2))); T=round(g_max-(g_max-g_min)/3);%T为二值化的阈值 [m,n]=size(cp2); cp3=(double(cp2)>=T); subplot(4,1,3); imshow(cp3); title('fig13.车牌定位二值化图像cp3'); cp4=bwareaopen(cp3,20); subplot(4,1,4); imshow(cp4); title('fig14.形态学滤波后的车牌定位二值化图像cp4'); 3)车牌拍照字符的切分 %寻找连续有文字的块,若长度大于某阈值,则认为该块需要分割 cp5=qiege(cp4); [m,n]=size(cp5); k1=1;k2=1;s=sum(cp5);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(cp5(: [k1+5: k2-5]))); cp5(: k1+num+5)=0;%分割 end end %再切割 cp5=qiege(cp5); %切割出7个字符 y1=10;y2=0.25;flag=0;word1=[]; whileflag==0 [m,n]=size(cp5); left=1;wide=0; whilesum(cp5(: wide+1))~=0 wide=wide+1; end ifwide cp5(: [1: wide])=0; cp5=qiege(cp5); else temp=qiege(imcrop(cp5,[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 cp5(: [1: wide])=0;cp5=qiege(cp5); end end [word2,cp5]=getword(cp5);%分割出第二个字符 [word3,cp5]=getword(cp5);%分割出第三个字符 [word4,cp5]=getword(cp5);%分割出第四个字符 [word5,cp5]=getword(cp5);%分割出第五个字符 [word6,cp5]=getword(cp5);%分割出第六个字符 [word7,cp5]=getword(cp5);%分割出第七个字符 figure(7) word1=imresize(word1,[7025]);subplot(1,7,1);imshow(word1);title('1'); word2=imresize(word2,[7025]);subplot(1,7,2);imshow(word2);title('2'); word3=imresize(word3,[7025]);subplot(1,7,3);imshow(word3);title('3'); word4=imresize(word4,[7025]);subplot(1,7,4);imshow(word4);title('4'); word5=imresize(word5,[7025]);subplot(1,7,5);imshow(word5);title('5'); word6=imresize(word6,[7025]);subplot(1,7,6);imshow(word6);title('6'); word7=imresize(word7,[7025]);subplot(1,7,7);imshow(word7);title('7'); 4)自定义功能函数 %function函数getword.m 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 d(: [1: wide])=0; ifsum(sum(d))~=0 d=qiege(d);%切割出最小范围 elseword=[];flag=1; end else word=qiege(imcrop(d,[11widem])); d(: [1: wide])=0; ifsum(sum(d))~=0; d=qiege(d);flag=1; elsed=[]; end end end result=d; %function函数qiege.m functione=qiege(d) [m,n]=size(d); top=1;bottom=m;left=1;right=n;%init whilesum(d(top,: ))==0&&top<=m top=top+1; end whilesum(d(bottom,: ))==0&&bottom>=1 bottom=bottom-1; end whilesum(d(: left))==0&&left<=n left=left+1; end whilesum(d(: right))==0&&right>=1 right=right-1; end dd=right-left; hh=bottom-top; e=imcrop(d,[lefttopddhh]); end 5调试过程及结论 图4.获取有待识别的RGB彩色图像 如图4所示,通过imread()语句读取素材库中有待识别的汽车车牌素材图像,具体格式为I=imread('1.jpg')并通过imshow(I)绘制原始图像。 在定义了初始对象以后,经过灰度化得灰度图像如图5。 其后,对获得的灰度图像线性拉伸,增强车辆图像和拍照图像的对比度,如图6所示。 这一操作有利于减小后续牌照分割的误差。 图5.图像灰度变换结果及灰度图的像素值分布情况 图6.灰度拉伸结果及灰度拉伸后像素值分布情况 图7.二值化、梯度锐化操作结果 通过im2bw()和edge()语句实现对图像的二值化、梯度锐化操作,具体情况如图7所示。 图8.对车牌区域的定位截取及后续操作情况 通过处理锐化后的图像定位车牌牌照区域并在原图像中截取此部分图像,如图8中fig11所示。 此外图8中fig12-14分别是对截取下来的这部分图像灰度化、二值化、形态学滤波后的结果。 图9.车牌牌照区域字符分割识别结果 如图9所示为最终的车牌牌照区域字符分割识别结果,可见该程序段能够基本实现字符的无误识别和切分得到单字节的车牌信息。 可见汽车牌照信息“鄂AL4637”。 6心得体会 本次拓展训练过程中,获取主要的轴线思路并不难,基于课堂上学习到的知识很快就能锁定到基本的实现流程和步骤。 相比起以往的课程设计经验,重难点反而在那些看起来简单的细节处。 图像的灰度线性拉伸是遇到的第一个问题点,如何确定拉伸灰度的范围、如何设置拐点让我思考了好一会儿。 拐点的设置直接影响了后续操作的准确性、连续性,针对图像样本一反复试验发现将拉伸点设置在波峰或波谷位置效果较好。 其后的重点主要在车牌的定位和字符的切分上。 这两个操作在MATLAB的固有函数库中并无直接的对应操作,查阅了大量相关书籍后仿写了程序段,并添加进自己的思想完善程序段。 通过这次拓展训练很好的将图像处理课上的抽象思维具象化,为实际应用打下一定基础。 虽然最终成型的软件并不是很完善,距离商用的监控软件还有很大差距,但是通过这次拓展训练我掌握了一定的编程基础和软件开发办法。 学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。 虽然目前成型的程序还不能很好的识别军用、教学用车牌,在天气北京恶劣情况下拍摄的照片也无法准确识别。 但我相信随着今后的不断学习,专业能力的不断提升,这段差距将不断缩小。 在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。 而且大大提高了动手的能力,尽管成型软件的功能单一,但这过程仍使我充分体会到了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汽车 车牌 号码 识别 报告书 BYWenny