审定成绩:
重庆邮电大学
毕业设计(论文)
中文题目 机动车车牌的识别于处理系统研究
英文题目 Research on vehicle license plate recognition and processing system
学院名称 光电工程学院
学生姓名 舒茂
专 业 光电信息科学与工程
班 级 02051601
学 号 2016210741
指导教师 郑培超教授
答 辩 组
负 责 人 姓名 职称
2020年 5 月
重庆邮电大学教务处制
光电工程 学院本科毕业设计(论文)诚信承诺书
本人郑重承诺:
我向学院呈交的论文《 机动车车牌的识别与处理系统研究 》,是本人在指导教师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明并致谢。本人完全意识到本声明的法律结果由本人承担。
年级
专业
班级
承诺人签名
年 月 日
学位论文版权使用授权书
本人完全了解重庆邮电大学有权保留、使用学位论文纸质版和电子版的规定,即学校有权向国家有关部门或机构送交论文,允许论文被查阅和借阅等。本人授权重庆邮电大学可以公布本学位论文的全部或部分内容,可编入有关数据库或信息系统进行检索、分析或评价,可以采用影印、缩印、扫描或拷贝等复制手段保存、汇编本学位论文。
(注:保密的学位论文在解密后适用本授权书。)
学生签名: 指导老师签名:
日期: 年 月 日 日期: 年 月 日
摘要
随着我国机动车保有量的不断增加,机动车已经成为当今世界必不可少的元素,人们的出行对机动车的依赖越来越强,提高交通管理效率已经成为迫在眉睫的事情,其中智能交通系统对于未来交通的高效管理起着重要性的作用。车牌自动识别作为智能交通系统的核心,是进行车辆信息管理的关键所在。虽然目前国内外已经有不少相对成熟的车牌自动识别系统,但是因为自然场景自身有很高的复杂性,使得图像质量本身存在问题,这就为车牌的准确识别带来了困难。本文就是希望设计一套车牌自动识别系统,可以应对自然场景图像的复杂性,使车牌能够被正确识别。
本文针对输入的彩色车辆图像,依次研究并实现了车牌识别系统的三个核心算法,也就是车牌的检测定位、字符分割以及字符识别。在得到车牌原始图像后,不能直接对其进行定位、分割以及识别操作,因此本文首先分析了图像预处理,借助于灰度化、滤波等技术使车牌纹理特征更加突出,从而应对外部环境带来的不确定性;其次,本文进行了机动车车牌的定位与分割,分别采用了数学形态学对图像进行腐蚀,并去除杂质,获得比较准确的位置信息,并借助投影法实现割车牌字符的分割,并对字符进行归一化处理;最后,基于模板匹配法实现了字符的识别。
借助于Matlab工具进行了算法的验证,最终结果表明,本文设计与实现的机动车车牌识别与处理系统可以取得良好的识别效果,识别准确率达到了98%,说明了本文算法的有效性与适应性。
关键词:MATLAB、图像预处理、车牌定位、字符分割
Abstract
With the increasing number of motor vehicles in our country, motor vehicles have become an essential element in the world today. People’s travel depends more and more on motor vehicles. Improving the efficiency of traffic management has become an urgent matter, in which intelligent transportation system plays an important role in the efficient management of future traffic. As the core of its, license plate automatic recognition is the key to vehicle information management. Although there are many relatively mature license plate automatic recognition systems at home and abroad, but because of the high complexity of the natural scene itself, the image quality itself has problems, which brings difficulties for the accurate recognition of license plate. This thesis hopes to design a set of license plate automatic recognition system, which can deal with the complexity of natural scene image, so that the license plate can be correctly recognized.
This thesis studies and implements three core algorithms of license plate recognition system, that is, license plate detection and location, character segmentation and character recognition. After getting the original image of the license plate, it can not be directly located, segmented and recognized. Therefore, this thesis first analyzes the image preprocessing, which makes the texture features of the license plate more prominent with the help of grayscale, filtering and other technologies, so as to cope with the uncertainty brought by the external environment. Secondly, this thesis carries out the location and segmentation of the vehicle license plate, using mathematical morphology The image is corroded, the impurities are removed, the more accurate position information is obtained, and the characters are segmented by the projection method, and the characters are normalized; finally, the character recognition is realized based on the template matching method.
With the help of MATLAB tools, the algorithm is verified. The final results show that the vehicle license plate recognition and processing system designed and implemented in this thesis can achieve good recognition results, and the recognition accuracy reaches 98%, which shows the effectiveness and adaptability of the algorithm in this thesis.
Keywords: MATLAB software, image preprocessing, license plate localization, character segmentation .
目录
第1章 引言 1
1.1 研究背景和意义 1
1.2 国内外研究现状 1
1.2.1 国外研究现状 1
1.2.2国内研究现状 2
1.3 主要内容和工作安排 2
第2章 图像预处理 3
2.1图像灰度化 3
2.2图像的边缘检测 3
2.2.1引言的目的 3
2.2.2 引言构成及写作要求 4
2.3本章小结 4
第3章 机动车车牌定位与分割 5
3.1车牌定位 5
3.2车牌分割 5
3.3对定位后的彩色车牌的进一步处理 10
3.4字符分割与归一化 11
3.4.1 字符分割与归一化处理 5
3.4.2 字符归一化处理 8
3.5本章小结 11
第4章 机动车车牌识别 27
4.1 基于模板匹配的字符识别方法 27
4.2 识别结果 27
参考文献 29
致谢 31
附录A matlab程序实现 33
附录B 36
一、英文原文 36
二、英文 36
三、源程序 36
四、其他 36
第1章 引言
1.1 研究背景和意义
智能交通系统(Intelligent Transportation System, ITS)[1]是利用信息技术和自动化技术结合进行最有效和最合理的集管理指挥为一体的智能系统。汽车牌照识别系统(LPRS)作为智能交通系统中的核心组成部分,利用LPRS可以实现机动车的高效化管理,成为当前机动车规范化应用必不可少的一部分,例如在交通管制、无人停车场、高速路口等场景均有非常强烈的应用需求。
本文的目的就是进行车牌识别系统的设计与实现,本文的研究成果将应用于机动车车牌识别的实际场景中,本文研究显然是有重要现实意义的。
1.2 国内外研究现状
1.2.1 国外研究现状
车牌自动识别的研究可以追溯到上世纪80年代,西方欧洲国家在经历工业革命以后,汽车产能不断提升,因此对汽车牌照进行自动化识别的需求与日俱增[2]。尤其在上世纪80年代后期,机器视觉技术的发展推动了车牌识别的研究进程,也出现了不少性能不错的研究成果。欧美国家率先对这一方面进行了深入的研究,同时相应的技术和研究成果也应用到了交通管理系统中去,推动了智能交通系统的发展。
国外对于车牌自动识别的研究要早于国内,相对的研究深度和广度都要优于国内;但是随着国内对智能交通系统的重视,大量的研究机构和公司投入到这一领域,使得国内的车牌识别技术与国外的差距变得越来越小。目前应用较多的牌照自动化识别系统包括以色列Hi-Tech公司的See/Car System 系统、新加坡 Optasia 公司的 VLPRS 系统等[3]。
1.2.2国内研究现状
我国车牌识别的研究从本世纪初开始,由于中国的车牌形式、内容均与其他国家存在差异,所以很多先进的技术无法直接应用,这就导致国外的产品不能很好地应用于国内的市场,这也为我国车牌自动化识别的研究与应用提供了更加广阔的平台,其中北京文通科技有限公司开发的“文通车牌识别系统”,利用这一系统可以实现平均97%的识别率,即便在光线很差的夜晚,该系统识别率也能超过90%,并且识别速度快捷[4];汉王公司的“汉王眼”,据报道其车牌识别的准确率可以达到 97.5%,但是对图像采集设备有固定的要求;杭州东辰信息科技有限公司开发的车牌识别系统的识别率有 95%;深圳索维尔科技公司、北京光桥科技有限公司等都开发了自己的产品,且识别率都较高;此外,很多国内的实验室和大学都做过有关方面的研究,例如:吉林大学[5]、上海交通大学[6]、西北工业大学[7]、四川大学的有关实验室等均从事车牌识别系统的研究工作。
1.3 主要内容
虽然近年来不少学者将深度学习工具应用到图像识别领域,然而由于机动车车牌的字符都还是相对固定的,所以绝大多数牌照识别系统都还是沿用了经典图像处理与分析的流程。对于汽车牌照识别而言,通常由车牌定位、车牌字符分割以及字符识别这3个主要模块构成。车牌识别的基本流程如图1.1所示。
图1.1 车牌识别流程图
车牌定位主要是将汽车牌照的准确位置检测出来,然而受到采集过程中环境因素、光照因素等影响,例如雨天、雾天会直接导致图片质量恶化,以及车辆本身的内在因素,如保险杠、散热片、车灯、车身上的一些广告文字等影响,则会使得车牌定位不准确,进而影响后续识别。定位可以说是车牌字符分割和车牌字符识别的前提,所以必须要找到一种鲁棒的、对光线和噪声等干扰不敏感的车牌检测与定位方法。在进行车牌定位的过程中,需要将采集得到的图像进行适当预处理,得到汽车牌照的准确位置定位好并将完整的车牌区域提取出来。
车牌字符分割的目的是把机动车车牌上的字符一一按照顺序取出来。然而考虑到实际车牌图像上会受到遮挡、光照不均等不利因素,造成车牌字符分割出现错误,分割错误将直接导致牌照无法识别。车牌识别的最后一步就是根据分割得到的字符实现字符识别,进而达到对车牌识别的目的,考虑到在分割得到的字符中,由于经历了数道处理,可能存在字符断裂、字符粘连等原因而造成误识,因此合理地涉及识别算法是非常关键的。
本文将设计一套车牌识别系统,实现以上三个步骤的自动化实现,进而提高机动车管理的效率。
1.4 章节安排
全文共分为5章,内容结构安排如下:
第1章为引言,引入课题的研究背景及意义。
第2章为图像预处理,讨论如何对原始图像进行处理,提高后续图像处理效果。
第3章为机动车车牌定位与分割,提出相应算法解决车牌的定位与分割问题。
第4章为机动车车牌识别,作为车牌自动识别系统的最后一环,分析如何对分割得到的字符进行准确识别。
第5章为总结与展望,是论文的结束语,总结毕业设计工作,提出可以在今后继续深入研究的方向。
第2章 图像预处理
机动车出现在摄像机前端时,将会触发相机牌照,此时将会得到包含机动车车身在内的车牌照片。车牌原始照片传输到上位机,完成车牌识别的相关运算。但是考虑到绝大部分车牌的采集都需要在户外完成,因此最终成像得到的图片质量将直接与光照条件有关。还可能与车牌的清洁程度有关,当车牌上存在污渍时,将使图像识别难度陡增。除此之外,还有不少驾驶者在临近摄像头时,汽车并未完全停住,所以也会导致图像出现模糊的情况。为解决上述问题,就必须对图像进行预处理操作,提高图片的质量。
2.1图像灰度化
本文系统采集的图像均使用24 位真彩色位图,虽然彩色图像观赏性更强,而且包含有更多黑白图片所不具备的信息,然而由于彩色图像会导致存储与传输速度降低,影响整个系统的响应速度。所以几乎所有市面上的车牌识别系统都放弃使用彩色图像,用灰度图像代替。在灰度图像中,把亮度划分为256个级别级,依次由0至255中的一个数字代替。其中,0代表最暗,也就是该像素是黑色;255代表最亮,也就是该像素为白色。各像素均通过单个 8 位字节进行表示,想要将一个彩色图像转变为灰度图像,可以采用以下公式:
(2-1)
在MATLAB里可以直接利用im2gray函数实现图像灰度化功能。
2.2图像的边缘检测
在图像处理过程中,为了理解和识别图像,需要将图像分解为具有某种特征的最小成分。图像的边缘作为图像的最基本特征,能够很好地对不同元素的关系进行描述,实现对物体和背景、物体和物体之间关系的区分。实际上,这种关系是普遍存在的,因此也是图像处理绕不开的话题,是图像分割必不可少的特征。进行图像边缘检测的基本思想是利用图片灰度变化的不连续性,常见的边缘主要为两类,一类为阶跃性边缘,这种边缘的两侧像素灰度值差别很大,灰度的二阶
方向导数在边缘处是零交叉的;另一类为屋顶状边缘,这种边缘的灰度值呈现出先增加,后减少的趋势(也可能完全相反),在边缘位置有显著的转折点,且二阶方向导数在这些位置是取极大(极小)值的。对于一张图像,其中某个物体边缘的像素周围会存在一定范围的灰度变化带,通过借助灰度变化率与灰度变化方向来表征灰度的变化,进而为边缘检测提供依据。已有的边缘检测方法众多,应用比较广泛的边缘检测算子为Roberts 算子、Sobel 算子、Prewitt 算子 、Laplace 算子等。本文基于Roberts边缘检测算子实现车牌图像的边缘检测。
Roberts 算子中给出了2×2邻域上计算对角导数的算子,数学形式如下:
(2-2)
对于实际应用场景,也常通过以下表达式来替代均方值:
(2-3)
灰度化和边缘检测的MATLAB程序如下:
I=imread(‘car.jpg’);
figure(1),imshow(I);title(‘原图’)
I1=rgb2gray(I);
figure(2),subplot(1,2,1),imshow(I1);title(‘灰度图’);
figure(2),subplot(1,2,2),imhist(I1);title(‘灰度图直方图’);
I2=edge(I1,‘robert’,0.08,‘both’);
figure(3),imshow(I2);title(‘robert算子边缘检测’)
图2.1 采集得到的原始车牌图像
图2.2 原始图像的灰度图
图2.3 Robert算子边缘检测结果
2.3本章小结
图像预处理是机动车车牌识别的前置环节,对原始图像进行有效处理将大大提高识别率。本章从图像灰度化与图像边缘检测两方面分析了图像预处理的方法,得到了机动车车牌的边缘特征。
第3章 机动车车牌定位与分割
3.1 车牌定位
分析车牌的特征容易发现,车牌往往是矩形的,而且在狭小的区域中,包含了7个字符,具有丰富的边缘;车牌区域每个字符灰度基本相同,字符到字符间距的灰度变化明显,并且呈现出一定的规律性。针对车牌文字区域呈现出的空间、频率特性,我们可以找到依照纹理特征进行车牌定位的方法。
本文采用数学形态学的方法进行车牌定位。数学形态学的理论完备,思想简单,而且容易实现,所以被广泛地应用在图像领域,尤其在图像分割、特征提取、文字识别、图像编码、边缘检测等图像处理领域的应用变得越来越广泛。
在不同车辆图像中,尽管车牌大小不一,然而车牌的形状往往大多未矩形。而且在车牌的内部,各个字符都是按照水平的方式进行排列,且间距固定。正是由于车牌字符的这种排列特征,适合采用数学形态学对图像进行腐蚀,并去除杂质,进而能够获得比较准确的位置信息,即完成定位。
图3.1腐蚀后的图像
图3.2 平滑图像的轮廓
图3.3从对象中移除小对象后图像
3.2车牌分割
在通过数学形态学得到的车牌定位信息,可以实现简单、处理快速,抗干扰能力强,对车牌的倾斜不敏感,可实现车牌的快速定位。在得到了车牌的定位之后,需要紧接着实现车牌的分割,因为车身图像信息对于车牌识别是毫无意义的。为了得到车牌,本文直接使用基于车牌颜色信息的彩色分割法。该方法的核心思想如下:对图像中的彩色像素点进行统计,由于本文考虑的车牌为蓝底车牌,所以找出蓝色RGB所对应的灰度范围,对处于该灰度范围的像素点进行统计,进而就可以得到车牌所在区域,随即达到车牌分割的目的。
图3.4车牌对位的图像
3.3对定位后的彩色车牌的进一步处理
考虑到定位、分割得到的车牌是彩色图像,这样会消耗相对较多的内存空间,也为计算带来困难。与此同时,考虑到在机动车图片中往往还会包含有噪声,因此有必要对彩色图像进行灰度处理,常用的方法为图像二值化,即将整张图片转化为黑白的效果,仅包括0与255两种数值。除此之外,还需要对噪声进行去除,本文应用的是均值滤波的方法。
图3.5 车牌的进一步处理
3.4字符分割与归一化
3.4.1字符分割
从二值图中可以发现,字符与字符之间是有明显的界限的,通过投影的方法可以很好地分割车牌字符,同时在投影后根据车牌字符的长宽比可以进行分割点调整从而减少粘连和污损对车牌字符分割的影响。把二值化后的图进行垂直投影(从上到下),根据车牌字符的宽高比大约为 1:2,统计投影图每行(从左到右)的各个线段长度,如果线段的长度大于某个阈值(这里设定阈值为 height*0.6),把该线段进行去除(即实现粘连情况的分析与处理),扫描一遍投影图后,剩下的基本上单个字符投影到一个连通区域中了,对投影的高度和宽度不满足一定阈值的 Block 予以去除,最后进行连通域分析从而实现字符分割,分割结果如图3.10。
图3.6 字符分割后的图像
3.4.2字符归一化处理
因为在进行车牌图像的采集过程中,相机与机动车的距离会有很大的差距,所以会导致最终车牌大小明显不同,这样就导致分割得到的字符大小有很大差异。此时,有必要对字符实现归一化处理,进而将字符大小限制在相同尺寸,这样才方便开展后续的字符识别。目前主流的字符归一化方法为以下两种:(1)根据字符分割输出图像的外边框,根据一定的比例进行缩放;(2)按照水平与垂直这2个方向分别对字符像素分布情况实现归一化处理。本文采用第二种方法,该归一化方法需要对文字的质心 GI和 GJ进行求解:
(3-1)
(3-2)
然后,还需要对两个方向上的散度进行求解:
(3-3)
(3-4)
在求得水平和垂直方向的散度后,便可按照比例将文字进行放大或缩小成规定散度的点阵,实现文字尺寸大小的归一化。
图3.7 字符归一化后的图像
3.5本章小结
本章进行了机动车车牌的定位与分割,分别采用了数学形态学对图像进行腐蚀,并去除杂质,获得比较准确的位置信息,并借助投影法实现割车牌字符的分割,并对字符进行归一化处理,为下一章的车牌识别做好准备。
第4章 机动车车牌识别
车牌识别是本文系统实现的最后一步。对于已获得的车牌字符,本文选择用模板匹配的方式实现机动车车牌的准确识别。模板匹配算法有着悠久的历史,其算法思想容易实现,可以描述如下:第一步是对待识别的字符图像实现二值化,同时把字符的尺寸进行归一化处理,通常是把字符尺寸缩放至与模板库中图片一致;其次,将待识别字符和模板库中图像一一比对,计算相似度,并将相似度最高的作为结果输出。从提高识别准确度角度考虑,实际操作时往往会选择多个模板,但是这样做虽然有助于提高识别准确率,却牺牲了处理时间,针对这一问题不少学者提出改进。其中,效果比较显著的改进是基于关键点的模板匹配算法,该算法的目标是对字符中的关键点进行提取,也就是根据字符的拓扑结果获取边缘特征,再基于关键点去噪处理获取分类结果。由于只利用字符的关键点,大大缩小了模板匹配的复杂度,因此在确保识别率的同时对识别时间进行了优化。
4.1 基于模板匹配的字符识别方法
本文采取作差相减的方法,对字符和模板的字符相似度进行评价,最终把相似度最高的字符作为识别结果。考虑我国机动车车牌基本上都为7位,且第一位通常是汉字,代表对应的省份信息,也可能是对军种的表示。从第二位开始的字符可能为英文字符或者数字。由于涉及的汉字、英文字符以及数字都是有限的,据统计,汉字为50余个,阿拉伯数字10个,因此可以非常方便地构建模板库。本文的车牌识别算法如图4.1所示。
在构建好字符模板以后,按照顺序对提取得到的字符和模板进行对比,做相减运算,在两张图像差值中0越多,则说明匹配度越高,这样就可以筛选出最为匹配(相似度最高)的字符,作为识别系统的输出。
图4.1 字符识别流程图
4.2 识别结果及分析
本文的算法均在MATLAB17.0仿真平台上进行验证。本次仿真识别采用的车牌如图4.1所示,可见是一张彩色车牌。识别结果同样在图4.1中,以蓝色的字体在车牌图像上方显示。
图4.1 识别结果
可见,本文机动车车牌识别系统能够准确地对车牌字符进行识别,取得了良好的识别效果。在对100张样张进行测试过程中,正确识别个数为98%,且这100张样张覆盖了不同场景、不同光照情况,测试结果能够说明本文算法的适应性。
但是应当指出,采用基于模板匹配的字符识别算法时,必须确保模板制造的合理性,否则将直接影响识别性能。本文同样开展了其他车牌照片的识别实验,存在一些识别错误的情形,总结其原因主要为以下两种情况:(1)车牌存在污渍,导致字符提取失败,进而导致无法准确识别;(2)字符模板中8与B相近所导致的识别错误。
总体来看,基于模板匹配的字符匹配算法能够应对实际应用场景,虽然识别率有继续提升的空间,但是相比神经网络等分类器而言,其可解释性更好,而且更加容易实现。当在实际应用中发现错误识别时,可以通过优化模板的方式进一步提高识别率。
4.3 本章小结
车牌识别是机动车车牌自动识别系统的最后一步,本章引入基于模板匹配的字符识别方法对上一章分割得到的字符进行识别,并开展实验。结果表明本文设计与实现的车牌自动识别系统能够达到98%的识别准确率。
第5章 总结与展望
5.1 主要工作总结
本文针对机动车车牌识别开展了系统性的研究,从图像预处理到车牌的定位、分割以及识别,对各功能模块进行了算法实现,并取得了不错的识别效果(在100张测试图片中取得了98%的识别准确率)。
5.2 后续研究工作展望
虽然本文设计与实现的,本文还是存在一些可以继续改进之处的,例如本文研究仅涉及蓝底白字车牌,如今新能源车采用的绿底白字车牌可能无法适应,因此本文算法还需继续提高适用性。
参考文献
[1]胡成伟,袁明辉.基于Harris算子的车牌定位识别改进算法研究[J].电子测量技术,2019,42(24):138-142.
[2]刘伍丰,何前磊,郑维.基于HAAR特征与BP神经网络的车牌识别技术研究[J].电子测量技术,2019,42(08):61-67.
[3]王艳,谢广苏,沈晓宇.一种基于MSER和SWT的新型车牌检测识别方法研究[J].计量学报,2019,40(01):82-90.
[4]杜媛.基于图像分割与多特征模型的车牌识别算法[J].国外电子测量技术,2018,37(08):20-24.
[5]朱美玲,刘晨,王雄斌,韩燕波.基于车牌识别流数据的车辆伴随模式发现方法[J].软件学报,2017,28(06):1498-1515.
[6]吴志攀,赵跃龙,罗中良,杜华英.基于PSO-BP神经网络的车牌号码识别技术[J].中山大学学报(自然科学版),2017,56(01):46-52.
[7]高聪,王福龙.基于模板匹配和局部HOG特征的车牌识别算法[J].计算机系统应用,2017,26(01):122-128.
[8]胡玉琛,刘一清.基于FPGA的车牌识别系统研究与实现[J].电子测量技术,2015,38(12):54-58.
[9]李彦,张洪博,石莲英.基于SIFT特征匹配的车牌识别方法[J].计算机工程与应用,2016,52(12):194-200.
[10]殷羽,郑宏,高婷婷,刘操.基于联合HOG特征的车牌识别算法[J].计算机工程与设计,2015,36(02):476-481.
[11]谢永祥,董兰芳.复杂背景下基于HSV空间和模板匹配的车牌识别方法研究[J].图学学报,2014,35(04):585-589.
[12]马爽,樊养余,雷涛,吴鹏.一种基于多特征提取的实用车牌识别方法[J].计算机应用研究,2013,30(11):3495-3499.
[13]王晓雪,苏杏丽.数字图像处理在车牌识别中的应用[J].自动化仪表,2010,31(07):22-25.
致谢
致谢二字一级标题:黑体3号字居中,段前17磅,段后16.5磅,1.5倍行距,致谢二字与致谢内容之间不空行。致谢内容正文样式:宋体小四号,1.5倍行距。
可以从下列方面致谢:协助完成研究工作和提供便利条件的组织或个人;在研究工作中提出建议和提供帮助的人;给予转载和引用权的资料、图片、文献、研究思想和设想的所有者;其他应感谢的组织或个人。
主要感谢导师和对论文工作有直接贡献及帮助的人士和单位。学位申请人的家属及亲朋好友等与论文无直接关系的人员,一般不列入致谢的范围。
致谢辞应谦虚诚恳,实事求是,切忌浮夸与庸俗之词。
附录A
clear ;
close all;
function varargout = licenseplate(varargin)
% LICENSEPLATE MATLAB code for licenseplate.fig
% LICENSEPLATE, by itself, creates a new LICENSEPLATE or raises the existing
% singleton*.
%
% H = LICENSEPLATE returns the handle to a new LICENSEPLATE or the handle to
% the existing singleton*.
%
% LICENSEPLATE(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in LICENSEPLATE.M with the given input arguments.
%
% LICENSEPLATE(‘Property’,‘Value’,…) creates a new LICENSEPLATE or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before licenseplate_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to licenseplate_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help licenseplate
% Last Modified by GUIDE v2.5 15-May-2012 16:44:58
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @licenseplate_OpeningFcn, …
‘gui_OutputFcn’, @licenseplate_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% — Executes just before licenseplate is made visible.
function licenseplate_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to licenseplate (see VARARGIN)
% Choose default command line output for licenseplate
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes licenseplate wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% — Outputs from this function are returned to the command line.
function varargout = licenseplate_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% — Executes on button press in StartKnop.
function StartKnop_Callback(hObject, eventdata, handles)
% hObject handle to StartKnop (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%ophalen afbeelding
naam=get(handles.naam,‘String’);
A=imread(strcat(‘images/’,naam));
org=A;
axes(handles.axes1);
[h,w,f]=size(A);
%originele afbeelding wordt getoond
imshow(A);
%we converteren de afbeelding naar grijsschaal om een treshhold te kunnen
%opstellen voor de binaire afbeelding: alles onder de treshold is 1, alles daarboven wordt 0
A = rgb2gray(A);
level = graythresh(A);
%de afbeelding wordt omgezet naar een binaire afbeelding, we verhogen de
%treshold nog met 30% voor een beter resultaat te krijgen
A = im2bw(A,level*1.3);
axes(handles.axes2);
%vervolgens maken we gebruik van een ingebouwde matlab-functie voor
%edge-detection adhv
A=edge(A,‘prewitt’);
imshow(A);
horHist=zeros(w);
%Het aantal witte pixels per kolom worden opgeteld en opgeslagen
for i=1:w
tot=0;
for j=1:h
if (A(j,i)==1)
tot=tot+1;
end
end
horHist(i)=tot;
end
axes(handles.axes3);
%berekende treshold
gem=max(horHist)/2.3;
plot(horHist);
hstart=0;
heinde=0;
width=0;
hcounter=0;
arc=0;
hcoor=zeros(1,2);
%als het aantal witte pixels gedurende een bepaalde afstand (vastgelegd in percentages) groter is dan de
%treshold wordt deze positie opgeslagen als de horizontale positie van de
%nummerplaat
for i=1:w
if horHist(i)>gem(1)
if(hstart==0)
hstart=i;
end
hcounter=0;
else
if hstart>0
if hcounter>(w0.07)
heinde=i-hcounter;
width=heinde-hstart;
if(width>(w0.1))
arc=arc+1;
hcoor(arc,1)=hstart;
hcoor(arc,2)=width;
end
hstart=0;
hcounter=0;
heinde=0;
width=0;
end
hcounter=hcounter+1;
end
end
end
[ww,f]=size(hcoor);
hstart=0;
hwidth=0;
%in het geval er meerdere horizontale plaatsen gevonden zijn voor de
%nummerplaat dan pikken we enkel de breedste positie er uit.
for i=1:ww
if(hcoor(i,2)>hwidth)
hwidth=hcoor(i,2);
hstart=hcoor(i,1);
end
end
A=A(:,hstart:(hstart+hwidth)😅;
axes(handles.axes2);
imshow(A);
verHist=zeros(h);
%het aantal keer dat een pixel en zijn buur in een rij tegenovergesteld
%zijn van elkaar wordt opgeslagen voor die rij.
for j=1:h
tot=0;
for i=2:hwidth
if (A(j,i-1)==1 && A(j,i)==0) || (A(j,i-1)==0 && A(j,i)==1)
tot=tot+1;
end
end
verHist(j)=tot;
end
axes(handles.axes4);
verh=zeros(1);
coun=1;
%we berekenen de gemiddelde waarde van het aantal tegenovergestelde
%naburige pixels in een rij, dat gemiddelde gebruiken we later als treshold
for i=1:h
if(verHist(i)>0)
verh(coun)=verHist(i);
coun=coun+1;
end
end
gem=mean(verh)
plot(verHist);
vstart=0;
veinde=0;
height=0;
vcounter=0;
arc=0;
vcoor=zeros(1,2);
h0.07
%als het aantal tegenovergestelde naburige pixels per rij gedurende een
%bepaalde breedte groter is dan het gemiddelde en vervolgens van een
%bepaalde hoogte is tov de afmetingen van de afbeelding, dan wordt deze
%positie opgeslagen als mogelijke verticale plaats van de nummerplaat
for(i=1:h)
if verHist(i)>gem(1)
if(vstart==0)
vstart=i;
end
vcounter=0;
else
if vstart>0
if vcounter>(h0.03)
veinde=i-vcounter;
height=veinde-vstart;
if(height>(h*0.05))
arc=arc+1;
vcoor(arc,1)=vstart;
vcoor(arc,2)=height;
end
vstart=0;
vcounter=0;
veinde=0;
height=0;
end
vcounter=vcounter+1;
end
end
end
[l,f]=size(vcoor);
axes(handles.axes5);
%nu we de verschillende mogelijke posities berekend hebben kunnen we
%overgaan tot de segmentatie
A=org(vcoor(l,1):vcoor(l,1)+vcoor(l,2),hstart:(hstart+hwidth)😅;
imshow(A);
axes(handles.axes6);
%tot slot worden de tekens op de nummerplaat gesegmenteerd en herkend (zie
%ocr.m file)
f=ocr(A);
set(handles.plaat,‘String’,f);
function naam_Callback(hObject, eventdata, handles)
% hObject handle to naam (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,‘String’) returns contents of naam as text
% str2double(get(hObject,‘String’)) returns contents of naam as a double
% — Executes during object creation, after setting all properties.
function naam_CreateFcn(hObject, eventdata, handles)
% hObject handle to naam (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end
function plaat_Callback(hObject, eventdata, handles)
% hObject handle to plaat (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,‘String’) returns contents of plaat as text
% str2double(get(hObject,‘String’)) returns contents of plaat as a double
% — Executes during object creation, after setting all properties.
function plaat_CreateFcn(hObject, eventdata, handles)
% hObject handle to plaat (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
End
function [ o_str ] = ocr( img )
%Werkt enkel voor duitse nummerplaten want alleen daarvan vond ik een
%alfabet
wait=1;
%img is de reeds gesegmenteerde nummerplaat
[h,w,f]=size(img);
imshow(img);
pause(wait);
[h,w,f]=size(img);
img = rgb2gray(img);
imshow(img);
pause(wait);
%ook deze afbeelding zetten we om naar een binaire afbeelding
img=~(img<100);
imshow(img);
pause(wait);
%adhv deze functie worden alle zwarte delen in de afbeelding die geconnecteerd zijn volgens 8-connectiviteit en die kleiner zijn dan een aantal pixels (afhankelijk van de afmetingen) verwijderd.
img=bwareaopen(img, round((h*w)*0.02));
imshow(img);
pause(wait);
%hier worden alle geconnecteerde gelabeld
[L Ne]=bwlabel(not(img));
gem=zeros(1);
for n=1:Ne
%hier gaan we op zoek naar het aantal pixels per geconnecteerde regio, zodat we vervolgens het gemiddelde hiervan als treshold kunnen gebruiken
[r,c] = find(L==n);
n1=img(min®:max®,min©:max©);
gem(n)=bwarea(n1)
end
gem=mean(gem);
tresh=2;
width=0;
height=0;
verhoudingtresh=1.1;
perc=0;
letters={'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'};
str='';
%nu gaan we elke geconnecteerde regio aflopen en zien of ze voldoen aan de specificaties van een letter
for n=1:Ne
[r,c] = find(L==n);
n1=img(min(r):max(r),min(c):max(c));
height=max(r)-min(r)+1;
width=max(c)-min(c)+1;
perc=bwarea(n1)/(height*width);
%als de regio voldoet aan volgende specificaties zal het behandelt worden als een letter anders wordt het verwijderd
%1. de oppervlakte van de regio groter is dan de helft van de gemiddelde oppervlakte van de regio's en kleiner dan het dubbel.
%2. als de hoogte groter is dan de (breedte+10%van de breedte)
%3. Als de regio meer dan 30% van de totale oppervlakte van de gelabelde segmentatie bevat
if(~(bwarea(n1)<gem(1)/tresh || bwarea(n1)>gem(1)*tresh)) && height>(width*verhoudingtresh) && perc>0.3
imshow(n1);
perc2=0;
bestmatch=1;
%zodra de regio voldoet aan bovenstaande specificaties, vergelijken we de regio met afbeeldingen van letters in de database
for(t=1:35)
imfile=strcat('images/ocr/',char(letters(t)),'.jpg');
LL=imread(imfile);
%we maken de database-afbeelding even groot als de regio
LL=imresize(LL,[height width]);
LL = rgb2gray(LL);
level = graythresh(LL);
%we zetten de database afbeelding om naar een binaire afbeelding
LL = im2bw(LL,level);
%we vergelijken de database afbeelding met de regio adhv een logische AND
LL=n1 & LL;
percv=bwarea(LL)/(height*width);
%de regio die procentueel het meest aantal zwarte pixels gelijk heeft met de database afbeelding zal beschouwd worden
%als de letter die we zoeken. Die letter tellen we op bij de string die de nummerplaat moet voorstellen
if(percv>perc2)
perc2=percv;
bestmatch=t;
end
end
str=strcat(char(str),char(letters(bestmatch)));
else
img(min(r):max(r),min(c):max(c))=1;
end
pause(wait);
end
o_str=str
imshow(img);
end
附录B 英文翻译
指导教师制定与专业相关的外文文献内容,由学生独立翻译成中文,其外文文献内容不得少于3000字符。译文和原文附于附录部分,按照正文格式进行排版。若原文没有电子版只是原版的复印件,复印件装订在内可不计页码。
转载:https://blog.csdn.net/weixin_46275484/article/details/106466493