基于MATLAB的字符识别研究汽车牌照识别程序的设计摘要:本次课程设计的目的是通过对基于MATLAB的字符识别的研究,以汽车牌照识别的设计为实例,详细介绍字符识别的相关原理。
整个汽车牌照识别的过程分为预处理、边缘提取、车牌定位、字符分割、字符识别五大模块,用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。
在研究的同时对其中出现的问题进行了具体分析,处理。
寻找出对于具体的汽车牌照识别过程的最好的方法。
关键词:MATLAB 字符识别车牌识别神经网络图像处理引言在MATLAB的字符识别研究中,汽车牌照的识别是最经典的样例,因为车辆牌照识别系统(License Plate Recognition System,简称LPRS)是建设智能交通系统不可或缺的部分。
基于 MATLAB 图像处理的汽车牌照识别系统是通过引入数字摄像技术和计算机信息管理技术,采用先进的图像处理模式识别和人工智能技术,通过对图像的采集和处理,获得更多的信息,从而达到更高的智能化管理程度。
车牌识别系统整个处理过程分为预处理、边缘提取、车牌定位、字符分割、字符识别五大模块,用 MATLAB软件编程来实现每一个部分处理工程,最后识别出汽车牌照。
一、 MATLAB及其图像处理工具概述MATLAB 是 MATrix LABoratory (矩阵实验室)的缩写,是 Math Works 公司开发的一种功能强效率高简单易学的数学软件。
MATLAB 的图像处理工具箱,功能十分强大,支持的图像文件格式丰富,如*.BMP、*.JPG、 *.JPEG、 *.GIF、 *.TIF 、*.TIFF、 *.PNG 、*.PCX、 *.XWD、 *.HDF、*.ICO 、*.CUR 等。
MATLAB 7.X 提供了20 多类的图像处理函数,几乎涵盖了图像处理的所有技术方法,是学习和研究图像处理的人员难得的宝贵资料和加工工具箱。
这些函数按其功能可分为:图像显示、图像文件 I/O、图像算术运算、几何变换、图像登记、像素值与统计图像分析、图像增强、线性滤波、线性二元滤波设计、图像去模糊、图像变换、邻域与块处理、灰度与二值图像的形态学运算、基于边缘的处理、色彩映射表操作色彩空间变换图像类型与类型转换。
MATLAB 还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
本文将给出 MATLAB 的图像处理工具箱中的图像处理函数实现图像处理与分析的应用技术实例。
二、基于 MATLAB图像处理的汽车牌照识别系统1.系统组成基于MATLAB图像处理的汽车牌照识别系统主要包括车牌定位字符车牌分割和车牌字符识别三个关键环节其识别流程图如图 1所示。
图1 识别流程图其中,(1)原始图像:由数码相机或其它扫描装置拍摄到的图像;(2)图像预处理:对动态采集到的图像进行滤波、边界增强等处理以克服图像干扰;(3)车牌定位:计算边缘图像的投影面积,寻找峰谷点,大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域,最后得到的便为车牌区域;(4)字符分割:利用投影检测的字符定位分割方法得到单个的字符;(5)字符数据库:为第6步的字符识别建立字符模板数据库;(6)字符识别:通过基于模板匹配的OCR算法或基于人工神经网络的OCR算法,通过特征对比或训练识别出相关的字符,得到最后的汽车牌照,包括英文字母和数字。
2.图像预处理图像在形成传输或变换过程中,受多种因素的影响,如:光学系统失真、系统噪声、曝光不足或过量、相对运动等,往往会与原始景物之间或图像与原始图像之间产生了某种差异,这种差异称为降质或退化。
因此在图像处理之前必须进行预处理,包括去除噪音、边界增强、增加亮度等等。
输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。
对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进行定位。
具体步骤如下:首先对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。
采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。
再进行形态学滤波去除其它区域。
I=imread('CAR/0.jpg'); %读取图片I1=rgb2gray(I); %转化为灰度图像I2=edge(I1,'robert',0.09,'both'); %采用robert算子进行边缘检测se=[1;1;1]; %线型结构元素I3=imerode(I2,se); %腐蚀图像se=strel('rectangle',[25,25]); %矩形结构元素I4=imclose(I3,se); %图像聚类、填充图像I5=bwareaopen(I4,2000); %去除聚团灰度值小于2000的部分通过对比原始图片,我们可以发现形态滤波后的图像已经很接近正确的车牌位置了,因此后期处理将通过这张图来找出车牌位置。
3.车牌定位观察经过预处理后得到的图像发现车牌位置有明显的矩形有明显的矩形图样,通过对矩形区域的定位即可获得具体的车牌位置。
(1)车牌的行起始和终止位置的确定[y,x,]=size(I5);I6=double(I5);%绘制行曲线图Y1=zeros(y,1);for i=1:yfor j=1:xif(I6(i,j,1)==1)Y1(i,1)= Y1(i,1)+1;endendendfigure();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;endPY2=MaxY;while ((Y1(PY2,1)>=80)&&(PY2<y))PY2=PY2+7;end(2)车牌的列起始位置和终止位置的确定%绘制列曲线图X1=zeros(1,x);for j=1:xfor i=PY1:PY2if(I6(i,j,1)==1)X1(1,j)= X1(1,j)+1;endendendsubplot(1,3,2);plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');PX1=1;while ((X1(1,PX1)<3)&&(PX1<x))PX1=PX1+7;endPX2=x;while ((X1(1,PX2)<3)&&(PX2>PX1))PX2=PX2-7;end(3)最后拼合获取的车牌在图像的行列位置DW=I(PY1:PY2,PX1:PX2,:);subplot(1,3,3);imshow(DW),title('车牌定位后图像');4.字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。
它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。
%% 车牌图像转为灰度if isrgb(I)I1 = rgb2gray(I);elseI1 = I;end%% 二值化车牌图像I1 = im2bw(I1,graythresh(I1));%二值化图像I2 = bwareaopen(I1,16);%去除小于16像素的区块figure();subplot(1,2,1);imshow(I2),title('二值化车牌图像');%% 分割字符按行积累量[y,x]=size(I2);I3=double(I2);X1=zeros(1,x);for j=1:xfor i=1:yif(I3(i,j,1)==1)X1(1,j)= X1(1,j)+1;endendendsubplot(1,2,2);plot(0:x-1,X1),title('车牌列像素点累计'),xlabel('列值'),ylabel('像素和');%% 分割字符Px0=1;Px1=1;figure();for i=1:7while ((X1(1,Px0)<3)&&(Px0<x))Px0=Px0+1;endPx1=Px0;while (((X1(1,Px1)>=3)&&(Px1<x))||((Px1-Px0)<10)) Px1=Px1+1;endZ=I2(:,Px0:Px1,:);switch strcat('Z',num2str(i))case 'Z1'PIN0=Z;case 'Z2'PIN1=Z;case 'Z3'PIN2=Z;case 'Z4'PIN3=Z;case 'Z5'PIN4=Z;case 'Z6'PIN5=Z;otherwisePIN6=Z;endsubplot(1,7,i);imshow(Z);Px0=Px1;end分割成七块后的车牌图像5.建立字符模板数据库模板库的合理建造是字符识别准确的关键之一,所以在字符识别之前必须把模板库设置好。
汽车牌照的字符一般有 7 个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种警别等有特定含义的字符简称;紧接其后的为字母与数字。
车牌字符识别与一般文字识别在于它的字符数有限,十个阿拉伯数字0~9, 26 个大写英文字母 A~Z 以及相关的车牌用汉字:京、沪、苏、台、港、澳、甲、乙、丙、使、领、学、试、境、消、边、警等,以及新式军牌中的汉字南、兰、广、北、沈、济、空、海等;车牌颜色:蓝、白、黑、黄等。
所以建立字符模板库也极为方便。
通过前面实验获取的几幅不同的车牌图片截取到的图片加上使用PhotoShop制作的部分图片如下:建立模板数据库时必须对这些图片进行统一处理,因为对前面处理分割后的车牌图像的测量得知单个字符的最佳宽高比是1:2,所以将这些图片归一化为50×25大小;因为之后的字符识别考虑使用神经网络算法进行字符识别,所以再将上面归一化后的模板图像的样本排列在一起构成1250×18的矩阵样本,程序设计如下:function inpt = Pretreatment(I)%% 训练样本前期处理if isrgb(I)I1 = rgb2gray(I);elseI1=I;endI1=imresize(I1,[50 25]);%将图片统一划为50*25大小I1=im2bw(I1,0.9);[m,n]=size(I1);inpt=zeros(1,m*n);%% 将图像按列转换成一个行向量for j=1:nfor i=1:minpt(1,m*(j-1)+i)=I1(i,j);endend这是一个自定义函数的Pretreatment.m 文件,可以解决频繁写重复代码的问题,前面的图像预处理及车牌定位的代码可以写进Location.m文件中,通过代码DW = Location(I); 取得车牌定位后的图像;同时字符分割的代码亦可写进StringSplit.m 文件中,可以通过代码[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(DW); 取得的字符分割后的图像。