模式识别车牌识别文档范本模板Word格式.docx
- 文档编号:17363623
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:1.31MB
模式识别车牌识别文档范本模板Word格式.docx
《模式识别车牌识别文档范本模板Word格式.docx》由会员分享,可在线阅读,更多相关《模式识别车牌识别文档范本模板Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
除了图像图像学方面的技术,另一个主要的技术就是字符切割与识别技术。
这其中需要用到模式识别课程上的分类思想和知识.我们参考了相关文献,虽然没有将一些比较好的想法全部实现,但是开阔了思路,在以后的工作和学习中遇到相关问题的时候,对问题的处理有一定的帮助。
3基本原理与设计思路
汽车牌照识别主要可以分为4个步骤:
首先是汽车图像获取,然后是汽车牌照区域的确定,然后是对车牌区域的处理与字符分割,最后是对分割出来的字符进行识别。
大致流程图如图1所示.
否
是
否
图1汽车牌照识别的流程概要
从图1中可以看出,在本次试验要求下,系统的关键组成部分有:
(1)汽车牌照区域的确定;
(2)汽车牌照字符的切割;
(3)切割后字符的识别这三部分。
下面是我们对每一重要组成部分的理解。
首先是汽车牌照区域的确定。
我们自行拍摄的照片如图2所示。
图2自行拍摄的用于试验设计的照片
从这个图片上,很容易想到车牌区域的确定可以按照颜色进行.因此一开始我们想到的方法是,获取一张图片之后,从上往下进行扫描,当某一行的蓝色像素点的个数大于某个阈值之后,那么这部分就可能是车牌区域。
扫描过程中,找出蓝色像素数量最大的一行,然后从这一行分别向上、向下扫描,不管向上还是向下扫描,如果蓝色像素的数量小于某一阈值就停止扫描,这就分别确定了车牌区域的上下边界。
然后用同样的方法左右扫描,这样就可以找到左右边界,左右边界确定以后,就可以圈定车牌所属的区域了。
但是这种方法对于光照条件较好、没有发生偏色,并且少有蓝色背景干扰的情况下比较有效,如果有蓝色干扰背景,或者车牌区域有偏色的情况下,就不是很理想。
例如,对于老师给的如图3所示的照片,这种简单的统计像素点就没有效果。
图3老师提供的汽车图片
因此,我们继续观察图片,在颜色统计的方法上提出了两种改进方式:
第一种方式是统计蓝色像素点之后,再统计同一行(列)上的白色像素点个数,如果这一行(列)上的白色像素点也达到一个阈值,那么说明这个区域可能是车牌区域.第二种方式是,发现照片中汽车会有周围的环境有将强的差别,而蓝色的干扰区域一般是出现在图片的上、左、右三个方位,因此在扫描的时候,可以不从照片最上面和最左边开始扫描,而是选定某一个地方,这个地方的背景干扰不多,而且不至于把汽车的牌照截出去。
我们认为这里其实可以用某些边缘提取或者是物体形态学的相关方法来实现,但是最终没有实现好。
其次是汽车牌照字符的切割。
在设计初期,我们先手动截取了车牌区域的图片进行分析。
如图4所示.
图4汽车牌照的区域
我们分析了这张图片的特点,发现汽车牌照区域的图片结构相对简单,颜色构成不复杂,因此可以按照图5所示的步骤进行操作。
图5汽车牌照字符分割的主要步骤
灰度化利用matlab提供的函数rgb2gray(图片)即可,灰度化之后,图像就变成了一个二维矩阵,这样信息量大大减少,不必要的信息变少,留下的都是车牌识别中需要关心的主要信息。
像图4中所示的图片,灰度化之后也很难进行处理,因此需要进行倾斜校正。
倾斜校正的时候利用matlab提供的radon(图片,range);
进行,先求一个倾斜角,然后按照倾斜角进行旋转。
然后为了进一步压缩图像的不必要信息,需要对车牌照片进行二值化,也就是将照片中灰度级大于某个阈值的的所有点都置成255,小于某个阈值的所有点都置成1,这样,图片中就只有两种点:
纯白和纯黑,这样就可以抓住主要特征进行分析了。
但是在进行二值化处理的时候,遇到了一个问题,就是老师给的照片提出出车牌区域之后,二值化的结果是全黑的。
因为我们当时设置的阈值是125,而老师提供的照片光照强度比较暗,因此就导致车牌字符所在的区域的像素值也较低,因此将这一部分也变成了黑色.这个问题可以通过matlab提供的函数
level=graythresh(tempLicence);
tempLicence=im2bw(tempLicence,level);
进行处理,第一个函数graythresh的含义是,matlab会通过对图片进行分析,找一个合适的阈值,这个阈值能将图片灰度值相对较高和相对较低的点区分开来,避免了全黑或者全白的情况。
得到了如图6所示的二值化图片之后,我们对其进行了分析.
图6经过处理后的车牌图像
拿到这幅图像之后的下一个要解决的问题就是将其分割成七个小部分,每个小部分对应的是一个汉字、字母或者数字。
在这么做之前,首先要对图片进行分析,发现图片的中央区域是有用的信息,而周围的点都是干扰,应该将它们截取掉。
我们将这个图片向Y方向和X方向进行投影,得到了图7、图8所示的两幅图像。
图7二值图Y轴方向的投影
通过对图7进行分析,我们发现,图片上、下两部分的干扰与车牌之间在投影之后有很大的差别,很明显,它们之间有着明显的断层。
我们可以利用它们之间的断层,对车牌的上下干扰部分进行裁剪。
我们采用的方法是:
首先找到图像的中央,然后从中央向两端分别扫描,每一个方向如果遇到第一个值小于阈值,并且下一个值也小于阈值的时候,就认定找到了字符与边框干扰的边界,记下这个值,进行切割就可以去除上下边框。
a)切除上下边框之前的投影b)切除上下边框之后的投影
图9二值图向X轴方向的投影
然后对图9进行分析,我们发现向X轴方向的投影特征不如Y轴那么明显,干扰部分也出现了与车牌区域很相似的波峰,而且字符与字符之间也存在着间隔,因此不能像切除上下边框那样切除左右边框。
后来我们想,索性不切除左右边框,反正只要我能把字符切割出来就行,左右边框可以丢弃,只要不切到它们,它们就不会像上下边框那样对识别造成影响。
我们发现,车牌的圆点是一个可利用的特征。
它出现在第三或者第四个位置,而且它的值明显小于左右两个字符的值,因此只要找到圆点的位置,就可以以它为参照,向前、向后分别找到其他的字符了。
确定圆点的步骤如下页图10所示。
在图10中,我们的思路是先将二值图片向X轴方向的投影从左之右进行遍历,找出其中所有的值小于阈值的点(我们手动设为1,即如果这个方向上投影的黑点个数为零,那么就判定这个地方出现了中断),这个点就是出现了字符中断的区域。
在遍历的时候,为了防止把一些汉字间的中断切掉,我们改进了方法,只有这个点的值小于阈值,而且它前面或者后面一个点的值大于阈值,才可以判定它是一个中断坐标。
把这些区域的坐标标注出来之后,将这些坐标两两组成一对,每一对对应的就是一个有字符的区域。
然后就对这些区域的宽度相加求和,求出来之后,从前往后找到第一个宽度大于平均值的点,那么这个地方要么是边框干扰,要么是汉字,就从这个区域往后继续遍历,找到的第一个宽度小于平均值的区域,这个区域必然是圆点区域。
找出圆点区域之后,往前两个区域就是汉字区域,往前一个就是第一个字母,然后相应地后面的字母或者数字也就能确定出来了。
这样做可以解决大多数经过准确定位之后的车牌切割问题,但是抗干扰性不高。
因为有些车牌本身不干净,在车牌上也分布着一些干扰因素,这样就无法正常提取了。
做完车牌切割这一重要工作之后,就可以生成七个小图片,每个图片保存一个字符,将它们存储到本地文件夹下,分别命名为1。
jpg至7.jpg。
在保存的时候,需要预先将它们的尺寸按照模板的比例进行调整,本设计
用的是网上找的模板,这些模板的尺寸是14*22,因此在存储的时候,调用matlab的imresize(char2,[22,14])方法保存切割后的图像.
是
否
图10找出圆点区域的过程流程图
最后是进行匹配识别
经过我们的观察,我们发现裁剪生成以后的字符的图像如图11所示。
图11裁剪后的字符图像
我们感觉这些图像比较规整,在与模板匹配的时候可以采用距离算法。
首先我们从最简单的求差开始.
首先读入待识别的字符对应的图片,然后将这个图片与所有的模板做差(为了尽量减少计算量,可以对不同的位置采用不同的方法,例如第一位一定是汉字,因此就不与除汉字意外的其他字符进行比较)。
做差后得到一个矩阵,对这个矩阵进行统计,首先定义一个变量,用于存储模板与待识别字之间的距离,对这个矩阵中的值进行统计,凡是非0的点,包括1或者—1,都将总的距离加一。
最后,对于这个待识别的字,找出与它的距离最小的模板的编号,根据这个编号得到相应的字符。
也可以采用欧式距离,过程与上面类似,不过算的是每个模板到这个待识别的字符的欧式距离,然后进行比较。
这种直接求距离的方式,优点是简单,因此我们在此选择基于距离的模板匹配进行识别。
但是这种方式的劣势也是很明显的,那就是抗干扰性太差,如果字体有倾斜,或者提取后的字迹不清晰,那么很容易识别出错。
至此我们的时间不够改进成别的方式,暂时采用这种方式,但是我们调查了其他的方式,以及别人解决前面几个步骤时做的较好的工作,在第六部分,分析与总结中进行记录与总结,以便扩展思维和以后进行改进.
总体上说,经过上述几个步骤,就可以对于给出的实景汽车照片进行识别了。
4实现
4。
1用户界面设计
开始时,我们对Matlab的了解很少,因此就将每个部分单独实现,没有统一的界面。
直到最近,我们了解了一下matlab界面设计,用figure命令打开一个控制面板,就可以像java的NetBeans或者VC++那样通过拖控件设计界面了.
因此,我们设计了程序的界面,如图12所示.界面中包含了课程设计所要求的一切步骤的显示界面与互动操作接口,可以很方便地实现动态交互。
界面各部分的功能在界面上都有标注,在此就不详细描述。
图12汽车牌照识别程序界面
4.2车牌区域定位
该部分采用的是根据颜色定位的方法。
该部分功能的实现在mainFrame中的functionpushbutton2_Callback(hObject,eventdata,handles)函数下实现。
首先定义四个变量,分别为Yup、Ydown、Xleft、Xright,分别用于存储车牌区域的四个边界。
在获得图片之后,首先从上向下扫描图片,扫描图片的时候,蓝色像素点的判断为:
if((blueWhiteImage(i,j,1)〈=55)&&
((blueWhiteImage(i,j,2)〈=100)&
&(blueWhiteImage(i,j,2)〉=46))&&((blueWhiteImage(i,j,3)<
=210)&&
(blueWhiteImage(i,j,3)〉=75)))
这几个数值在实际开发中我们进行了不断的调整,这种方式的弊端也愈发明显:
对于不同的照片,判断某像素是否是蓝色像素的时候,需要调整这些点。
这样就非常费时,而且通用性不强.因此基于颜色的车牌识别是不太完善的方法。
而且如果车牌的颜色本来就不是蓝色的,那么就难以识别。
即使向前面所述的,又加上白色像素点的统计,也依然不能解决这个问题。
我们了解了其他的方式,在后面记录下来,以供以后使用。
总之,在这次设计中,我们暂时采用基于颜色的定位方式.
最终,如果照片光照、色彩比较正常,那么会按照要求在照片中将车牌区域用红色框框起来,并且将图片切割下来,存放在界面的左下方的子框中,如图13所示。
图13圈定车牌区域
4.3车牌字符分割实现以及字符识别
车牌字符分割的办法在上一部分已经详细讲述,这一部分就不再赘述。
在最终程序的展现中,这一部分是与车牌识别和在一起的,字符分割和车牌识别都在点击识别车牌按钮之后进行,相应的代码也写在了一起。
其实这种编码习惯非常不好,我之前经常用Java写程序,编码最忌讳的就是太多的功能集中在一起。
在后续改进中,可以将每个小步骤提成一个函数,便于修改、扩展和维护。
在识别的时候,将剪切好的字符的图片读入,然后二值化之后与每个模板进行对比,先识别汉字,在模板库中汉字是第46号到第66号,因此第一位只要与这些模板进行对比就可以,之后将后面的与第0号到第35号进行比对.由于比对的结果是通过switch将字符存在一个数组中,因此最后用set(handles.edit6,'
string’,matchResult
(2))(matchResult
(2)是存放待显示识别结果字符的数组元素)显示字母的时候,会将字母对应的ASIC码显示出来,因此在显示之前加一个判断,如果其值<
10则直接显示,否则用char(matchResult
(2))将其转化成字符后显示即可。
总之,点击识别车牌按钮之后,会将上述所有的处理进行完毕之后,应该可以得到最终的结果。
识别的效果如图14所示。
a)正确识别自己拍摄的照片b)正确识别老师提供的照片
图14最终识别完成后的结果显示
5测试
我们用自己拍的照片和老师拍提供的照片分别进行了测试,在编码过程中,主要是用自己拍的照片进行的测试(这些照片在作业文件夹中一并提交)。
经过测试,自己拍摄的照片,基本能识别,但是对于老师给的照片,大约三分之一能定位,识别率较低。
而且对于晚上拍的照片,基本不能识别。
用老师给的照片的识别情况为:
白天:
大约35张可以正确圈定车牌,但是很多不能把字符全部正确的识别出来,例如粤识别成苏、兰等,B识别成8等.
夜晚的暂时不能识别。
6分析总结
这次课程设计,总体来说实现效果不理想,原因是在设计中并没有采取优秀的算法,而是采用了比较简单的方法。
但是这次设计总体上增加了我们对于模式识别课程的认识,通过解决一个实际的问题,让我们熟悉了相关的思想,一些算法虽然没在设计中实现,但是却让我们对其了解,或许在以后的工作或学习中能够用上。
下面就设计中遇到的问题进行分析总结。
首先是车牌定位的问题。
我们采用的基于颜色的像素点统计定位法鲁棒性很差,容易受到环境影响.
然后是车牌分割的问题。
在车牌分割的时候,除了上面介绍的问题,有时会出现如图15所示的情况.在切除上下边框的时候,将下半部分也切掉了,分析其原因,通过向左的投影直方图可以发现,这时候粤字下半部分对应的几行的投影为零.图片字符下面部分的笔画明明连接着,但是不知道为什么会投影为零。
为了
a)裁剪边框把文字也裁掉b)此时对应的Y轴投影的直方图
图15去除边框的时候遇到的问题
通过分析,我们找边框的时候,是从中间向两边扫面,遇到小于阈值的点,就认为它是字符与非字符噪音的分界点.但是在图15b)中,在60到70之间的空间显然包括了车牌下半部分的文字部分,而真正的分解点应该是80稍微往前一点的地值区域。
目前我们想通过多次扫描,即先从后扫描,再从后向前扫描,再从中间扫描,如果三次扫描得到的两个边界点分别做差,如果它们的差值在一定范围内,就取它们的平均值,如果差值大于某个值,就采用其他手段,但是目前还在讨论中。
至于字符的匹配问题,前面已经讲述过.
对于如图16所示的夜晚的照片,我们的程序不能识别。
图16夜晚的照片
很显然,夜晚的时候,各种色彩很难分辨,用基于颜色的识别方式很难进行识别。
经过观察,我们认为车灯是一个很重要的噪声影响。
因此,我们计划首先将车灯部分去除掉,去除的方法一开始是将车牌灰度化,然后将亮度超过一个阈值的部分变成灰度为125的点,这样就得到了图17所示的结果。
这时候,车灯的明显干扰就已经不存在了,下一步可以利用基于边缘的提取方法将车牌提取出来,然后就可以按照后续的方法进行分割、识别了.我们没有采用基于边缘的提取方法,因此这个也就没有继续做下去。
下面记录一些我们了解的其他的解决方法,以供以后学习使用.
图17将车灯屏蔽掉之后的效果
基于边缘检测的车牌提取:
这种方法首先是进行灰度变换,它们认为彩色照片包含大量颜色信息,属于无用信息,因此首先进行灰度转换。
灰度转换之后,进行边缘提取,边缘是图像的重要特征,图像理解和分析的第一步往往就是边缘检测.目前,边缘检测已成为计算机视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。
车牌的一个重要特征就是在该区域存在大量的边缘信息,所以边缘检测对于我们进行车牌识别来说也是相当重要。
边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,如灰度值的突变、颜色的突变、纹理结构的突变等,同时边缘也是不同区域的分界处。
图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向灰度变化剧烈。
由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就利用这个特点,通过计算图像中像素的梯度值来确定边缘点。
常用的图像边缘提取算子有Roberts算子、sobel算子、Prewitt算子、Laplacian算子等,它们的模板分别如下:
(1)Roberts梯度算子:
(2)Sobel算子:
(3)Prewitc算子:
(4)Laplacian算子:
BP神经网络进行的车牌识别
本次设计的一个遗憾的地方就是没能应用神经网络的知识。
在设计的时候甚至现在,对于神经网络都掌握得不是特别深刻。
优化的BP神经网络结构可以根据环境的差异动态调整,进行识别,其特殊条件下的识别率较高,例如这种方法对于车牌面积较小的情况有着非常好的识别效果。
我们了解的BP网络进行车牌识别的过程,基本包括两个阶段,一个是学习阶段,一个是识别阶段。
在学习阶段,一般都会接受大量的学习样本,计算实际输出与期望输出的误差之后,根据误差调整输出层和隐层的连接权值,正向传播、反向传播反复进行,直到误差达到理想的效果。
识别的阶段其实就是利用学习的方法将某些权值、阈值调整到最好的状态。
然后训练好了之后,再放一个车牌进来,就可以根据学习的效果进行较为准确的学习了.这一部分我们仍然不是很熟练,需要仔细学习神经网络相关知识以后才能继续进行。
我们的设计总体上能够完整地走完汽车牌照识别所需要的几个重要步骤,缺点是对于优秀的算法的运用不足,导致识别率不太理想.但是通过这次设计,我们也有很多收获,比如可以熟练地用Matlab进行一些图像处理,对于图像的基本操作有了一定的了解,我们真实地感受到图像其实就是矩阵.此外,我们还通过这次设计了解了一些优秀思想,虽然没有将它们真正应用进来,但是我们知道了遇到相关问题时该怎么去着手解决。
其实刚开始做设计的时候,都不知道该怎么入手,不知道怎么写matlab程序,现在都有所改观,而且也知道了模式识别课上讲的常用分类思想的用处等。
在后续的学习中,我们会利用学到的知识和培养的思路解决实际中的问题,并且将这些知识与各自的研究方向结合起来,例如,通过这次车牌识别设计,我发现需要做很多对图像的处理操作,而这些操作的实质是矩阵运算,这些运算是否可以提取出来放到GPU上进行运算以提高运算速度,若要提取,该采用什么样的调度算法等等。
最后感谢老师授课所付出的辛勤劳动,虽然有时候跟不上老师讲课的节奏,但是还是受益匪浅,使我们建立了基本的模式识别与机器学习的一些概念。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模式识别 车牌 识别 文档 范本 模板