车牌识别

摘要

数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。MATLAB中集成了功能强大的图像处理工具箱。由于MATLAB语言的语法特征与C语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式,而且这种语言可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。


关键词:车牌识别、数字图像处理、MATLAB


设计原理

车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化,并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。

原理图如下:

java校验车牌号 java车牌识别_车牌识别



设计步骤:











1.提出总体设计方案:

(1)车牌图像预处理方法                        

因为车牌图像都是在室外拍摄的,所以不可避免地会受到光照、气候等因素的影响,而且拍摄者的手部抖动与车辆的移动会造成图像的模糊。要去除这些干扰就得先对车牌图像进行预处理。由于当前数码相机的像素较高,原始图像的数据一般比较大,输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度。因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。对图像进行灰度化处理后常用的方法是图像二值化、去除背景图像、增强处理、边缘检测、滤波等处理等。

(2)车牌定位方法                             

我发现车牌定位算法的种类非常多,但是至今没有一种通用的方法。考虑到本次课程大作业所用车牌的一些特点,可采用以下四种车牌定位的算法,下面具体介绍。

1)基于灰度边缘检测与形态学重构的方法。这种方法只要利用车牌区域局部对比度明显和有规律的纹理特征来定位,然后利用形态学方法将车牌区域与其它背景区域分离。

2)根据车牌的固有长宽比进行定位的方法。因为中外车牌的长宽比都是固定的3.1:1,在预处理完成后,对二值化的图像进行膨胀腐蚀,计算联通区域长宽比确定车牌位置。

3)基于彩色图像的车牌定位方法。现在的牌照有四种类型:第一种是最常见的小型汽车所用的蓝底白字牌照;第二种是大型汽车所用的黄底黑字牌照;第三种是军用或警用的白底黑字、红字牌照;第四种是国外驻华机构用的黑底白字、红字牌照。基于彩色图像的车牌定位方法主要利用车牌颜色与车身其他部位颜色具有明显不同的差异来分割与提取车牌。

定位流程图:

java校验车牌号 java车牌识别_二值化_02

(3)字符分割方法

字符分割是指将车牌区域分割成单个的字符区域,分割越准确,识别效果越好。目前有许多种车牌字符分割算法,由于在车牌字符分割中存在噪声干扰,边框、铆钉影响,车牌旋转和光照不均等问题,造成分割不准确,甚至分割错误,目前很难找到普遍适用的分割方法。常用的字符分割法主要是基于投影分析字符的分割方法和基于连通域分析的字符分割方法。

1)投影分析常采用的是水平投影法,即沿水平方向计算每一列属于车牌字符的象素数目,在字符的间隙处取得局部最小值,分割位置应在其附近。先根据车牌水平投影的统计特征呈现出明显“波峰——波谷——波峰”,进行水平方向上的粗分割,若字符出现合并和粘连现象,再采用递归回归办法进行二次字符分割。

2)投影法进行字符分割实现起较为简单,但在预处理效果不好的情况下,较难获得满足条件的列。若增加预处理,则使处理后的图像不可避免地损失一部分有用信息,还可能导致额外误差。

(4)字符识别方法

 

标准的车牌共有七个字符,如上图所示。其中第1位为汉字,第2、3位为大写英文字母,4~7位为阿拉伯数字。目前还有一定数量的个性化车牌,因为保有量较少,故可以忽略不计。所以总共需要识别的字符约50个汉字,26个大写英文字母及10个阿拉伯数字。现在常用的字符识别主要是基于模版匹配和神经网络的方法。

1)模板匹配法是最简单的一种字符识别方法。将待识别字符经分割归一化成模板字体的大小,将它输入字符识别模块进行匹配。根据实际字符和模板图像之间匹配方差最小的原则,判定车牌图像字符所属类别。这种方法对于标准、规范的字符识别效果较好。但在复杂环境下的车牌字符会与理想模板字符不完全一致,这导致了识别结果存在较大误差。

2)模版匹配法简单、成熟,但其自适应不强。对于字符有断裂和粘连等情况容易造成误判。神经网络匹配法具有良好的容错性、自适应和学习能力,但样本的训练收敛速度慢,而大规模并行处理为此提供了解决途径。其中一种方法是采用并行识别的BP网络,让汉字、英文、阿拉伯数字,阿拉伯数字分别送到各自的网络识别。还有学者结合小波变化的优点,提出基于小波和BP神经网络的车牌字符识别新方法,采用小波变换提取字符特征,神经网络实现字符识别,加快了算法的执行,提高了识别率。

处理流程图:

java校验车牌号 java车牌识别_java校验车牌号_03

2.各模块的实现

(1)输入待处理的原始图像:

原图:

java校验车牌号 java车牌识别_二值化_04

(2)图像的灰度化

I=imread('C:\Users\cs\Desktop\car1.jpg');

subplot(3,3,1),imshow(I);

title('原图');%将车牌的原图显示出来

I1=rgb2gray(I);%将彩图转换为灰度图

subplot(3,3,2),imshow(I1);

title('灰度图');

subplot(3,3,3),imhist(I1);

title('灰度图直方图');%绘制灰度图的直方图

I2=edge(I1,'roberts',0.07,'both');%选择阈值0.07,用roberts算子进行边缘检测

subplot(3,3,4),imshow(I2);

title('边缘检测后的图像');

se=[1;1;1];

I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作

subplot(3,3,5),imshow(I3);

title('腐蚀后图像');

se=strel('rectangle',[55,55]);%构造结构元素以正方形构造一个se

I4=imclose(I3,se);% 图像聚类、填充图像

subplot(3,3,6),imshow(I4);

title('填充后图像');     

I5=bwareaopen(I4,2000);% 去除聚团灰度值小于2000的部分

subplot(3,3,7),imshow(I5);

title('形态滤波图像'); %用imshow函数显示滤波后图像

java校验车牌号 java车牌识别_字符识别_05

(3)车牌的行起始和终止位置的确定:

[y,x,]=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

figure(); subplot(1,3,1);

plot(0:y-1,Y1),title('行像素灰度值累计'),xlabel('行值'),ylabel('像素和');

[temp, MaxY]=max(Y1);

PY1=MaxY;

while ((Y1(PY1,1)>=80)&&(PY1>1))

         PY1=PY1-7;

end

PY2=MaxY;

while ((Y1(PY2,1)>=80)&&(PY2

         PY2=PY2+7;

End

 

X1=zeros(1,x);

for j=1:x

     for i=PY1:PY2

            if(I6(i,j,1)==1)

                X1(1,j)= X1(1,j)+1;

            end

     end

end

figure;

subplot(1,3,2);

plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');

PX1=1;

while ((X1(1,PX1)<3)&&(PX1

         PX1=PX1+7;

end

PX2=x;

while ((X1(1,PX2)<3)&&(PX2>PX1))

         PX2=PX2-7;

End

java校验车牌号 java车牌识别_车牌识别_06

(4)拼合获取的车牌在图像的行列位置:

dw=I(PY1:PY2,PX1:PX2,:);

subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像')

 

if isrgb(I)

   I1 = rgb2gray(I);    %将RGB图像转化为灰度图像

else

    I1=I;

end

g_max=double(max(max(I1)));

g_min=double(min(min(I1)));

T=round(g_max-(g_max-g_min)/2.1); % T 为二值化的阈值

[m,n]=size(I1);% d:二值图像

%h=graythresh(I1);

I1=im2bw(dw,T/256);

subplot(3,2,4);

imshow(I1),title('二值化车牌图像');

 

% I1=im2bw(dw);

% subplot(3,2,4);

% imshow(I1),title('二值化车牌图像');

 

I2=bwareaopen(I1,20);

subplot(3,2,5);

imshow(I2),title('形态学滤波后的二值化图像');

java校验车牌号 java车牌识别_二值化_07

(5)车牌字符分割

I1 = im2bw(I1,graythresh(I1));%二值化图像

I2 = bwareaopen(I1,16);%去除小于16像素的区块

figure();

subplot(1,2,1);

imshow(I2),title('二值化车牌图像');

java校验车牌号 java车牌识别_二值化_08

对二值图像进行形态滤波:

I2=bwareaopen(I1,20); %去除小于16像素的区块

subplot(3,2,5);

imshow(I2),title('形态学滤波后的二值化图像');

java校验车牌号 java车牌识别_java校验车牌号_09

最后得到目标车牌区域:

%去除图像顶端和底端的不感兴趣区域

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

      Py0=Py0+1;

end

Py1=Py0;

 while((Y1(Py1,1)>=20)&&(Py1

         Py1=Py1+1;

 end

I2=I2(Py0:Py1,:,:);

subplot(3,2,6);

imshow(I2),title('目标车牌区域');

java校验车牌号 java车牌识别_二值化_10

分割字符按行积累量:

X1=zeros(1,x1);

for j=1:x1

    for i=1:y1

             if(I3(i,j,1)==1)

                X1(1,j)= X1(1,j)+1;

            end 

     end      

end

figure(5);

plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');

java校验车牌号 java车牌识别_字符识别_11

 

分割字符:

for i=1:7

  while ((X1(1,Px0)<3)&&(Px0

      Px0=Px0+1;

  end

  Px1=Px0;

  while (((X1(1,Px1)>=3)&&(Px1<10))

      Px1=Px1+1;

  end

  Z=I2(:,Px0:Px1,:);

  switch strcat('Z',num2str(i))

      case 'Z1'

          PIN0=Z;

      case 'Z2'

          PIN1=Z;

经过以上步骤得到分割后的图像:

java校验车牌号 java车牌识别_java校验车牌号_12

(6)车牌字符识别

字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。建立数字库对该方法在车牌识别过程中很重要, 数字库准确才能保证检测出的数据正确。基于人工神经元网络的算法有两种,一种是先对特征提取待识别字符,然后用所获得的特征训练神经网络分配器;另一种是直接将待处理图像输入网络由网络自动实现特征提取直至识别结果。在本程序中用基于人工神经元网络识别车牌字符。在车牌字符识别部分, 字符集中包含约50个汉字, 26个大写英文字母及10个阿拉伯数字。总的字符样本并不太多。进行车牌识别前需要使用样本对神经网络进行训练,然后使用训练好的网络对车牌进行识别。其具体流程为:使用汉字、字母、字母数字、数字四个样本分别对四个子网络进行训练,得到相应的节点数和权值。对已经定位好的车牌进行图像预处理,逐个的特征提取,然后从相应的文件中读取相应的节点数和权值,把车牌字符分别送入相应的网络进行识别,输出识别结果。

将样本进行归一化为50X20大小,再将图像按列转换成一个1000X1的行向量,将上述18个图像的样本排列在一起构成1000X18的矩阵样本,尽可能多的采集汽车图像提取车牌,部分切分出车牌字符,构造出更多1000X18的矩形样本,用构造好的样本库对神经网络进行训练。        

 

设计结果及分析

通过匹配得到的结果图为:

java校验车牌号 java车牌识别_java校验车牌号_13

从上面结果可以看出,这张车牌的识别失败了,将8误识别为M了,再次经过培训后匹配出图像如图:

java校验车牌号 java车牌识别_车牌识别_14

  此次结果正确,经过实际测试,基于MATLAB的车牌识别系统可以实现基本的车牌识别功能,但是整个系统还存在一些缺陷。第一识别率无法达到百分之一百,这与字符模板本身的准确度有很大的关系;第二可以识别的图像种类有限,车牌必须占整个图像面积比较大才可以识别,如果车牌面积较小甚至无法对车牌进行定位。在车牌识别的过程中数字库的建立很重要,只有数字库的准确才能保证检测出来的数据正确。切割出来的数据要与数据库的数据作比较,所以数据库的数据尤为重要,必须使数据库里的数据具有普遍代表性。

总结

本次作业我选择了最车牌识别。在做这个大作业之前,我本以为车牌识别比较简单,但是接触以后才发现限制车牌识别的因素很多,要想识别任意图像是非常困难的。本次作业我主要是对车牌识别系统的软件部分进行了研究,分别从图像预处理、车牌定位、字符分割以及字符识别等方面进行了系统的分析。我感觉它的工作量的确很大,花费了我不少时间,采集数据、一遍遍地尝试着各个图片有些图片不可以定位出车牌、有些不可以切割准确等等最后经过一次次的培训。通过这次期末大作业,我明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。

参考文献

1.冈萨雷斯.数字图像处理第二版[D]电子工业出版社,2013-07