基于matlab的车牌识别系统的设计与实现剖析.docx
《基于matlab的车牌识别系统的设计与实现剖析.docx》由会员分享,可在线阅读,更多相关《基于matlab的车牌识别系统的设计与实现剖析.docx(23页珍藏版)》请在冰豆网上搜索。
基于matlab的车牌识别系统的设计与实现剖析
图形图像处理与应用
课程设计报告
引言2
1.设计原理2
2.系统框架结构2
2.1工作流程3
3.设计步骤4
3.1设计方案4
4.各模块的实现4
4.1图像预处理4
4.1.1图像灰度化4
4.1.2图像的边缘检测5
4.2车牌定位和分割7
4.2.1车牌的定位7
4.2.2车牌的分割9
4.2.3对定位后的彩色车牌的进一步处理9
4.3字符的分割和归一化处理11
4.3.1字符的分割11
4.3.2字符的归一化处理12
5实验结果和分析12
6.实验总结14
主要参考文献15
附录16
实验体会21
基于MATLAB的车牌识别系统的设计
——字符分割的设计
引言介绍当前的发展背景
车辆的牌照是机动车的识别标志,在交通管理中有着重要的作用。
通过汽车车牌识别系统可以监控车辆的信息和行驶状况,可以最迅速的实现车辆控制以及交通状况的调控,所以对于现代智能交通至关重要。
该系统主要有两大模块:
图像处理模块和字符识别模块。
本文主要对图像处理模块进行设计和研究。
图像处理模块的质量好坏更是衡量整个系统成功与否的关键。
MATLAB语言对于图像的处理非常方便,能够直接调用编好的函数,为整个系统提供了保障。
1.设计原理
车牌识别系统的摄像头通过对经过指定区域的机动车辆进行拍照,因为照片会受到光照、拍摄位置和车辆行驶速度的影响,导致拍摄的图片不能准确的确定汽车的车牌。
而车牌识别系统就通过对机动车辆的照片进行图像预处理、车牌定位、字符分割、字符识别等技术手段,从而得到清晰的机动车牌照的照片,从而提高现代智能交通的管理效率,可以说车牌识别系统对于现代智能交通至关重要。
2.系统框架结构
汽车车牌自动识别系统主要包括触发拍照、图像采集、图像预处理、车牌定位、字符分割、字符识别、输出结果等单元。
图2-1车牌识别系统工作流程图
2.1工作流程:
触发拍照:
该单元会自动检测车辆在指定区域的存在,现有的成熟技术的有线圈触发、视频触发、红外触发、雷达触发以及激光触发。
其中线圈触发和视频触发得到了广泛的应用。
图像采集:
该单元是指道路上安装的摄像头在检测到有车辆通过的同时进行拍照并借助网络传送到汽车自动识别系统。
图像预处理:
该单元是指车牌识别系统对拍摄的汽车图片进行灰度化和边缘检测等处理。
车牌定位:
是指对预处理过的汽车图片进行处理,把车牌部分进行定位,把无用的部分去除,得到定位好的车牌图片。
字符分割:
对已经定位的车牌图片的进行字符分割,将车牌分割为7个单一的字符图片
字符识别:
将已经分割出来的七个字符进行识别。
输出结果:
输出识别结果,并进行数据存储。
3.设计步骤
3.1.设计方案:
该系统主要是由图像处理和字符识别两部分组成。
其中图像处理部分包括图像预处理、边缘提取模块、牌照的定位以及分割模块。
字符识别部分可以分为字符分割与特征提取和单个字符识别两个模块。
字符识别部分要求照片清晰,但由于该系统的摄像头长时间在室外工作,加上光照条件、摄像头角度和距离、车辆自身条件以及车辆的行驶速度的影响,想拍出较理想的图片很困难。
因此,我们要对摄像头拍摄的图片进行预处理,主要包括图片灰度化和图片边缘提取等。
车牌定位和车牌分割是整个系统的关键,其作用是在经图象预处理后的灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。
车牌识别系统的最终目的就是将不清楚的车牌照片进行识别,输出清晰的图片。
现在字符识别的常用方法有模板匹配法和神经网络模型法。
4.各模块的实现
车牌识别系统包括图像采集、图像预处理、车牌定位、字符分割、字符识别等模块,本文主要研究图像预处理、车牌定位和字符分割三个模块。
4.1图像预处理
4.1.1图像灰度化:
因为车牌识别系统的摄像头拍摄的图片是彩色的,图片的背景颜色有时和车牌的颜色相似,而且彩色图片会占用较大的存储空间,使计算机处理速度变慢,加重计算机负担,所以我们要对拍摄的照片进行灰度化处理。
对于将彩色图像转换成灰度图像时,目前比较主流的灰度化方法叫平均值法,公式为:
H=0.229R+0.588G+0.144B
公式中H表示灰度图的亮度值;R代表彩色图像红色分量值;G代表色彩图像绿色分量值;B代表彩色图像蓝色分量值。
RGB三分量前的系数为经验加权值。
加权系数的取值建立在人眼的视觉模型之上。
对于人眼较为敏感的绿色取较大的权值;对人眼较为不敏感的蓝色则取较小的权值。
通过该公式转换的灰度图能够比较好地反应原图像的亮度信息。
在MATLAB中我们可以调用im2gray函数对图像进行灰度化处理。
4.1.2图像的边缘检测:
边缘是指图像灰度发生空间突变或者在梯度方向上发生突变的像素的集合。
用摄像机采集到的机动车图像由于受到噪声干扰以及车辆本身的影响,使得获得的图像质量不理想。
因此,在进行对汽车牌照的定位及字符识别之前需要先对车辆图像进行边缘检测处理,提高图像的质量,使其易于后面的分割和识别。
通过良好的边缘检测可以大幅度的降低噪声、分离出复杂环境中的车辆图像、保留完好的车牌字符信息,方便后面的车牌精确定位与字符识别。
由于车牌识别系统摄像头安装位置固定以及机动车车牌的固有属性,我们可以发现机动车车牌图像都处在水平的矩形区域,在图像中位置较为固定,车牌中字符都是按水平方向排列。
因为有这些明显的特征,经过适当的图像变换,可以清晰的呈现出车牌的边缘。
本文采用经典的Roberts边缘检测算子来对图像进行边缘检测。
灰度化和边缘检测的MATLAB程序如下:
I=imread('zhaopian.jpg');
figure
(1),imshow(I);title('原图')
I1=rgb2gray(I);
figure
(2),imshow(I1);title('灰度图');
I2=edge(I1,'robert',0.15,'both');
figure(3),imshow(I2);title('Robert边缘检测')
图4-1原始图片
图4-2灰度图
图4-3Robert算子边缘检测
4.2车牌定位和分割
该系统的摄像头拍摄的图片是整个机动车的图片,而只有车牌部分是对系统有用的。
所以我们要对照片进行车牌定位和分割。
车牌的定位和分割是从经过图像预处理后的灰度图像中确定牌照位置,并将车牌部分从整个图像中分割出来,从而进行字符识别。
车牌图像的灰度图的车牌部分是一个水平度很高的长方形图样,在原图中比较集中,且灰度值和周围图样有明显差异,因此很容易用边缘检测来对图像进行分割。
车牌定位和分割的准确度直接关系到最后的字符识别的质量。
图4-4车牌定位流程图
4.2.1车牌定位
机动车图像经过灰度化和边缘检测的处理后,边缘得到了加强,牌照区域已经非常明显。
本文采用的是用数学形态学来进行图像处理和模式识别。
数学形态学用具有一定形态的机构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的,能有效的去除噪声,保留图像原有信息的同时提取的边缘比较平滑,提取的图像骨架也比较连续,断点少。
现在我们将经过预处理的图像进行图像腐蚀以及去除杂质,就可以得到相对准确的车牌位置。
图4-5腐蚀后的图像
图4-6.平滑图像的轮廓
图4-7从对象中移除小对象后图像
4.2.2车牌分割
本文车牌部分的分割采用的是利用车牌彩色信息的彩色分割法。
使用统计彩色像素点的方法分割出车牌区域,确定车牌底色蓝色RGB对应的灰度范围,然后统计在行方向的颜色范围内的像素点数量,确定车牌在行方向的区域。
然后,在分割出的行区域内,统计列方向蓝色像素点的数量,最终确定完整的车牌区域。
图4-8车牌对位的图像
4.2.3对定位后的彩色车牌的进一步处理
定位后车牌图像是彩色的,会占用较大的存储空间,加重计算机负担。
且车辆图片不可避免存在噪声,所以要对图像进行灰度化,二值化以及滤波处理。
图像的二值化处理就是将图像上的点的灰度置为两个数值,通常为0或255,使整个图像呈现出明显的黑白效果。
也就是将256个亮度等级的灰度图像通过适当的门限值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
滤波则是为了除去图像噪声。
滤波方法有多种,本文采取的滤波方法为均值滤波。
均值滤波是典型的线性滤波算法,指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素。
再用模板中的全体像素的平均值来代替原来像素值。
图4-9车牌的进一步处理
4.3字符分割与归一化
图4-10.字符分割和归一化流程图
4.3.1字符分割
将得到的车牌区域图像进行二值化处理后,对图像进行垂直投影,投影图上有明显的类似于峰谷的波形起伏变化,通过对投影图上的波形从左向右进行扫描,根据谷和峰的特征就可以判断出每个字符的位置;计算垂直峰,检测合理的字符高宽比。
在字符切割时,往往由于阈值取得不好,导致字符切割不准确,针对这种情况,可以对切割出的字符宽度进行统计分析,用以指导切割,对因错误切割过宽的字符进行分裂处理。
图4-11.字符分割后的图像
4.3.2字符归一化处理
由于数码相机拍摄的汽车图像大小不一样,所以得到的牌照上的字符大小就不一样,为了便于字符的识别,需要对字符进行归一化处理。
归一化处理的目的就是使车牌字符同标准模块里面的字符特征一样。
而大小归一是指在长度和宽度方向上分别乘以一个比例因子,使其等于标准模块的字符大小,本文采用的大小归一的方法是分别从水平投影和垂直投影两个方向上对字符象素的大小进行归一化处理。
图4-12字符归一化后的图像
5.实验结果和分析:
通过以上实验步骤,我对多幅车牌图像进行了字符分割,字符分割的效果比较理想。
下图为另一组实验组图。
图5-1另一组实验结果组图
字符分割效果理想主要取决于识别系统前期工作的到位。
将得到的机动车照片进行灰度化和边缘检测处理,运用良好的技术手段进行车牌定位,将定位好的图像进行字符分割处理,得到七个字符,将字符归一化处理。
整个过程使用MATLAB编程实现,能够直接调用函数,大大缩短了实验时间和编译难度。
对于分割出的车牌,我们进行了均值滤波,膨胀和腐蚀处理,这样可以把字符之间的杂色点去掉,只留下白色的字符以及黑色的背景,这对于字符的分割是相当的必要的。
在实验过程中,也出现了字符分割错误的情况,根据分析,造成错误情况的原因主要有:
1.图像质量不高,导致分割出的车牌字符大小不一。
2.车辆牌照的分割失败,尤其是车牌上第一个字符汉字的分割,常常因为过大或者过小导致分割失败。
总体来说,分割出正确的字符的成功率还是蛮高的,如果再能够提高图像质量,分割正确字符的成功率还能够得到提升。
6.实验总结
通过对车牌识别的设计与研究,我觉得有几个方面还可以进行改进。
首先如何将车牌进行定位以及将定位好的车牌分割出来。
常见的车牌定位方法有边缘检测定位算法,利用哈夫变换进行车牌定位以及色彩分割提取车牌等,本文采用的是边缘检测定位算法。
还有字符的分割,本文采用的是投影分割法,常见的方法聚类分割法以及基于模板匹配的分割方法。
我认为对于以上各模块的实现,应该采用多种实验对照,看对于不同情况的照片质量,哪种算法更好,因为,以上处理方法都有自己的侧重方面,对于不同的图片,各种算法的优势是不同的,所以我觉得,对于实际应用的车牌识别系统,应该是具有复杂结构,对于拍摄到的车辆照片进行分析,选择更适合的算法来实现车牌的识别,这才是未来车牌识别系统的发展方向。
主要参考文献
1.白利波车牌检测与识别算法研究[D]北京交通大学,2007,30-31.
2.谢盛嘉梁竞敏车牌识别系统的设计与实现[J]微计算机信息2010(6)
3.王刚冀小平基于MATLAB的车牌识别系统的研究[J]电子设计工程2009(11)
4.王广宇车辆牌照识别系统的原理及算法研究[D]郑州大学2000
5.崔江王友仁.车牌自动识别方法中的关键技术研究[J]计算机测量与控制,2003.11(4)
6.许志影李晋平.MATLAB在图像处理中的应用[J].计算机与现代化,2004(4)
7.刘卫国MATLAB程序设计与应用[M].北京:
高等教育出版社,2002
8.成瑜汽车牌照自动识别技术研究[J].南京航空航天大学学报,2006,4:
29-30
程序附录:
I=imread('zhaopian.jpg');
figure
(1),imshow(I);title('原图')
I1=rgb2gray(I);
figure
(2),imshow(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)&&(PY2PY2=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)&&(PX1PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-1;%对车牌区域的校正
PX2=PX2+1;
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);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(9),imshow(d),title('2.车牌二值图像')
figure(10),imshow(d),title('3.均值滤波前')
%滤波
h=fspecial('average',3);
d=im2bw(round(filter2(h,d)));
imwrite(d,'4.均值滤波后.jpg');
figure(11),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(12),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
ifwided(:
[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');
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]);
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,[11wide