基于MATLAB的车牌识别研究

基于MATLAB的车牌识别研究

一、课题背景

随着我国公路事业的发展,人工管理方式已经不能满足如今实际的需要。车牌识别技术是计算机视频图像识别技术在车辆牌照识别中的一种应用,是现代智能交通系统(Intelligent Traffic System,简称ITS)中的重要组成部分之一。车牌识别系统(vehicle license plate recognition system,简称LPR)使车辆管理更加智能化、数字化,有效提升了交通管理的效率。对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制与诱导,机场、港口、小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。而牌照作为机动车辆管理的唯一标识符号,使得车辆牌照识别系统的研究在机动车管理方面具有重要的实际意义。

本文通过对题目的研究,设计了一个基于Matlab软件的车牌识别程序,可实现图像预处理、车牌定位、字符分割,然后通过神经网络对车牌进行字符识别,从图像中提取车牌中的字母和数字,从而得到文本形式的车牌号码。其中,图像预处理是通过图像灰度化及Roberts算子进行边缘检测完成。车牌定位是通过数学形态法来确定,然后再通过车牌彩色信息的彩色分割法来完成车牌的切割。字符分割是将车牌部分进行二值化后,进行垂直投影以及对投影部分扫描得到。通过用该算法对三个问题中的照片和视频进行处理,可识别车辆牌照:

二、算法实现

对于车牌识别技术的研究可以追溯到上个世纪,目前可知的方法包括图像处理技术、神经元网络算法、车辆检测技术、计算机视觉技术、人工智能技术和模糊数学理论等,而对于我国车牌识别的特殊性,仅仅采用其中一种技术是难以奏效的。我们现在的一些方法主要是将上述的一些传统方法同现在的高新技术相结合以达到更好的效果。而我们所研究的车牌识别程序是建立在排除外界一系列对车牌识别有较大影响的客观不利因素的前提下进行探讨与研究的。同时,我们可以从所给题目中得到车牌识别所需要运用的主要内容及概念。由此,我们使用Matlab软件进行车牌识别算法的编写与研究,来实现图像预处理、车牌定位、字符分割,然后通过神经网络对车牌进行字符识别,从图像中提取车牌中的字母和数字,从而得到文本形式的车牌号码。其中,图像预处理是通过图像灰度化及Roberts算子进行边缘检测完成。车牌定位是通过数学形态法来确定,然后再通过车牌彩色信息的彩色分割法来完成车牌的切割。字符分割是将车牌部分进行二值化后,进行垂直投影以及对投影部分扫描得到。具体步骤如图一所示:


图像

读取

图像

预处理

车牌

定位

字符

分割

字符

识别

结果

输出

图一 车牌识别算法基本原理图

三、实现过程

3.1 图像预处理模块

成像系统获取的图像(原始图像)由于受到种种条件限制和随机干扰,如光照明暗程度、相对运动以及设备性能的优劣等,往往存在有噪声,对比度不够等缺点。另外,距离远近,焦距大小等又使得所拍摄物体在整幅图像中间的大小和位置不确定,环境中的噪声、编码过程中产生的块效应等会造成图像失真,往往不能在视觉系统中直接使用,因此要改善图像数据,抑制不需要的变形或者增强。对原始图像进行图像增强、图像分割、边缘检测等处理,这些处理的技术被称为图像预处理技术。对于后续处理来说,以提取图像特征为目的的图像预处理在图像处理过程中显得非常重要。具体步骤流程图如图二所示:

图像读取

灰度化图像

平滑处理

边缘提取

图二 图像预处理原理图

3.1.1 图像采集以及灰度化

输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。现今中国的车辆牌照一般可分为蓝底白字、黄底黑字、白底红字、绿底白字和黑底白字等几种类型,我们可以利用不同的色彩通道来区分区域和背景,即对于蓝底白字的牌照,采用蓝色B通道,此时牌照区域中字符并不呈现,因为蓝色与白色在B通道中并无区分,而在G、R通道中则不然。对于白底黑字则可用R通道,绿底黑字的牌照则可用G通道明显显示出牌照区域位置以便后续处理。将彩色图像转化成灰度化图像时,其灰度值可由以下公式计算得到:

G=0.110B+0.588G+0.302R (1)

G=(B+G+R)/3 (2)由本算法得到的灰度图像(以下均以image_1.jpg所得图像示例):


基于MATLAB的车牌识别研究_第1张图片

基于MATLAB的车牌识别研究_第2张图片



3.1.2 图像边缘提取

边缘是指图像局部亮度变化显著的部分,是图像风、纹理特征提取和形状特征提取等图像分析的重要基础。图象增强处理对图象牌照的可辩认度的改善和简化后续的牌照字符定位和分割的难度都是很有必要的。因此我们需要对图像进行边缘检测。增强图象对比度度的方法有:灰度线性变换、图象平滑处理等。

(1)灰度化处理

由于牌照图象在拍摄时受到种种条件的限制和干扰,图象的灰度值往往与实际景物不完全匹配,这直接影响到图象的后续处理。当导致这一结果的原因为:被摄物体的远近不同,使得图象中央区域和边缘区域的灰度失衡,或是由于摄像头在扫描时各点的灵敏度有较大的差异而产生图象灰度失真,异或为曝光不足而使得图像的灰度变化范围很窄等时,就可以采用灰度校正的方法来处理,以此来增强灰度的变化范围、丰富灰度层次,达到增强图象的对比度和分辨率。

(2)平滑处理

对于受噪声干扰严重的图象,由于噪声点多在频域中映射为高频分量,因此可以在通过低除噪声,但实际中为了简化算法也可以直接在空域中用求邻域平均值的方法来削弱噪声的影响,这种方法称为图象平滑处理。邻域平均值的公式表示为:

g(i,j)=∑f(i,j)/M (其中(i,j)∈S)

上式中M 为邻域中除中心象素点f(i,j) 之外包括的其它象素总数。然而,邻域平均值的平滑处理会使得图象灰度急剧变化的地方,尤其是物体边缘区域和字符轮廓等部分产生模糊作用。为了克服这种平均化引起的图象模糊现象,我们给中心点象素值与其邻域平均值的差值设置一固定的阈值,只有大于该阈值的点才能替换为邻域平均值,而差值不大于阈值时,仍保留原来的值,从而减少由于平均化引起的图象模糊。

由边缘提取、腐蚀、填充、形态滤波后所得图像:


基于MATLAB的车牌识别研究_第3张图片

基于MATLAB的车牌识别研究_第4张图片


3.2 车辆牌照定位模块

车牌定位作为整个车牌识别系统中最重要的技术之一,主要是在经图象预处理后的原始灰度图象中确定牌照的具体位置。其关键在于能够在此过程中识别牌照所在的区域,而整个识别系统的准确性也在于此。首先对采集到的图像进行全面搜索,找到符合汽车牌照特征的若干区域,牌照所在区域在原始图象中是较有特征的一块区域,它是水平度较高的横向近似的长方形,它在原始图象中的相对位置比较明显 ,且其灰度值与周边区域的灰度值有明显不同,因此在其周边形成了灰度突变的边界,这样就便于通过边缘检测来对图象进行分割,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。该操作的主要流程图为:


图像腐

蚀处理

计算行列方向灰度值累积和

计算寻找车牌区域

车牌定位

车牌切割处理

车牌定位流程图

3.2.1 车牌二值化处理

在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。

就本题来说,对牌照的二值化最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:即大于T的像素群和小于T的像素群,图像中对象物的形状特征的主要信息,则可以从二值图像中得到。因此,在车牌字符切分前,首先对图像进行二值化处理。 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素。再用模板中的全体像素的平均值来代替原来像素值。经过以上方法即完成了车辆号码牌的二值化。经上述方法所得行列灰度化之和及牌照分割图像为:


基于MATLAB的车牌识别研究_第5张图片

4.34

基于MATLAB的车牌识别研究_第6张图片


3.3 字符分割

字符分割是将多行或多字符图像中的每个字符从整个图像中分割出来,成为单个字符。由于字符字体存在着多样性,所以在一般的字符识别系统中,字符识别之前要先对图像进行阈值化,然后再进行行字切分,以分割出一个个具体的二值表示的字符图像点阵,作为单字符识别的输入数据。由于获得的文本图像不但包含了组成文本的一个个字符,而且包含了字符行间距与字间的空白,甚至还会带有各种标点符号,这就需要采用一定的处理技术将文本中的一个个字符切分出来,形成单个字的图像阵列,以进行单字识别处理。本算法主要切分方法主要有行切分和字切分,本算法主要用到的是字切分技术。具体方法示意图为:


字切分的操作则是从切分出的文本图像行中将单个的字符图像切分出来。字切分的正确与否直接影响识别结果,是完成算法比较难的部分。分析图像行的垂直投影可以发现,垂直投影上的空白间隔部分不仅没有行与行之间的空白间隔部分宽,而且分布也不均匀。是因为在汉字文本中一般汉字间距远不如行间距明显,同时汉字中有相当数量汉字是左、右结构或左、中、右结构的,这些汉字图像的垂直投影在一个单字的内部也会出现空白间隙,使得文本汉字的字切分比行切分困难。为了解决这个问题,可以利用汉字间的间隔一般大于汉字内间隔这一特点先进行汉字的粗切分,再根据汉字基本是个方块图形这一事实进行细切分。具体实现为:根据汉字的行切分,可以获得汉字的高度信息,从而可以估计出汉字的基本宽度;对粗切分出的每个汉字,以此宽度信息进行衡量,以粗切分的起始位置为出发点,向左右两方向进行搜索,对起始位置进行细微的调整,从而使得字的切分更准确。由算法运行后得到的列方向像素点灰度值累计和直方图为:


所得字符分割图像为:





基于MATLAB的车牌识别研究_第7张图片




基于MATLAB的车牌识别研究_第8张图片



四、案例分析

基于所建模型中所述的方法,我们可以对问题中的其他图像进行车牌识别,由本车牌识别算法所得结果如下:

问题一:

image_2.jpg识别情况为:


基于MATLAB的车牌识别研究_第9张图片



基于MATLAB的车牌识别研究_第10张图片

基于MATLAB的车牌识别研究_第11张图片




基于MATLAB的车牌识别研究_第12张图片


image_3.jpg识别情况为:


基于MATLAB的车牌识别研究_第13张图片



基于MATLAB的车牌识别研究_第14张图片



基于MATLAB的车牌识别研究_第15张图片



基于MATLAB的车牌识别研究_第16张图片


image_4.jpg识别情况为:


基于MATLAB的车牌识别研究_第17张图片



基于MATLAB的车牌识别研究_第18张图片


image_5.jpg识别情况为:


基于MATLAB的车牌识别研究_第19张图片



基于MATLAB的车牌识别研究_第20张图片



五、参考文献:

[1]王玫、苏光大、王国宏.复杂环境下车牌定位及目标真实性验证,[J].光学 精密工程,2009,17(4):887-893.

[2] 罗树英.基于MATLAB的车牌分割及数字识别算法设计[D]湖南:南湖学院,2013.

[3] 张方樱,巢佰崇,陈雪丰.车牌自动识别系统[J].武汉大学,2005,3(3):49-50.

[4] 欧阳文卫,罗三定,车牌定位算法研究[J].湖南工业职业技术学院学报,2006,6(4):33-35.

[5] 袁卉平.基于MATLAB的车牌识别系统的设计与研究[J].广西:广西工学院工业控制计算机,2010.

[6] 许录平.数字图像处理(MATLAB版)[M].北京:科学出版社,2011.

[7] 陈永超.基于数字图像处理的车牌识别研究:[D].武汉:武汉理工大学控制理论与控制工程,2006.

[8] 刘同焰.车牌识别的相关算法研究与实现[D].广州:华南理工大学应用数学.2012.

[9] 李文举,梁德群.质量退化的车牌字符分割方法[J].计算机辅助设计与图形学报,2004,6(5):697-700.

[10] 陈容红,刘玉娟,陶砂等.车牌识别系统中字符分割技术研究[J].制造业自动化,2010,32(5),51-55.

[11] 陈超.MATLAB应用实例精讲[M].北京:电子工业出版社,2010.473-480.

[12]陈建功,李其申,肖冬杰.运动模糊车牌图像的恢复与定位[J].信息通信,2012,120,37-38.

六、源码

完整源程序代码:

I=imread('image_1.jpg');%读取图像
figure();  subplot(3,2,1),imshow(I), title('原始图像');
I1=rgb2gray(I);%转化为灰度图像
subplot(3,2,2),imshow(I1),title('灰度图像');
I2=edge(I1,'roberts',0.03,'both');%采用robert算子进行边缘检测
subplot(3,2,3),imshow(I2),title('边缘检测后图像');
se=[1;1;1]; %线型结构元素 
I3=imerode(I2,se);    %腐蚀图像
subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');
se=strel('rectangle',[25,25]);  
I4=imclose(I3,se);%图像聚类、填充图像
subplot(3,2,5),imshow(I4),title('填充后图像');
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
subplot(3,2,6),imshow(I5),title('形态滤波后图像');
[y,x,z]=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,1)= Y1(i,1)+1; 
            end  
     end       
 end
 [temp MaxY]=max(Y1);
 figure();
 subplot(3,2,1),plot(0:y-1,Y1),title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素')
 PY1=MaxY;
 while ((Y1(PY1,1)>=50)&&(PY1>1))
        PY1=PY1-1;
 end    
 PY2=MaxY;
 while ((Y1(PY2,1)>=50)&&(PY2PX1))
        PX2=PX2-1;
 end
 PX1=PX1-1;
 PX2=PX2+1;
  dw=I(PY1:PY2,PX1:PX2,:); 
subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像')
if isrgb(dw)
   I1 = rgb2gray(dw);    %将RGB图像转化为灰度图像
else   I1=dw;  
end
g_max=double(max(max(I1)));
g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值
[m,n]=size(I1);% d:二值图像
%h=graythresh(I1);
I1=im2bw(I1,T/256);
subplot(3,2,4);
imshow(I1),title('二值化车牌图像');

I2=bwareaopen(I1,20);
subplot(3,2,5);
imshow(I2),title('形态学滤波后的二值化图像');

[y1,x1,z1]=size(I2);
I3=double(I2);
TT=1;
Y1=zeros(y1,1);
 for i=1:y1
    for j=1:x1
             if(I3(i,j,1)==1) 
                Y1(i,1)= Y1(i,1)+1 ;
            end  
     end       
 end
Py1=1;
Py0=1;
while ((Y1(Py0,1)<20)&&(Py0=3)&&(Px1

你可能感兴趣的:(定位,算法,计算机视觉,人工智能,机器学习)