数字图像处理课程设计:基于MATLAB的车牌识别系统设计与实现

您所在的位置:网站首页 大数据识别图片原理 数字图像处理课程设计:基于MATLAB的车牌识别系统设计与实现

数字图像处理课程设计:基于MATLAB的车牌识别系统设计与实现

2024-07-02 16:04| 来源: 网络整理| 查看: 265

基于MATLAB的车牌识别系统设计与实现 一、课程设计任务

在交通管理过程中,通常采用视频监控方式对闯红灯和超速等违章车辆进行监督。对违章车辆,需要自动检测车牌信息,提取车牌号码,以便查找车主信息和监督管理。国内常用的一般车牌通常是是蓝底白字,长宽比3:1。 1、对车牌图像进行预处理,然后进行车牌定位; 2、进行字符分割; 2、对车牌中的数字、字母和汉字进行提取和识别; 3、要求自行设计方案、编写代码实现上述功能,并设计车牌识别的软件界面。

二、课程设计原理及设计方案 2.1 系统简述

一个完整的车牌识别系统闭应包括车辆检测、图像采集、图像预处理、车牌定位、字符分割、字符识别等单元。当车辆到达触发图像采集单元时,系统采集当前的视频图像。车辆识别单元对图像进行处理,定位出牌照位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。车牌识别系统原理如图1所示。 在这里插入图片描述 图1 车牌识别系统原理 (1)图像预处理:对汽车图像进行图像转换、图像增强和边缘检测等。 (2)车牌定位:从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。 (3)字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像。 (4)字符识别:对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。 为了用于牌照的分割和牌照字符的识别,原始图像应具有适当的亮度,较大的对比度和清晰可辩的牌照图像。但由于该系统的摄像部分工作于开放的户外环境,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的距离和角度以及车辆行驶速度等因素的影响,牌照图像可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图像进行识别前的预处理。 牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图像预处理后的原始灰度图像中确定牌照的具体位置,并将包含牌照字符的一块子图像从整个图像中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。 由于拍摄时的光照条件、牌照的整洁程度的影响,和摄像机的焦距调整、镜头的光学畸变所产生的噪声都会不同程度地造成牌照字符的边界模糊、细节不清、笔划断开或粗细不均,加上牌照上的污斑等缺陷,致使字符提取困难,进而影响字符识别的准确性。因此,需要对字符在识别之前再进行一次针对性的处理。 车牌识别的最终目的就是对车牌上的文字进行识别。识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。

2.2 图像预处理

图像预处理流程图如下图2所示。 在这里插入图片描述 图2 预处理及边缘提取流程图

2.2.1 灰度变换

输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时。常将彩色图像转换为灰度图像,以加快处理速度。可对图像进行灰度化处理、提取背景图像、增强处理、图像二值化,边缘检测、滤波等处理。然后采用robert算子进行边缘检测,再用imopen和imclose对所得二值图像作开、闭操作进行滤波。 彩色图像分为R、G、B三个分量,分别显示出红、绿、蓝等各种颜色,灰度化就是使彩色的R、G、B分量相等的过程。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素值最小为0,是黑色)。 图像灰度化的算法主要有以下3种: 1)最大值法:使转化后R、G、B的值等于转化前3个值中最大的一个,即:R=G=B=max(R,G,B),这种方法转换的灰度图亮度很高。 2)平均值法:使转化后R、G、B的值为转化前R、G、B的平均值 R=G=B=(R+G+B)/3 这种方法产生的灰度图像比较柔和。 在这里插入图片描述

2.2.2 边缘提取

数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础。边缘是图像的重要特征,图像理解和分析的第一步往往就是边缘检测。目前,边缘检测已成为计算机视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。车牌的一个重要特征就是在该区域存在大量的边缘信息,所以边缘检测对于我们进行车牌识别来说也是相当重要的。 边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,如灰度值的突变、颜色的突变、纹理结构的突变等,同时边缘也是不同区域的分界处。图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向灰度变化剧烈。由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就利用这个特点,通过计算图像中像素的梯度值来确定边缘点。 常用的图像边缘提取算子有Roberts算子、sobel算子、Prewitt算子、Laplacian算子等,它们的模板分别如下: 在这里插入图片描述

2.2.3 车牌定位

自然环境下,汽车图像背景复杂,光照不均匀,在自然背景中准确地确定牌照区域是整个图像识别过程中的关键。首先对采集到的图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳区域作为牌照区域。将其从图像中分割嘲出来,同时要考虑车牌倾斜问题。算法流程如下: (1)对二值图像进行区域提取。计算并比较区域特征参数,提取车牌区域。进行闭运算,可使得水平相邻的边缘连接成为连通区域;进行开运算可使得车牌区域与其它背景区域分开,成为独立的连通域。 (2)计算包含所标记区域的最小宽和高。并根据先前知识,提取并显示更接近的车牌二子值图。 (3)通过计算车牌旋转角度解决车牌倾斜问题。由于车牌倾斜导致投影效果峰谷不明显,需车牌矫正处理,采取线性拟合方法,计算出车牌上边或下边图像值为1的点拟合直线与水平X轴的夹角。

2.2.4 字符分割

完成牌照区域的定位后,再将牌照区域分割为单个字符,可采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值.并且该位置应满足牌照的字符书写格式、字符、尺寸限制等条件。利用垂直投影法实现复杂环境下汽车图像中的字符分割效果较好。 通过分析计算字符的水平投影和垂直投影,可获得车牌字符高度、字符顶行与尾行、字符宽度、每个字符的中心位置,以方便提取分割字符。然后计算车牌垂直投影,去掉车牌垂直边框,获取车牌及字符平均宽度。最后计算车牌每个字符的中心位置和最大字符宽度,提取分割字符,其算法流程如图3所示。 在这里插入图片描述 图3 车牌分割的MATLAB算法流程 此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。算法如下: 在这里插入图片描述

2.2.5 字符识别

字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。建立数字库对该方法在车牌识别过程中很重要,数字库准确才能保证检测出的数据正确。基于人工神经元网络的算法有两种,一种是先对特征提取待识别字符,然后用所获得的特征训练神经网络分配器;另一种是直接将待处理图像输入网络由网络自动实现特征提取直至识别结果。模板匹配实现简单,当字符较规整时,对字符图像的缺损、污迹干扰适应力强且识别率高。因此,这里将模板匹配作为车牌字符识别的主要方法。 模板匹配是图像识别方法中最具代表性的基本方法之一,它是将从待识别的图像或图像区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图像归于相应的类。也可以计算图像与模板特征量之间的距离,用最小距离法判定所属类。然而,通常情况下用于匹配的图像各自的成像条件存在差异,产生较大的噪声干扰,或图像经预处理和规格化处理后,使得图像的灰度或像素点的位置发生改变。在实际设计模板的时候,是根据各区域形状固有的特点,突出各类似区域之间的差别,并将容易由处理过程引起的噪声和位移等因素都考虑进去,按照一些基于图像不变特性所设计的特征量来构建模板,就可以避免上述问题。字符识别流程图如下图4所示。 在这里插入图片描述 图4 字符识别流程

三、课程设计步骤和结果

1、获取图像

[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif', 'All Image Files';... '*.*', '所有文件' }, '选择图像文件', fullfile(pwd, 'images/京NM8T88.jpg')); if filename == 0 return; end % 文件名 file = fullfile(pathname, filename); % 图像矩阵 Img = imread(file); %激活第一个轴对象 axes(handles.axes1); imshow(Img, []); %激活第二个轴对象 axes(handles.axes2); imshow(Img, []); %保存为全局变量 handles.Img = Img; guidata(hObject, handles);

在这里插入图片描述 图5 获取原图像 2、图像灰度化

%对图像I进行灰度处理 I_gray=rgb2gray(Img); axes(handles.axes3); imshow(I_gray); title('灰度图像');

在这里插入图片描述 图6 灰度图像 3、边缘检测 图像中车辆牌照是具有比较显著特征的一块图像区域,这此特征表现在:近似水平的矩形区域;其中字符串都是按水平方向排列的;在整体图像中的位置较为固定。正是由于牌照图像的这些特点,再经过适当的图象变换,它在整幅中可以明显地呈现出其边缘。边缘提取是较经典的算法,此处边缘的提取采用的是Sobel算子。

%利用Sobel算子进行边缘检测 I_edge=edge(I_gray,'sobel'); axes(handles.axes4); imshow(I_edge) title('边缘检测后图像'); se=[1;1;1];

在这里插入图片描述 图7 边缘检测后的图像 4、进行腐蚀操作

%对边缘图像进行腐蚀 I_erode=imerode(I_edge,se); axes(handles.axes5); imshow(I_erode); title('腐蚀后边缘图像'); se=strel('rectangle',[25,25]);

在这里插入图片描述 图8 腐蚀后的图像 5、填充图像

%填充图像 I_close=imclose(I_erode,se); axes(handles.axes6); imshow(I_close) title('填充后图像');

在这里插入图片描述 图9 填充后的图像 6、进行形态滤波

%去除聚团灰度值小于1500的部分 I_final=bwareaopen(I_close,1500); axes(handles.axes7); imshow(I_final); title('形态滤波后图像');

在这里插入图片描述 图10 形态滤波后的图像 7、车牌提取 通过比较累计行像素灰度值和列像素灰度值确定车牌的真实位置,由上述方法分割出来的车牌图像中存在目标物体、背景还有噪声,要想从图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群,即对图像二值化。然后通过行像素点的累计值去除顶端和底端不感兴趣的地方。

I_new=zeros(size(I_final,1),size(I_final,2)); location_of_1=[]; %寻找二值图像中白的点的位置 for i=1:size(I_final,1) for j=1:size(I_final,2) if I_final(i,j)==1; newlocation=[i,j]; location_of_1=[location_of_1;newlocation]; end end end mini=inf;maxi=0; %寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 for i=1:size(location_of_1,1) temp=location_of_1(i,1)+location_of_1(i,2); if tempmaxi maxi=temp; b=i; end end %和最小的点为车牌的左上角 first_point=location_of_1(a,:); %和最大的点为车牌的右下角 last_point=location_of_1(b,:); %坐标值修正 x1=first_point(1)+10; x2=last_point(1)-4; y1=first_point(2)+10; y2=last_point(2)-4; I_plate=Img(x1:x2,y1:y2); g_max=double(max(max(I_plate))); g_min=double(min(min(I_plate))); % T为二值化的阈值 T=round(g_max-(g_max-g_min)/3); I_plate =im2bw (I_plate,T/256); I_plate=bwareaopen(I_plate,20); I_plate(: ,y2)=0; axes(handles.axes8); I_plate=bwareaopen(I_plate,100); %画出最终车牌 imshow(I_plate) title('车牌提取')

在这里插入图片描述 图11 车牌提取图像 8、车牌字符分割 字符分割的算法很多,因为车牌字符间间隔较大,通常不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割

%用来存放水平分割线的横坐标 X=[]; z=0; flag=0; for j=1:size(I_plate,2) sum_y=sum(I_plate(:,j)); %列和有变化时,记录下此列 if logical(sum_y)~=flag if(j-z>10) X=[X j]; flag=logical(sum_y); %用z记录上一个j的值,防止两个列坐标间隔太小 z=j; end end end for n=1:7 %进行粗分割 char=I_plate(:,X(2*n-1):X(2*n)-1); %这两个for循环对分割字符的上下进行裁剪 for i=1:size(char,1) if sum(char(i,:))~=0 top=i; break end end for i=1:size(char,1) if sum(char(size(char,1)-i,:))~=0 bottom=size(char,1)-i; break end end char=char(top:bottom,:); %归一化为40*20的大小,以便模板匹配 char=imresize(char,[40,20],'nearest'); segchar(n,:,:)=char(:,:); %将分割的字符放入Char_i中 eval(strcat('Char_',num2str(n),'=char;')); end

在这里插入图片描述 图12 车牌字符分割结果 9、车牌识别 此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约30多个,大写英文字母26个,数字10个。 首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的非0值越少那么就越匹配。把每一幅相减后的图的非0值个数保存,即为识别出来的结果。

store1=strcat('贵','豫','粤','湘','鄂','皖','鲁','藏','京','苏','黑','吉','冀','晋','辽','浙','津','闽','云','陕','琼'); %创建汉字识别模板库 for j=1:21 Im=Char_1; Template=imread(strcat('车牌汉字库\',num2str(j),'.jpg')); Template=im2bw(Template); Differ=Im-Template; Compare(j)=sum(sum(abs(Differ))); end index=find(Compare==(min(Compare))); char=[char store1(index)]; store2=strcat('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'); %创建字母与数字识别模板库 for i=2:7 for j=1:34 Im=eval(strcat('Char_',num2str(i))); Template=imread(strcat('车牌字符库\',num2str(j),'.jpg')); Template=im2bw(Template); Differ=Im-Template; Compare(j)=sum(sum(abs(Differ))); end index=find(Compare==(min(Compare))); char=[char store2(index)]; end set(handles.edit1, 'string', strcat('车牌为:',char), 'FontWeight', 'Bold', 'FontSize', 12, 'ForegroundColor', [1 0 0]);

在这里插入图片描述 图13 输出识别结果 10、设计GUI界面 界面设计如下图所示。 在这里插入图片描述 图14 GUI界面 界面可显示车辆的原始图像,灰度图像,边缘检测后的图像,腐蚀处理后的图像,填充后的图像,形态滤波后的图像,车牌提取结果和车牌字符分割后的结果以及车牌的识别结果。导入图片按钮可在文件夹中选择要处理的图片,然后按下运行按钮,开始处理,按下识别率后,会对所有图片及进行识别并得出在大量识别结果情况下的识别率,点击退出按钮将退出此系统。

四、课程设计总结

本文主要解决了以下问题:1、在背景的图像中如何定位牌照;2、将定位的牌照区域中的字符分割;3、对分割下来的牌照字符提取具有分类能力的特征,并对汉字、字母及数字均进行识别。在车辆牌照字符识别系统的研究领域,近几年出现了许多切实可行的识别技术和方法,从这些新技术和方法中可以看到:单一的预处理和识别技术都无法达到理想的结果,多种方法的有机结合才能使系统有效识别能力提高。在本系统的设计时,也汲取了以上一些算法的思想,结合实际,反复比较,综合分析。 根据车牌特点,一般采用的车牌定位算法有:1、边缘检测定位算法;2、利用哈夫变换进行车牌定位;3、色彩分割提取车牌等。这里我们采用的是边缘检测的方法实现定位的。 字符分割的方法也有多种:1、基于聚类分析的字符分割;2、投影分割的方法;3、基于模板匹配的字符分割等。最常用的是投影分割,主要是针对在车牌定位,图像预处理后比较规则的车牌图像。优点是程序逻辑设计简单,循环执行功能单一,便于设计和操作,程序执行时间短。 字符识别的基本方法通常有三类:1、结构特征分析方法;2、模板匹配法;3、神经网络法。此处采用的是模板匹配的方法,即是将要识别的字符与事先构造好的模板进行比对,根据与模板的相似度的大小来确定最终的识别结果。 但是系统本身还存在许多不足,距离具体实用的要求仍有很大差距,但我却在这次课程设计中学到了很多知识。

五、设计体会

本设计虽然实现了车牌识别,但是近几年车牌识别课题属于很传统的课题了,网上可供参考的例子很多,但大多数的识别结果并不是很好。作为一个数字图像这门课的大作业,在参考了网上相关项目的设计思路后,我们小组在此基础上进行对于函数参数以及设计算法的修改,使得最终对于图片库中的车牌照片的识别率达到了75%以上。通过此次大作业课程设计,从中我们体会了数字图像处理这门课所涉及的知识点是很广的,是一门大学问,除了我们学习过程中学习到的相关处理方法和算法,还有更多未在课上介绍的精妙方法。这需要我们不断的学习新知识,提升自身创新能力。

参考文献 [1] 宋建才.汽车牌照识别技术研究[J].工业控制计算机,2004,44~45. [2] 韩勇强、李世祥.汽车牌照子图像的定位算法[M].微型电脑运用,1999.60~65. [3] 王枚、王国宏.基于伴生与互补颜色特征的车牌字符分割技术[J].山东大学学报,2007。第37卷 [4] 贺兴华、周媛媛、王继阳等.MATLAB 图像处理[M].人民邮电出版社,2006.96~100. [5] 龚声蓉、刘纯平、王强. 数字图象处理与分析[M]. 清华出版社 ,2006.24~29. [6]刘阳,伊铁源等.数字图象处理应用于车辆牌照的识别.辽宁大学学报.2004,65~68. [7] 张兴会, 刘玲, 杜升之.车牌照定位及倾斜校正方法研究[J].系统工程与电子技术, 2004, 26(2): 237~239. [8] 叶晨洲,杨杰,宣国荣.车辆牌照字符识别[J].上海交通大学学报,2000,5(34): 672~675.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3