摘 要
在现在这个社会发展中识别车牌的这个阶段中,其中最集中和有效的内容是车牌图像分割字符技术和车牌图像提取技术。在本论文中具体的说明了一种二值化分析识别车牌的算法介绍。在设计中是在内存为64M大小,其平台是matlab,从把具体图像放进去到再到识别车牌图像,其反应的平均时间是0.8秒左右,这就很充分地说明了该方法的可执行性。智能交通系统中较为重要的成分之一是车牌识别,它可以在相应的图像中把其中的车牌进行分析然后提取出来,然后将字符图像进行自动分割,然后来识别字符。在国外的一些国家因为很早就发展了收费停车场与高速公路,所以他们在很早之前就具备了图像提取的自动系统。可是车牌的识别系统往往是将车牌所处于的特定环境和特定要求来作为导向,然后因为不同的国家都有着不同的车牌样式,所有不同国家的车牌都有不同的排版格局。
关键词:车牌识别;图像提取;分割技术 ,matlab;
Abstract
In this stage of license plate recognition in the current social development, the most concentrated and effective content is license plate image segmentation character technology and license plate image extraction technology. In this paper, a binary analysis algorithm for license plate recognition is described in detail. In the design, the size of memory is 64M, and the environment is Pentium. From putting the specific image in to recognizing the license plate image, the average reaction time is about 0.8 seconds, which fully illustrates the feasibility of the method. License plate recognition is one of the most important components in ITS. It can analyze and extract the license plate in the corresponding image, then segment the character image automatically, and then recognize the character. Because of the early development of toll parking and highway in some foreign countries, they had an automatic image extraction system long ago. However, the license plate recognition system is often guided by the specific environment and requirements of the license plate, and then because different countries have different license plate styles, all countries have different license plate layout patterns.
Key words: license plate recognition; image extraction; matlab;
一绪论
车牌识别指的是能够检测到受监控路面上的车辆然后提取出其车辆的牌照信息进行分割字符然后处理其中的信息的图像处理技术。现代交通中很重要的一部分就是识别车牌信息,它的应用在很广泛的地方。它是基于数字图像处理和模式识别、计算机视觉这些技术的综合性技术,它是根据其摄像头的拍到的照片中找到车牌内容,然后从图片中进行识别和分析。把这个技术应用在不同的场景中,它可以进行以下功能的实现,比如停车场收费管理,交通流量控制指标测量,车辆定位以及汽车防盗等不同领域相同技术的应用。这个技术对于维护交通和管理交通都有着很重要的意义。在分析车牌的过程中,车牌图像的提取和分割是不可缺少的流程。
对车牌识别技术而言可以依次分为不同车辆的车牌图拍摄、车牌图像的准备处理、车牌定位字符分割和识别五大部分。车牌识别技术主要体现在后面四部分。先是要预处理采集到的车牌照,但是因为车牌定位决定了后面需要进行的车牌字符的识别,所以车牌定位是车牌识别技术的重中之重,车牌定位简而言之就是在一整张图找到属于车牌的的那一部分图。对车牌定位后然后进行车牌图像的提取和分割,这样才可以进行后续的一系列工作。车牌的分割是车牌分析的主要部分。其中车牌的定位精度室由图像预处理的深度来决定的。所以图像预处理与牌照定位、图像分割是重中之重。
由于车辆牌照相对于车辆本身以及周围环境,具有其独有的特征,所以在车牌的定位过程中,一般采取的办法是是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。针对车辆牌照的特征,首先将图片进行灰度转换,通过对灰度图像进行二值化、边缘检测等处理获得较理想的供定位图像,然后对该图像进行垂直和水平方向的闭运算,结合车辆牌照特点,进行颜色识别,对车辆牌照进行定位。然后通过边缘检测技术,分割出定位的车辆牌照区域。
二车牌定位介绍
3.1几种车牌定位方法简析
车牌的定位简单来说为了达到识别的目的,从生活中通过拍照或者摄像得到的包含车辆信息和干扰信息的图片中,通过科学的算法和流程准确的滤除一切干扰信息,准确的找出需要的车牌信息并通过算法提取出来。从大的意义来归属的话,车牌定位也属于图像分割中的一种应用。而图像分割在图像处理整个大的理论框架中占有的比重还是很大的,且在计算机视觉领域中也占很重要的研究地位。
在一个完整的车牌识别系统中间,车牌定位基本上是在得到图像源之后的第一个步骤,定位的准确与否对后续的工作的影响非常的大,对最后能不能得到理想的结果起着决定性的作用。虽然现在有很多实现的方法,但是图像定位一直是车牌识别系统研究中的传统困难点所在。车牌图像的定位发展到现阶段,已经有很多典型的定位算法,比如:根据图像边缘检测的定位算法、根据图像色彩分割的定位算法,根据小波变换算法应用的定位算法,根据数学形态算法的定位算法,以及根据车牌区域纹理特点的定位算法等等。对以往的算法经过归纳总结可以直接分为两个方面的定位方法。分别是根据灰度图像来进行车牌定位方法和根据彩色图像直接定位的方法。
3.1.1基于纹理特征分析的定位方法
在以往的纹理特征分析定位算法基本上都是利用灰度图像来分析的,所以在对车牌进行提取分析之前要将彩色的图像转换为灰度图像。采用纹理特征分析的定位方法首先进行行扫描,找出图像中每一行所含有的车牌线段,记录下它们的起始坐标和长度。如果有连续若干行均存在不少于一个的车牌线段,且行数大于某一确定的阈值,则认为在行的方向上找到了车牌一个候选区域,并确定了该候选区域的起始行和高度。在已找到的可能存在车牌的区域做列扫描,以确定该车牌候选区域的起始行和高度以及起始列坐标和长度。由此确定一个车牌区域。对一幅图像进行纹理特点的分析基本上都是针对已有的灰度图像来进行的。依据车牌纹理特点的定位方法首先需要对图像灰度化,将所得到的的彩色图像经过预处理变成灰度图像。然后在横向上进行扫描,通过车牌区域纹理特征的先验知识,找出扫描过程中每一行所含的车牌区域有用信息的那一段,并记录下有用信息开始和最后的位置。如果在这个过程中发现有连续出现的有用信息记录达到某一个阈值的时候,我们就认为找到了一个可能的车牌区域,并且根据之前记录的开始和最后的位置确定该候选区域的形状。接下来对该区域进行纵向的扫描,同样的方法来确定纵向的开始和最后的位置,从而确定出来候选区域的范围,由此来确定一个车牌区域。接下来继续对其它区域用此方法扫描,直到最后将图像扫描完成,找出所有的车牌区域图像。依据车牌纹理特点的车牌定位方法的工作流程如图 2-3 所示。
图 2-3 依据图像纹理特点定位过程
依据图像纹理特点的定位算法对噪声比较敏感,但对于图像中存在车牌图片出现倾斜,有阴影以及光照强弱不均的图片都能很好的处理得到车牌区域。如果图像很复杂,存在不同的且大量的干扰点时,需要结合纵向投影扫描来确定有用的信息区域,且效果会比较好。图 2-4 列出了存在大量噪声(图片中的树丛在预处理后)情况下不能得到较好的预处理效果,最终不能准确定位出需要的车牌图像。
图 2-4 基于纹理特征方法噪声敏感举例
3.1.2基于形态学梯度的车牌定位方法
梯度用于刻画目标边界或边缘位于图像灰度级剧烈变化的区域,形态学梯度根据膨胀或腐蚀与原图作差组合来实现增强结构元素领域中像素的强度,突出高亮区域的外围。最常用的形态学梯度是计算膨胀与腐蚀间的算术差,另外两种计算形态学梯度分别是膨胀结果与原图的算术差以及原图与腐蚀结果的算术差。依据形态学的定位方法的思路是首先构造一个具有形态学特点的构造体来搜索套用一幅图像,来试探是否能将这个构造体与图像中的现有像素点区域比较好的吻合,如果能够吻合则说明这些像素点集合可能是需要的车牌信息区域。当然,还需要对这个构造体搜索的过程必要性和正确性作一个检验,判断是否正确有效。形态学的基本运算包括:腐蚀、膨胀、开启、关闭。图 2-5 给出了依据形态学定位车牌的一个简单流程。
图 2-5 依据形态学定位过程
依据形态学的定位方法能够定位出大致的车牌区域,由于是通过先创建一个构造体再填充图像,所以不能准确的找出车牌的精确边界,只能找出车牌所在的区域,想要得到精确的车牌区域还需要加入其它的方法。
基于数学形态学的车牌区域定位方法不能精确地确定出车牌左右边界的位置,所以必须结合其他定位方法进行精确定位。
形态学定位车牌效果如图 2-6 所示。
(a) 原图 (b) 标记连通域
©形态学定位效果
图 2-6 依据形态学定位过程
上面介绍的都是单一的通过某一种方法的车牌定位算法,或多或少都存在一些问题,当给定的条件不能满足的时候这些方法就不能使用,需要结合其他方法来定位。比如国内的李波,曾致远,付祥胜提出的基于数学形态学和边缘特征的车牌定位方法[5],他们提出的方法先对图像进行前期处理,把彩色图像转换成灰度图像,接下来是滤波过程,使用的方法是依据纵向上对于区域像素块的腐蚀。腐蚀后车牌区域出现,但是会出现很小的孔,这些孔会影响识别,需要用闭合算法来填补空洞,把车牌区域连通,成为增强的车牌连通域。最后在使用上面提到的依据边缘特点来定位车牌。这种方法是两种方法的组合,有效的解决了独立算法的局限性,为最终车牌的识别打下了良好的基础。也从技术角度提高了算法的实用性,使识别的时间缩短。
3.1.3基于小波分析的定位方法
小波分析是一种应用于图像处理的重要分析工具,具有“显微镜”的特性。小波分析的多分辨率特性使得小波分解系数在不同方向的高频子波系数具有不同特性,因此利用方向小波能够反映出图像在不同分辨率上沿任一方向变化的情形[。小波分析的多尺度分解特性更加符合人类的视觉机制。小波变换理论是一种很重要的现在应用在图像处理方面的理论知识,以后小波变换在图像方面的应用会更加深入。小波变换的方法是把刚开始得到的资源信号经过一定的运算,比如平移和伸缩等,使之分解为这样的子带信号,这些子带信号分辨率在不同空间不同、频率不同、方向不同,而且这些信号在时间域也有很好的特性。通过把原始图像进过小波变换后,可以在频率域和时间域上对其具体的局部的细化分析。
小波变换理论能够多不同场景不同特点不同细节特征在不同的层次和方向上都能很好的完成,其中的分解参数分解后具有不同方向上的频率较高的子波特点都不相同,利用这个特点可以很好的分辨一幅图像中任何一个方向的变换关系。这种分析的过程和特点与人眼和大脑的分析过程很接近,更能体现图像识别的人类化视觉分析效果。现阶段小波变换分析理论已经应用在了很多图像处理方面,不过基本上都是结合其他的一些图像处理方法共同的处理图片,这样才能在时间,速度方面得到期待的结果。
下面列举一些应用小波变换理论与其它图像处理理论相结合使用来处理图像的一些国内应用的例子。结合小波变换分析与形态学理论的车牌图像的分割技术,这个方法是由广东工业大学的余英林和华南理工大学的戴青云共同研究得到的。他们提出的这种方法是使用小波变换特性将图片分解出低频和高频信息,这些信息小图不仅纹理清楚,而且分辨率不同,方向上也不同。接下来根据车牌文字区域上横向上具有低频特点,纵向上具有高频特点这个综合特征来把需要的信息小图抠出来。再对抠出来的细节图用形态学的理论方法通过一步一步的计算,消除没有用干扰信息,最后剩下来的就是有用的车牌信息了,这个就是他们两个人的研究算法步骤。山西大学的韩丽萍基于该方法也提出了一种小波变换和形态学相结合的车牌定位算法。她的这种方法首先使用小波的多方向多特征特性凸显出车牌以及车牌字符的边缘信息,再用形态学方法中的特定分析方法对之前得到的边缘特征图像进行运算,目的是尽量多的滤除干扰信息。最后根据车牌字符的颜色与字符底板的颜色差别来最终定位出所需要的车牌区域。余英林和戴青云提出的方法的优点是在干扰信息较小的情况下定位的精度和速度都很有优势,不好的地方就是需要的时间比较多,时间性不好,而且要是干扰信息很多的情况下没有想象中的预期效果。韩丽萍提出的这种方法解决了干扰点很多情况下定位效果下降的这个问题,同时也继承了上一种方法的精度和速度优势。使用韩丽萍提出的这种结合方法定位车牌图片仿真例子如图 2-6 所示。
(a)原图 (b)小波变换结合形态学定位结果图 2-6 小波变换与形态学结合定位例子
3.1.4基于彩色分割的车牌定位方法
传统的车牌分割方法主要应用了车牌的纹理特征和形状特征,一般情况下这二个特征对于多数情况足够了,但对于复杂背景就不够了,常借助于颜色特征来排除干扰,以提高车牌定位的准确率和成功率。
3.2 依据彩色图像进行车牌定位
现在从各种设备上获取的图片资源都是彩色图片,传统的做法是把彩色图片先转换成灰度图片,再使用基于灰度图像的处理方法来进行定位工作,这些方法经过长时间的积累慢慢的变得很成熟。但在车牌识别过程中,还需要考虑到具体的车牌特点来进行分析。在第一章我们对车牌的特点作了一定的列举和分析,考虑到车牌具有黑字黄底,白字黑底,还有最普通的白字蓝底。人眼可以分辨黑白图像,也可以分辨彩色图像,相对来说人眼对彩色图像的敏感度更高,能够直接处理彩色图像也接近人眼的识别过程。比如人能分辨的颜色信息有三万五千多种,而能分辨的灰度级只有二十多级。由此可知,处理彩色图像不仅有更多的信息资源可以使用,而且更符合人的视觉惯性。现在直接处理彩色图像的发展越来越快,使用彩色图像来进行后续的目标信息的抠取和分离使用的很普遍,而且彩色图像对于各种光强不一的情况也能容易的解决。
下面列举出一些直接使用彩色图像来进行车牌的定位的具体算法例子。上海交通大学的赵雪春,戚飞虎[9]共同研究提出了一种依据彩色图像的车牌定位算法。他们的这种方法使用几个层次的网络感知方法直接对彩色图像进行分离,再通过车牌纵向的投影特征选出可能的车牌字符区域。一般情况下对彩色图像的处理都是使用 RGB 分离特征,但在具体应用中 RGB 中两点的欧式距离与颜色的距离没有线性的比例关系。而在 HSV 模型下存在这种比例关系,能够对图像进行优化调整,便于处理。他们的算法中使用了分区域提取图像信息减少图像信息量来减少计算量,同时用对数方法调整饱和度来削弱获取图片时光强的影响。经过这样转换后再对 HSV 模型下的彩色图像进行神经网络分离处理,最后就是分离出车牌区域,使用的方法是根据先验知识,如底色、长宽比等,依据纵向投影特征选取。这种算法定位的准确率还是较高的,但算法过程中采用了神经网络方法,这种方法计算起来很用时间,会减慢最终的定位时间。
海军航空工程学院的王枚等[12]研究出了一种在HSV模型下基于融合的车牌定位算法。他们这种算法把车牌的字符和底板颜色特点,车牌的横向和纵向扫描特点充分的结合起来,能够快速的去除飞车牌区域的干扰边缘特点,快速的去除干扰的非车牌区域。这种基于融合的定位方法比使用单独的某种定位方法能够得到更好的效果,提高系统的稳定和可靠性。
以上提到的两种依据彩色图像来进行的车牌定位算法都能取得很好的效果,相对于单一的灰度处理方法具有很大的优势,只是在时间快速性方面没有那么大的优势。基于此如果能找到一种方法,在灰度域能先预处理图像,根据特征来去除一定的干扰边缘或者干扰区域,在彩色域根据具体的彩色特征再去除彩色域中存在的干扰边缘点还或者干扰区域,最后在灰度域来定位出目标车牌区域,这样既能保证速度,又能保证彩色图像优势的发挥,这种方法才是比较好的车牌定位方法。本文第三章使用的车牌定位算法就是在这个方面的努力和尝试。
三、初步设计方法与实施方案
14
3.3 本文车牌定位步骤
本文第二章分析了几种依据灰度图像处理的车牌定位方法并进行了仿真分析,介绍了几种国内依据彩色图像处理的车牌定位方法,并作了一定的分析。由分析可知,只使用灰度图像处理的车牌定位也可以定位出车牌,但是定位过程中损失了很多有用的彩色特征信息,处理起来就有局限性;只用彩色图像处理进行车牌定位能够定位出车牌图片,但是在时间要求上往往不能满足要求。所以结合灰度的和彩色的图像处理方法才能更好的满足快速性和准确性的要求。由此,本文使用了一种综合的算法,这个算法是结合前人优秀的算法并经过一定量的比较仿真实验才确定出来的算法。这个算法主要是依据车牌字符的边缘信息相较于其他区域特点明显,车牌字符和底板颜色对比明显,车牌底板与周围区域颜色对比明显这些特征来确定车牌区域,从而定位出车牌。这种算法既在灰度域处理车牌,又在彩色域通过彩色特征来处理信息,在时间和准确性方面都表现良好,具有较好的适用性。图 3-1 给出了本文算法的流程。
图 3-1 本文算法流程
3.4图像矫正
在进行光学扫描时,会因为客观原因,导致扫描的图像位置不正,影响后期的图像处理,因此需对图像进行图像矫正工作。图像倾斜矫正关键在于根据图像特征自动检测出图像倾斜方向和倾斜角度。目前常用的倾斜角度方法有:基于投影的方法、基于Hough变换、基于线性拟合,还有轮廓提取进行检测的方法。
3.5灰度处理
彩色图像包含着大量的颜色信息,不但在存储上开销很大,而且在处理上也会降低系统的执行速度。由于图像的每个象素都具有三个不同的颜色,存在许多与识别无关的信息,不便于进一步的识别工作,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。
3.6去除噪声
图像去噪是指减少数字图像中噪声的过程称为图像去噪。现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。噪声是图象干扰的重要原因。一幅图象在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。
3.7边缘检测
Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。首先,图像降噪。第二步,计算图像梯度,得到可能边缘。第三步,非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。第四步,双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
3.8二值化
一幅图像包含目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最经常使用的方法就是设定一个全局的阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。将大于T的像素群的像素值设定为白色(或者黑色),小于T的像素群的像素值设定为黑色(或者白色)。
比方:计算每个像素的(R+G+B)/3,假设>127,则设置该像素为白色,即R=G=B=255;否则设置为黑色,即R=G=B=0。
3.10开/闭运算
膨胀和腐蚀的主要用途:消除噪声;分割出独立的图像元素,在图像中连接相邻的元素;寻找图像中明显的极大值或极小值区;求出图像的梯度。
膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域;腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域。
1.开运算:先腐蚀后膨胀
作用:放大裂缝和低密度区域,消除小物体,在平滑较大物体的边界时,不改变其面积
2.闭运算:先膨胀后腐蚀
作用:排除小型黑洞,突触了比原图轮廓区域更暗的区域
3.形态学梯度:形态学梯度=膨胀图-腐蚀图
作用:保留图像边缘
3.11颜色识别
由于车牌的特征是蓝底白字,我们做颜色区分,从图片中找出蓝色区域。为了让计算机更好的识别主体颜色,要先将RGB色域转换为HSV色域,在HSV色域中,设置阈值为[100,50,50]至140,255,255。满足条件的颜色区域会被标记为白色(255)其余为黑色(0)。
3.12前/后景模型
关于车牌分割,我们用到了GrabCut算法,此算法需要我们定义两个参数,叫做前景模型和背景模型,它们是一个矩阵,行数最大是1,列数最大是65=13*5,一般都是选择最大。定义之后,我们把矩形框框坐标、前景、背景模型、已经蒙版都导入到GrabCut算法当中进行计算。
我们在计算完成之后,我们会得到一个新的蒙版,这个蒙版里面包含了0~3的4种数据,而我们按照上述的方法进行计算,算法会判断哪些可能是前景,哪些可能是背景。
以完成分割。
难点分析
1文件分辨率低,通常由于车牌较远,有时是由于低端相机导致的
2图像模糊,尤其是运动模糊;
3由于强光,反射或阴影造成的光照和对比度较差;
4车牌(部分)遮挡,通常是拖车杆或车牌上的污渍.
5算法难度较大
四、预期结果
完成小汽车牌照的图像提取与分割,打开一张图片之后,成功的进行图像预处理、车牌定位,车牌分割等步骤,最后成功提取出汽车牌照区域图片。以便于下一步的识别工作图像车牌识别关键就是要从图像中准确地定位出车牌的位置,并将车牌部分的图像分割出来。
五 实验过程分析
本文设计了一个简易的车牌识别识别系统,现介绍其车牌定位和分割部分。
在设计中我采用了颜色特征和形态特征相结合的方法对车牌进行定位。车牌区域有很丰富的特征信息,如颜色,不同性质的车牌会有不同的颜色,大多数普通的车牌就是字符为白色,背景为蓝色。
4.1车牌字符分割
4.1.1 车牌字符分割方法简述
为了辨认出车牌字符,必须先对车牌进行定位,然后从已经辨认出的车牌的图像中识别出字符。先对车牌定位可以对车牌中字符的整体位置进行确认,这样就缩小了对字符识别的区域,此后只需要在相对小的图像中识别出具体字符的区域,对此区域进行精准定位,得到每个字符的图像,最后将这些字符的信息作为输入数据,以最终识别出车牌信息。
4.1.1 .1直接分割方法
有很多种用于字符分割的方法,其中直接分割法[48]是使用最普遍也最有效的一种方法,它也被叫做基于图像特征的分割方法。直接分割法它的原理是这样的,它会将图像分为七个字符块,而这些字符块是基于图像分析的,首先它会对字符图像的结构特征和统计特征进行分析,然后结合这些图像特征进行具体的分割。图像分析时所谓的结构特征和统计特征其实就是一些例如高度,宽度,相邻字符的间距等一些规矩而已,当然其中最重要的一个是字符间距,因为对于标准的车牌字符,字符与字符中间的距离是不变的,相等的,此外各个字符它们的宽度也基本相同,也就是距离和宽度它们是按照一个不变的比例来设计的,这就为我们分割字符时原理。对于一些特殊的行业,印刷字体有很多的规定,如本文中提到的车牌还有比如银行支票等,而这些规定就为我们分割字符提供了很多的方便。
我们以往所采用的方法是利用两个字符间的空白间距与两个字符中心的距离来分割字符的,即字符间隙和字符间距[26]。因为实际中字符的宽度基本不变,而字符间隙也基本是固定的,这样我们可以采用这个特点来分割字符。实际中我们采用的直接分割方法有基于投影法的字符分割方法[27]、基于车牌字符几何特征的分割字符算法[28]等。
字符分割中最基本的方法就是投影法,顾名思义,投影法就是采用投影的方法得到图像的投影直方图,投影时对图像的各行各列的黑像素数进行统计就能够得到直方图,其中波峰的位置是表示的是图像中的字符,而波谷表示的是字符的间隙,这样就能够很好的切分字符了。实际使用中,投影法不仅操作简单,而且速度还快,省时又省力。但是,投影法的适用范围也比较局限,只对那些字符界限明显或是稍微粘连的图像识别中有较好的效果,而对字符严重粘连的图像表现较差,这是因此投影法中用于字符分割的是一条直线。
对于那些用到了几何特征的字符分割算法,它们的具体实现分为以下几步:首先进行形态运算,也就是对二值化后的图像使用数学形态学进行处理,以此拉大图像中各个模块之间的距离,并去除那些杂余数据;然后对以上的信息进行校正,采用的是一种新的快速测量车牌倾斜度的方法,最后才是分割字符。
直接的分割方法在一些特殊领域的表现相当突出,它不仅算法比较简单,而且效率相对高。但是由于它对图像的质量要求很高,且分割轨迹要求苛刻,造成其适用范围比较窄。
4.1.1.2 基于识别的分割方法
基于识别的分割方法[48]原理是必须使用其结果,然后再对词法、句法和语义进行判别,这对分割来说起到至关重要的帮助。从总体上分类主要包括递归最大匹配法与寻优识别法这两大类分割方法。
递归最大匹配法就是首先要将字符的图像拆分为若干字符块,这其中难免要使用一些结构特征,然后按照此类字符块的识别判断挑选最佳得拆分答案。识别寻优法是在仔细分割结果的情况下,对识别结果进行有效分析以挑选出最佳得方案。
递归最大匹配法的根本思想为第一步要在完整的字符图像中基本得到全部可能的分割点,接下来采用宽度可调节的移动窗(mobile window)开始对其字符串进行拆分,这样的话会产生一连串的试验性拆分结果,最后针对字符识别再决定接受还是放弃此次的切分结果。如此循环下去,一直到最后,在每个窗口中其子图像都可以发现与之相对应的识别种类。文献中阐述了一种以模板匹配的最大类间方差车牌为基础的字符分割做法。此方法按照字符串的结构大小和尺寸大小的特征,设计出了车牌的字符串的模板,此模板在车牌区域滑动匹配进行分类,最后再遵照最大类间方差判决原则选择最好的匹配地点,目的是把车牌字符分割。
识别寻优法的根本思路是先按照图像的某一基本特点,以产生一连串的假定切割点,并且对这些切分点进行识别,然后再按照识别结果确定最好的切分结果。比较常见的识别器包括基于隐马尔可夫模型识别器,神经网络识别器和基于聚类识别器等等。
基于识别的分割方法可以不用采用复杂的纯纯粹的分割算法,跟直接的分割方法进行对比得到,对图片的质量要求没有那么高。然而要想取得较好的分割效果,其识别的可靠性还是具有关键性的作用的,无法确定的情况也相对较多。再者识别器需要用到许多的数据来作为训练对象,这样一来效率自然而然就会变得很低下,但通常的做法大都使用已经训练好的模型,所以影响还是可以控制的。
4.1.1.3 混合分割方法
混合型的分割方法[49],从名字就可以知道,它是把直接分割法与基于识别的分割方法融合在一起的一种字符分割处理方案。文献中阐述了一种基于聚类分析来分割车牌字符的做法。它的基本原理是根据属于相同的某个字符的象素组成一个连通域的前提,接着考虑到车牌的先验知识,这样的话能够很好处理了机动车车牌在复杂背景情况下如何切分字符方面的疑问。
混合的分割的方法则吸取了二者的优势之处,互相作用,又彼此限制,这样一来不仅消除了直接分割策略中对图像质量过于依赖的缺点,还拓宽了基于识别策略依赖识别器的这一局限。从最后的分割结果来看,不难看出其效果比上述两种策略要好很多。只是因为还要图像内部的信息进行计算,同时要给识别器留有训练的空间,所以说整体效率还是不够理想的。所以在要求分割效果好效率不是很敏感的情况下,混合的分割策略还是具有一定的优势的。
4.1.2 本文分割算法
在我国车牌被分为很多种,然而就车牌字符格式来说还是具有统一规定的,对于白字蓝底的牌照,牌照的长度为 440 mm,宽度是则为 140 mm,牌照中含有 7 个字符,它们的实际长度为 409 mm,同时单个字符的宽度为 45 mm,高度为 90 mm。在这之中,第二字符和第三字符两者之间距离为 34 mm,后面字符之间的间隔都为 12 mm。按照牌照的这一特征,就特别轻松的就能发现某个字符切分的位置。
我们使用字符垂直投影法时分割线为一条直线,它的原理是这样的,从图 4-1 中我们能够很明显的看出,像素值的分布会出现波荡起伏的脉冲图,而图像中波峰波谷又对应了车牌中不同的位置,例如波峰的位置就对应着车牌中各个字符所在的区域,其像素点非常集中而且底色相对也多,而波谷所对应的则是车牌中数字之间的连接区域,这段没有像素,而且有明显空白存在,这样我们就可以将空白的这部分作为分割线了。
图 4-1 单个车牌列方向累计像素值
当利用以上特征对车牌进行分割时,必须对车牌中数字和数字间的空白位置判断非常准确,因为它是利用字符间的空白位置来区分出数字的,一旦在分割过程中分割位置偏离空白位置,那么切割就可能出现在数字所在的位置,出现分割错误,另外采用投影法,则对图像的质量要求非常高,对于图像质量不好的进行分割时很可能造成字符分割时无法区分,或是分割不全等结果。这时可以采用其他方法,如将投影法[29]和模板匹配[30]的字符分割方法一起配合使用,这样我们需要处理的图片就是处理以后的图片,各种不利因素都已不在,这样对字符的分割就会有很好的效果,本文中所采用的也正是这种方法。
图 4-2 中的模板是在总结了车牌中数字分布规律后得出的。假设有效的数字所在区域总长是 cwidth,那么我们认为每个字符的平均宽度是 cwidth/7.5。
图 4-2 字符分割的水平模板
分割车牌字符算法的具体步骤是这样的[29][30]:
图 4-3 部分分割成功车牌
从实际电脑模拟来看,此次进行操作的总共有 104 副图片,而成功进行了字符分割的为 100 副,只有 4 副图片的分割出现了错误,正确分割率达到 96.15%,平均每幅图片从定位到分割需要 244ms,基本能够满足快速性的要求。具体实验结果在表 4-1 中列出。
表 4-1 实验结果
初始数量(张) 成功数量(张) 成功率(%) 平均时间(ms)
车牌精确定位 107 103 97.19 198
车牌正确分割 104 100 96.15 244
<1>HSV颜色模型
HSV是根据颜色的直观特性创建的一种颜色空间,其中H表示色调,S表示饱和度,V表示亮度。
<2>车牌的形态特征
根据HSV模型,对图像进行针对颜色的图像处理及腐蚀去噪之后,图像除少量噪声之外,主要的区域就是车牌区域。车牌区域由于有多个字符,所以每行都存在多个灰度跳变,由这一特征可以确定车牌在两行区域之间,在已确定的两行之间,在采取同样的方法确定区域边界的两列。这样就可以确定车牌的大致区域了,可以修改相关的参数,如跳变的次数等,在大致区域内进行二次定位,本实验在定位操作过程中就进行了两次定位。
<3>车牌分割
找出车牌区域之后,必须将车牌上的字符分割出来,这过程包括两个步骤,第一首先得将车牌从背景中分割出来,第二再将车牌的各个字符分别分割出来。
对于第一步,在对图像进行相关颜色处理之后,已经将字符从背景之中分割出来了,即本实验的分割1操作。本实验的分割2则使用了阈值分割的方法,通过将图像转换为灰度图像,选取适当的阈值,对其进行二值化。
第二步将字符分别分割出来,字符分割通常可以选择连通域的方法,本实验对字符的分割则是根据车牌字符排列位置特征:车牌有七个字符,第一个为汉字,第二个为字母,其余五个为数字和字母,第二个字符和第三个字符之间有一个点(算半个字符)。字符的宽度是一样,所以依据字符的宽度就可以较为准确将单个字符分别分割出来。
然后利用利用颜色特征和形态特征对车牌进行定位的具体实现字符分割
1.3 处理后的图像二值化。
计算图像二值化阈值具有较多的方式,图像在经过处理之后,直接会减小图像整体区域的灰度值,该灰度值会在水平的方向上若产生较大的变化时,才会在此区域中产生极大的灰度值,在这样的情况下图像直方图当中,所产生的峰值就会显示出两种明显的对比效果,然而拥有较大灰度的像素点中,二值化则是高亮度的点。那么,在选取二值化阈值时,需要通过最大方差法来完成[3]。实际上在处理之前和通过二值化处理之后的车牌对应图,如图1所示:
图1 二值化处理前后的车牌对比图
2 字符分割
大部分车辆上的车牌只拥有一个汉字,其他的字符基本都是数字、字母来组成。基于此,字符的分割适合应用连通阈的方式。针对其中的汉字通过大小、位置等信息合并连通阈。可是在实际的字符分割过程中,较多的车牌会拥有较大的噪声,极为严重的状况是目视不能够辨别的,同时仅仅依靠连通阈也根本不能够获得满意的效果。所以采取相应的改进方法是必要的措施:
3.1 大连通阈。
在产生噪声这一影响因素时,需要将连通阈相连接,从而构成大连通阈,此时会导致误判的现象发生。例如:较多的车牌上都会使用两个螺丝将车牌固定住,一般情况下这两个螺丝会将第六个字符和第二个字符与车牌边缘相连,由此会构成大连通阈,特别是新车,新螺丝的亮度较高,必然会增大灰度值。在这样的情况下,需要重新选取大连通阈中的阈值,然后开展二值化之后再次找出连通阈。此外,还会因为噪声,促使一个字母或者一个数字通过二值化形成多个连通阈,在这样的情况下就需要合并下一位的字母或者数字连通阈[4]。
2.2 改进二值化。
产生噪声的原因基本上是因为不恰当的二值化阈值而造成的。在车牌中字的灰度值与底色有着细微的差距,例如:车牌在反光的状态下,选取二值化阈值的方式尤为重要。此时,应该恰当利用的是局部的区域二值化,也就是将车牌适当的分割成较多的模块来以此开展二值化,最为严重的情况就是将二值化分别作用在每一个像素点中,引用这样的处理方式可以改善产生噪声这一较为严重的问题[5]。
2.3 位置信息的充分利用。
因为车牌拥有着规范排列的特征,有时在发生漏字的情况下,都能够通过位置信息将连通阈无法找到的字符找出。同时,位置信息在合并连通阈方面拥有着较为核心的作用。
3 车牌提取
通过水平扫描二值化之后的图像,将产生剧烈扫描线的区域当做备选的扫描区域。在此阶段拥有着一个重要的参数,就是在每一行中产生频率变化的最小下限值。按照我国的大部分车牌的特征,往往在7-10个字符之间,这几个字符中主要会包含:数字、汉字、字母。在提取图像时需要利用竖直边缘的提取,再进行水平扫描的手段,往往能够让变化程度显示出25次,甚至更多的变化率,结合实际会考虑到,由于较差的车牌质量或者二值化的原因,尤其是歪斜的车牌状况,在应用d值时需要取较小值。
二值化主要代码如下:
//图像预处理(根据颜色特征)
IplImage *imgH=NULL,*imgS=NULL,*imgV=NULL,*imgHSV=NULL,*imgGray=NULL;
imgHSV=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,3);
imgH=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
imgS=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
imgV=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
cvCvtColor(SrcImage,imgHSV,CV_BGR2HSV); // 转为HSV图像
cvSplit(imgHSV,imgH,imgS,imgV,NULL); //将多个通道分别复制到各个单通道图像中
cvInRangeS(imgH,cvScalar(94,0,0,0),cvScalar(115,0,0,0),imgH); //选取各个通道的像素值范围,在范围内的则
cvInRangeS(imgS,cvScalar(90,0,0,0),cvScalar(255,0,0,0),imgS); //置1,否则置0(按颜色进行二值化)
cvInRangeS(imgV,cvScalar(36,0,0,0),cvScalar(255,0,0,0),imgV);
IplImage *imgTemp=NULL,*imgHsvBinnary=NULL;
imgTemp=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
imgHsvBinnary=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
cvAnd(imgH,imgS,imgTemp);
cvAnd(imgTemp,imgV,imgHsvBinnary); //H,S,V三个通道分别按位求与,将所得的单通道图像保存到imgHsvBinnary中
//形态学去噪
//定义结构元素
IplConvKernel *element=0; //自定义核
int values[2]={255,255};
int rows=2,cols=1,anchor_x=0,anchor_y=1;
element = cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,values);
cvDilate(imgHsvBinnary,imgHsvBinnary,element,1); //膨胀腐蚀
cvErode(imgHsvBinnary,imgHsvBinnary,element,2); //多次腐蚀(2次),消除噪声
cvNamedWindow(“imgh1”);
cvShowImage(“imgh1”,imgHsvBinnary); //效果不错(但对于其他颜色貌似就没什么作用)
//阈值分割
imgGray=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
cvCvtColor(SrcImage,imgGray,CV_RGB2GRAY); //将原图转为单通道的灰色图像
IplImage *imgRgbBinnary;
imgRgbBinnary=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,1);
int Thresold=myOtsu(imgGray); //利用大津法求灰色图像阈值
cvThreshold(imgGray,imgRgbBinnary,Thresold,255,CV_THRESH_OTSU); //利用大津阈值进行二值化
cvNamedWindow("imgh2");
cvShowImage("imgh2",imgRgbBinnary); //显示二值化图像
//车牌定位
//行定位(根据车牌的区域的图像特征进行定位)
int hop_num=10; //字符连续跳变次数的阈值
int num=0; //计算跳变的次数
int begin=0; //跳变是否开始
int mark_Row[2]={0},k=0;//第一次标记车牌的开始行与结束行
int mark_Row1[2]={0}; //第二次标记
//第一次定位
for(int i=SrcImage->height-1;i>=0;i--)
{
num=0;
for(int j=0;jwidth-1;j++)
{
if(cvGet2D(imgHsvBinnary,i,j).val[0]!=cvGet2D(imgHsvBinnary,i,j+1).val[0]) //左右两列的值不等则视为一次跳变
{
num++;
}
}
if(num>hop_num)
{
mark_Row[k]=i;
k=1;
}
}
//cvLine(SrcImage,cvPoint(0,mark_Row[0]),cvPoint(SrcImage->width,mark_Row[0]),CV_RGB(255,255,0)); //在原图中画出所标记的两行
//cvLine(SrcImage,cvPoint(0,mark_Row[1]),cvPoint(SrcImage->width,mark_Row[1]),CV_RGB(255,255,0));
//列定位
int mark_col[2]={0},mark_col1[2]={0},num_col=0,k_col=0;
int a[100]={0},Thresold_col=7;
for(int j=0;jwidth;j++)
{
num_col=0;
for(int i=mark_Row[1];i0)
num_col++;
if(num_col>Thresold_col)
{
mark_col[k_col]=j;
k_col=1;
}
}
int i=0;
//cvLine(SrcImage,cvPoint(mark_col[0],0),cvPoint(mark_col[0],SrcImage->height),CV_RGB(255,0,0));
//cvLine(SrcImage,cvPoint(mark_col[1],0),cvPoint(mark_col[1],SrcImage->height),CV_RGB(255,0,0));
IplImage *imgLicense;
int license_Width1=(mark_col[1]-mark_col[0]);
int license_Height1 =mark_Row[0]-mark_Row[1];
if(license_Width1/license_Height1<3) //根据车牌的宽度和高度比对车牌区域进行修正
{
int real_height1 = license_Width1/3; //车牌的宽度和高度比大概为3:1
mark_Row[1] = mark_Row[0]-real_height1;
license_Height1 = real_height1;
}
//第二次定位(在第一次定位的基础之上)
k=0;
for(int i=mark_Row[0];i>mark_Row[1];i--)
{
num=0;
for(int j=mark_col[0];j8)
{
mark_Row1[k]=i;
k=1;
}
}
k_col=0;
for(int j=mark_col[0];j0)
num_col++;
if(num_col>6)
{
mark_col1[k_col]=j;
k_col=1;
}
}
int license_Width=(mark_col1[1]-mark_col1[0]);
int license_Height =mark_Row1[0]-mark_Row1[1];
if(license_Width/license_Height<3) //根据宽度和高度比再次修正
{
int real_height = license_Width/3; //车牌的宽度和高度比大概为3:1
mark_Row1[1] = mark_Row1[0]-real_height;
license_Height = real_height;
}
cvSetImageROI(SrcImage,cvRect(mark_col1[0],mark_Row1[1],license_Width,license_Height)); //将车牌区域设置为ROI区域
cvSetImageROI(imgRgbBinnary,cvRect(mark_col1[0],mark_Row1[1],license_Width,license_Height));
cvSetImageROI(imgHsvBinnary,cvRect(mark_col1[0],mark_Row1[1],license_Width,license_Height));
imgLicense=cvCreateImage(cvGetSize(SrcImage),SrcImage->depth,SrcImage->nChannels); //用于显示的车牌图片
SrcLicenseimg1=cvCreateImage(cvGetSize(imgRgbBinnary),imgRgbBinnary->depth,imgRgbBinnary->nChannels);
SrcLicenseimg2=cvCreateImage(cvGetSize(imgHsvBinnary),imgHsvBinnary->depth,imgHsvBinnary->nChannels);
cvCopy(SrcImage,imgLicense,0);
cvCopy(imgRgbBinnary,SrcLicenseimg1,0); //将车牌区域拷贝到相应的图像中
cvCopy(imgHsvBinnary,SrcLicenseimg2,0);
//cvNamedWindow("SrcLicenseimg1"); //显示车牌的二值化化图片
//cvShowImage("SrcLicenseimg1",SrcLicenseimg1);
//cvNamedWindow("SrcLicenseimg2");
//cvShowImage("SrcLicenseimg2",SrcLicenseimg2);
cvResetImageROI(SrcImage); //取消ROI设置
cvResetImageROI(imgRgbBinnary);
cvResetImageROI(imgHsvBinnary);
//cvNamedWindow("license");
//cvShowImage("license",imgLicense);
cvResize(imgLicense,TheImage_plate);
ShowImage(TheImage_plate,IDC_LICENSE_AREA); //显示车牌
cvLine(SrcImage,cvPoint(mark_col1[0],mark_Row1[0]),cvPoint(mark_col1[1],mark_Row1[0]),CV_RGB(255,0,0)); //在原图像中画出车牌区域
cvLine(SrcImage,cvPoint(mark_col1[1],mark_Row1[0]),cvPoint(mark_col1[1],mark_Row1[1]),CV_RGB(255,0,0));
cvLine(SrcImage,cvPoint(mark_col1[1],mark_Row1[1]),cvPoint(mark_col1[0],mark_Row1[1]),CV_RGB(255,0,0));
cvLine(SrcImage,cvPoint(mark_col1[0],mark_Row1[1]),cvPoint(mark_col1[0],mark_Row1[0]),CV_RGB(255,0,0));
//cvNamedWindow("src");
//cvShowImage("src",SrcImage);
cvResize( SrcImage, TheImage ); //显示原图(已经画出了车牌区域)
ShowImage( TheImage, IDC_VIDEO_SHOW );
}
//求取二值化的阈值
int CLICENSE_PLATE_RECONGNITIONDlg::myOtsu(IplImage frame)
{
int width = frame->width;
int height = frame->height;
int pixelCount[GrayScale]={0};
float pixelPro[GrayScale]={0};
int i, j, pixelSum = width * height, threshold = 0;
uchar data = (uchar*)frame->imageData;
//统计每个灰度级中像素的个数
for(i = 0; i < height; i++)
{
for(j = 0;j < width;j++)
{
pixelCount[(int)data[i * width + j]]++;
}
}
//计算每个灰度级的像素数目占整幅图像的比例
for(i = 0; i < GrayScale; i++)
{
pixelPro[i] = (float)pixelCount[i] / pixelSum;
}
//遍历灰度级[0,255],寻找合适的threshold
float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0;
for(i = 0; i < GrayScale; i++)
{
w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0;
for(j = 0; j < GrayScale; j++)
{
if(j <= i) //背景部分
{
w0 += pixelPro[j];
u0tmp += j * pixelPro[j];
}
else //前景部分
{
w1 += pixelPro[j];
u1tmp += j * pixelPro[j];
}
}
u0 = u0tmp / w0;
u1 = u1tmp / w1;
deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)) ;
if(deltaTmp > deltaMax)
{
deltaMax = deltaTmp;
threshold = i;
}
}
return threshold;
实验结果如下:
这是一张车牌原图
对车牌定位切割后如下
测试图片如下所有图片如下:
对以上图片提取后得到以下分割后的车牌
总结
随着设计渐渐进入尾声,我所分析的车牌识别技术也逐渐具有深度,可是它们并不是非常完善,尽管他付出了我几乎所有心思和汗水,我觉得这个产品可以做的更好,我的大学四年的学习生涯即将迎来结束,相比之下我更希望可以添上一个最完美的句号。在这个过程中,我学到了很多,也明白了很多,在之前的过程中,我对所学到的知识没有实践的机会,这也让我深刻的了解到实践的重要性,过程中遇到了很多的困难,在一一克服的过程中,我也得到了成长,知识和经验也得到了丰富。
在此次毕业设计过程中,学习到了我以前不懂得很多知识点,同时也明白了自己在专业知识上还有所欠缺。如今网络正在快速的发展、应用的领域也一直在迅速扩大,如果要跟上网络发展的脚步,就一定要积极努力,不停的学习和实践。虽然我很快就要毕业了,在以后的项目实践中,我会努力下去,我会一直学习新的知识以及专业的专研,顺应时代潮流的必由之路。
参考文献
[1]郑南宁,张西宁,戴莹,朱海安.行驶车辆牌照自动识别系统.《西安交通大学学报》, 1991
[2]刘效静,成瑜.汽车牌照自动识别技术研究.《 南京航空航天大学学报》, 1998
[3]王年,熊原,赵海峰,任彬.基于神经网络的汽车牌照自动识别.《 安徽大学学报(自然科学版)》, 2000
[4]张兴会,杜升之,陈增强等.基于神经网络的车牌照自动识别系统.《 仪器仪表学报 》, 2001
[5]沈会良,李志能.基于CCD的汽车牌照自动识别系统. 《 光电工程 》 , 2000
[6]张中良,基于机器视觉的图像目标识别方法综述[J],科技与创新,2016(14):32-33
[7]Geetha Palakkad Parameswaran,Rajan Vanjani.Unveiling Cross Platform Advertising Solutions. www.wipro.com . 2016
[8] Patil S B , Bodhe SK.Leaf disease severity measurement using image processing . International Journal of Engineering and Technology , 2011 , 3(5):297-301
[9] Bartel DP.MicroRNAs: target recognition and recognition and regulatory functions . Cell , 2009 , 136 ( 2 ) : 215-233
[10] Zhang Z.A flexible new technique for camera calibration [J] . IEEE Transactions on Pattern Analysis & Machine Intelligence , 2000 , 22 ( 11 ) : 1330-1334
致 谢
系统的结束,意味着大学四年的生活就要结束了。在系统的这一段时间里,不仅有导师的指导,还有同学的帮助;系统即将结束,我要感谢我的导师,正因为有导师的不断的指导,才能完成这个系统以及毕业论文的书写。同时,在平常的上课时,每位老师都对我们严格要求,让我们按时完成老师留下的任务,课堂上,老师不仅教会我们如何学习、教会我们新的知识,在课下,又能和老师打成一片,教会了我很多道理。让我意识到先做人、后做事,感谢大学里直接或间接教过我的每一位老师,也感谢我的母校。
在这里还得感谢我的战友们,也就是同学,正是有你们的不断鼓励,还有我们每一天都熬到很晚,在不断的调试着我们的程序、测试,我们在一起交流、谈论,相互学习,相互激励,这些都将是我们在通往未来道路上的宝贵财富。
最后,我要向牺牲了休息时间来对本文进行审阅,评议和参与论文答辩的各位老师表示深深的感谢。在此,衷心的谢谢您们!