车牌定位程序
- 格式:wps
- 大小:38.00 KB
- 文档页数:9
摘要: 车牌定位是车牌自动识别技术中的一个关键问题,许多学者研究发展多种车牌定位算法。
简要介绍和比较了目前比较常见的几种车牌定位方法进行了。
车牌识别LPR(License Plate RecognitiON)技术作为交通管理自动化的重要手段和车辆检测系统的一个重要环节,能经过图像抓拍、车牌定位、图像处理、字符分割、字符识别等一系列算法运算,识别出视野范围内的车辆牌照号码;它运用数字图像处理、模式识别、人工智能技术对采集到的汽车图像进行处理,能够实时准确地自动识别出车牌的数字、字母及汉字字符,并以计算机可直接运行的数据形式给出识别结果,使得车辆的电脑化监控和管理成为现实。
车牌识别技术的任务是处理、分析摄取的视频流中复杂背景的车辆图像,定位、分割牌照字符,最后自动识别牌照上的字符。
为了保证汽车车牌识别系统能在各种复杂环境下发挥其应有的作用,识别系统必须满足以下要求:(1)鲁棒性:在任何情况下均能可靠正常地工作,且有较高的正确识别率。
(2)实时性:不论在汽车静止还是高速运行情况下,图像的采集识别系统必须在一定时间内识别出车牌全部字符,达到实时识别。
车牌识别技术的关键在于车牌定位、字符分割和字符识别三部分,其中车牌定位的准确与否直接决定后面的字符分割和识别效果,是影响整个LPR系统识别率的主要因素,是车牌识别技术中最为关键的一步。
目前车牌定位的方法多种多样, 归纳起来主要有基于纹理特征分析的方法、基于边缘检测的方法、基于数学形态学定位、基于小波分析定位以及基于彩色图像定位等,这些方法各有所长。
1、车牌目标区域特点车牌定位方法的出发点是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。
车牌自身具有许多的固有特征,这些特征对于不同的国家是不同的。
从人的视觉角度出发,我国车牌具有以下可用于定位的特征:(1)车牌底色一般与车身颜色、字符颜色有较大差异;(2)车牌有一个连续或由于磨损而不连续的边框;(3)车牌内字符有多个,基本呈水平排列,在牌照的矩形区域内存在丰富的边缘,呈现规则的纹理特征;(4)车牌内字符之间的间隔较均匀,字符和牌照底色在灰度值上存在较大的跳变,字符本身和牌照底内部都有比较均匀的灰度;(5)不同图像中牌照的具体大小、位置不确定,但其长宽比在一定的变化范围内,存在1个最大值和1个最小值。
《数字图像处理和模式识别》期末大作业题目:车牌定位班级:计算机应用技术姓名:杭文龙学号:61216020051.引言1.1 选题意义汽车牌照自动识别系统是以汽车牌照为特定目标的专用计算机视觉系统,是计算机视觉和模式识别技术在智能交通领域应用的重要研究课题之一,是实现交通管理智能化的重要环节,它可广泛应用于交通流量检测,交通控制与诱导,机场、港口、小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。
目前,发达国家LPR(汽车牌照识别技术License Plate Recognition, LPR,简称“车牌通”)系统在实际交通系统中已成功应用,而我国的开发应用进展缓慢,车牌识别系统基本上还停留在实验室阶段。
基于这种现状还有它广阔的应用前景,目前对汽车车牌的识别研究就有了深远的意义。
1.2 课题组成汽车车牌的识别过程主要包括车牌定位、字符车牌分割和车牌字符识别三个关键环节。
我在此文章中就只说明其中一点,就是车牌定位,其流程如下:原始图像图像预处理边缘提取车牌定位原始图像:由数码相机或其它扫描装置拍摄到的图像图像预处理:对动态采集到的图像进行滤波,边界增强等处理以克服图像干扰边缘提取:通过微分运算,2值化处理,得到图像的边缘车牌定位:计算边缘图像的投影面积,寻找峰谷点,大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域。
最后得到的便为车牌区域。
本文以一幅汽车图像为例,结合图像处理各方面的知识,利用MATLAB编程,实现了从车牌的预处理到字符识别的完整过程。
各部分的处理情况如下:2.预处理及边缘提取图1 汽车原图图像在形成、传输或变换过程中,受多种因素的影响,如:光学系统失真、系统噪声、暴光不足或过量、相对运动等,往往会与原始景物之间或图像与原始图像之间产生了某种差异,这种差异称为降质或退化。
这种降质或退化对我们的处理往往会造成影响。
因此在图像处理之前必须进行预处理,包括去除噪音,边界增强,增加亮度等等。
请简述车牌识别的工作过程。
车牌识别是人工智能领域中重要的一部分,也是促进智慧停车技术发展的主要动力。
车牌识别通过触发设备、摄像设备、照明设备、图像采集设备、号码识别处理机、缴费终端等硬件设备以及车牌定位、字符分割、字符识别等软件算法来运作车牌识别过程,具体包含以下七个流程:1.图像采集:车牌识别根据车辆检测方式的不同,图像采集一般分为两种,一种是静态模式下的图像采集,通过车辆触发地感线圈、红外或雷达等装置,给相机一个触发信号,相机在接收到触发信号后会抓拍一张图像,该方法的优点是触发率高,性能稳定,缺点是需要切割地面铺设线圈,施工量大;另一种是视频模式下的图像采集,外部不需要任何触发信号,相机会实时地记录视频流图像,该方法的优点是施工方便,不需要切割地面铺设线圈,也不需要安装车检器等零部件,但其缺点也十分显著,由于算法的极限,该方案的触发率与识别率较之外设触发都要低一些。
2.预处理:车牌识别由于图像质量容易受光照、天气、相机位置等因素的影响,所以在识别车牌之前需要先对相机和图像做一些预处理,以保证得到车牌最清晰的图像。
一般会根据对现场环境和已经拍摄到的图像的分析得出结论,实现相机的自动曝光处理、自动白平衡处理、自动逆光处理、自动过爆处理等,并对图像进行噪声过滤、对比度增强、图像缩放等处理。
去噪方法有均值滤波、中值滤波和高斯滤波等;增强对比度的方法有对比度线性拉伸、直方图均衡和同态滤波器等;图像缩放的主要方法有最近邻插值法、双线性插值法和立方卷积插值法等。
3.车牌定位:车牌识别从整个图像中准确地检测出车牌区域,是车牌识别过程的一个重要步骤,如果定位失败或定位不完整,会直接导致最终识别失败。
由于复杂的图像背景,且要考虑不清晰车牌的定位,所以很容易把栅栏,广告牌等噪声当成车牌,所以如何排除这些伪车牌也是车牌定位的一个难点。
为了提高定位的准确率和提高识别速度,一般的车牌识别系统都会设计一个外部接口,让用户自己根据现场环境设置不同的识别区域。
常用车牌定位算法比较一、引言近年来,随着国民经济的快速发展,各种机动车辆不断增加,导致道路交通流量不断增大,交通事故、交通堵塞等问题日益严重,我们正面临着路网通行能力不能满足交通量增长需求以及交通运输安全等问题。
为了解决这些问题,国外发达国家相继推出了适应未来运输需求的智能交通系统,我国也将发展智能交通系统作为今后交通建设的一个重要发展方向。
作为现代智能交通系统中的一项非常重要的技术,汽车牌照自动识别技术是近几年来的研究热点。
车牌识别系统LPR既具有重要的理论意义,也具有良好的实际应用价值,并且在现实生活中已经得到一定程度的应用。
由于其具有良好的发展前景,所以车牌识别系统的开发和研制工作在国内外皆受到相当大的关注。
其涉及的领域包括模式识别、图像处理、人工智能、信息论、计算机等多门学科,是一门综合的应用技术。
车牌定位是车牌识别技术的第一个关键技术,定位的准确与否直接影响着车牌识别的准确率。
在车牌定位算法中,关键是寻找某种图像处理方法,使原始图像经过该算法的处理后能够清楚地显示出车牌区域,同时使图像中的非车牌区域消失或者减弱,从而能准确有效地定位出车牌在图像中的位置。
现在已经存在的车牌定位的方法有纹理分析、汽车牌照颜色变化、还有数学形态学等很多方法。
车牌定位不准的原因往往是因为含车牌图像中存在着大量噪声、图像的质量较差等原因造成的;而由于处理图像的数据过大,往往造成用时过多,从而不符合实时性要求。
因此,本文对目前存在的车牌定位算法进行探讨,希望能找出各种算法的优缺点,以便在现实中能更好的运用各种算法,更好的发挥各算法自身的优势。
二、目前存在的各种车牌定位算法目前存在的车牌定位算法主要有:边缘检测法、数学形态学法、基于彩色或者灰度处理的方法、行检测和边缘统计法、模糊逻辑法、Gabor滤波法、遗传算法、Hough变化和轮廓线法、自适应增压法、基于小波变换的方法、均衡变换法、神经网络法、脉冲耦合神经网络法、时延神经网络法、矢量量化方法等。
毕业设计(论文)题目:汽车牌照定位系统设计与开发诚信承诺书本人郑重声明:所呈交的毕业设计(论文)汽车牌照定位系统设计与开发是本人在导师的指导下独立进行研究所取得的成果,其内容除了在毕业设计(论文)中特别加以标注引用,表示致谢的内容外,本毕业设计(论文)不包含任何其他个人、集体已发表或撰写的成果作品。
班级:计科94学号:0921144作者姓名:2013 年5 月25 日无锡太湖学院信机系计算机科学与技术专业毕业设计论文任务书一、题目及专题:1、题目汽车牌照定位系统设计与开发2、专题二、课题来源及选题依据课题来源:导师指定选题依据:汽车车牌识别系统是近几年发展起来的计算机视觉和模式识别技术在智能交通领域应用的重要研究课题之一。
在车牌自动识别系统中,首先要将车牌从所获取的图像中分割出来实现车牌定位。
这是进行车牌字符识别的重要步骤,定位的准确与否直接影响车牌识别率。
车辆牌照定位与识别是计算机视觉与模式识别技术在智能交通领域应用的重要研究课题之一,该技术应用范围非常广泛,其中包括:(1)交通流量检测;(2)交通控制与诱导;(3)机场、港口等出入口车辆管理;(4)小区车辆管理;(5)闯红灯等违章车辆监控;(6)不停车自动收费;(7)道口检查站车辆监控;(8)公共停车场安全防盗管理;(9)计算出行时间等。
其潜在在市场应用价值极大,有能力产生巨大的社会效益和经济效益。
三、本设计(论文或其他)应达到的要求:软件、技术要求:在基于图像处理的车牌识别技术的基础上设计并开发了一个基于MATLAB的车牌定位系统通过编写MATLAB文件对各种车辆图像处理方法进行分析、比较,最终确定了车牌预处理、车牌粗定位和精定位的方法。
四、接受任务学生:计科94 班姓名宋开拓五、开始及完成日期:自2012 年11 月12 日至2013年5月25日六、设计(论文)指导(或顾问):指导教师签名签名签名教研室主任〔学科组组长〕签名研究所所长系主任签名2012年11月12日车辆牌照识别系统(vehicle license plate recognition system,简称LPR)是现代智能交通系统中的一项重要研究课题,是实现智能交通的重要环节,涉及领域异常广阔。
车牌定位本人的毕设收集资料a.一些算法1.基于纹理特征的车牌定位法车辆图像随拍摄环境的变化而不同,然而车辆牌照具有不因外部条件变化而改变的特征。
车牌内有多个基本成水平排列的字符,字符和牌照底在灰度值上存在跳变,因而车牌这个矩形区域(包括边缘)有丰富的边缘存在,呈现出规则的纹理特征。
在传统的基于灰度分割技术上,这些特征为车牌定位研究提供了切实可行的依据。
基于纹理分析的方法利用车牌区域内字符纹理丰富的特征定位车牌,它对于光照偏弱、偏强、不均匀性、牌照倾斜和变形等情况不敏感。
但该方法应用于背景复杂的图像时,容易把一些纹理分布较丰富的非车牌区域定位进来,产生包含车牌在内的车牌候选区域,这是纹理分析方法的缺陷。
2.基于神经网络的定位算法利用神经网络来定位车牌是一类较为常见的方法。
本算法的基本步骤和各模块的功能如下:(1)神经网络训练模块:收集一定数量的车牌图像样本,归一化后输入至BP神经网络进行训练,达到预定的正确率后,训练结束。
本模块将获得取两个波谷的区域为边界,确定车牌在行方向的区域。
在分割出的行区域内,用相同的方法统计列方向的底色像素点数量,取图像对蓝色或黑色的垂直投影的两个波谷为左右边界,最终确定完整的车牌区域。
通过定位修正能更准确找到车牌图像的上下边界。
基于特征统计定位算法的定位结果如图3-1所示。
从原始图像可以看到,车体和车牌颜色对比明显,车体主要为黑色,而车牌为蓝色背景,白色字体。
车体和车牌颜色的明显对比为算法提供了基础。
此算法缺陷在于:车牌颜色必须不同于图像整体背景色,否则无法提取出车牌区域。
5基于改进SobeI算子边缘检测法传统Sobcl算子只有水平和垂直两个方向模板;其中水平模板对水平边缘的响应最大,垂直模板对垂直边缘响应最大。
模板的方向表示灰度由低到高或由高到低的变化方向,而不是图像的实际边缘方向。
通过对车牌字符的垂直方向和斜线方向进行划分,本文采用六方向模板,算法实现的基本思想:构造六方向模板,对图像进行逐点计算,取最大值作为该点的新灰度值,该最大值对应模板的方向为该像素点的边缘方向。
车牌识别(⼀)-车牌定位在对车牌识别过程中,常⽤的⽅法有:基于形状、基于⾊调、基于纹理、基于⽂字特征等⽅法。
⾸先基于形状,在车牌中因为车牌为形状规格的矩形,所以⽬的转化为寻找矩形特征,常常是利⽤车牌长宽⽐例特征、占据图像的⽐例等。
基于⾊调,国内的车牌往往是蓝底⽩字,可以采⽤图像的⾊调或者饱和度特征,进⼊⽣成⼆值图,定位车牌位置。
基于纹理特征⾃⼰还没有基础到。
基于⽂字特征往往是根据⽂字轮廓特征进⾏识别,原理是基于相邻⽂字轮廓特征、⽐例进⾏定位车牌位置。
⼀、图像⼆值化正如前⾯⽂章所⾔,⾸先进⾏获取图像⼆值化特征,本⽂采取了根据图像亮度特征,提⾼对⽐度,进⾏可以清晰获取⽂字的图像,为下⼀步的⽂字轮廓识别打好基础。
1.1 算法流程伪代码1、图像转化为HSV图像,获取V通道图像2、提⾼对⽐度3、V图像⾼斯滤波,去除噪声4、图像⼆值化程序源码:def get_colorvalue(image):height, width, shape = image.shapeimage_hsv = np.zeros((height,width), np.uint8)image_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)image_hue, image_saturation, image_value = cv2.split(image_hsv)return image_valuedef enhance_contrast(image):kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))img_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT,kernel)img_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)image_plus_tophat = cv2.add(image, img_tophat)image_plus_blackhat_minus_blackhat = cv2.subtract(image_plus_tophat, img_blackhat)return image_plus_blackhat_minus_blackhatdef preprocess(srcimage):image_value = get_colorvalue(srcimage)image_enhance = enhance_contrast(image_value)image_blur = cv2.GaussianBlur(image_enhance, (5,5), 0)# _, image_binary = cv2.threshold(image_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)_, image_binary = cv2.threshold(image_blur, 100, 255, cv2.THRESH_BINARY )cv2.imwrite('image_binary.png',image_binary)return image_binary1.2 算法分析在实验中在获取通道图像时,发现可以利⽤图像饱和度图像进⾏定位。
几种车牌定位识别方法的比较车牌识别系统是智能交通系统的一个重要组成部分,一个典型的车牌识别系统一般包括图像预处理、车牌定位与提取、字符分割和字符识别等几大模块。
其中车牌定位是车牌识别中的关键,车牌定位的成功与否直接影响是否能够进入车牌识别以及车牌识别的准确率。
目前,车牌定位的主要方法有:①基于灰度图像的车牌定位方法;②基于小波变换的车牌定位方法;③基于形态学的车牌定位方法;④基于神经网络的车牌定位方法;⑤基于支持向量机的车牌定位方法等。
这些算法,在某些特定条件下,识别效果较好。
但在恶劣条件下,综合一些诸如天气、背景、车牌磨损和图像倾斜等干扰因素的影响,还不能完全满足实际应用的要求,有待进一步研究。
各种车牌定位方法的思路、方法和优缺点比较:①基于灰度图像的车牌定位方法:灰度数字图像是每个像素只有一个采样颜色的图像。
这类图像通常显示为从黑色到白色的灰度。
为了便于车牌定位,将该图像转换成二值图像,即只有黑色和白色两种颜色的图像。
此方法是应用车牌的如下特点:车牌牌照的字符和背景的对比度比较大,对应于车牌区域的水平灰度变化比较频繁;再者车牌一般挂在汽车的缓冲器上或附近,并靠近图像的下部,干扰一般比较少。
根据以上特点,使用靠近水平方向的一阶差分运算,以突出灰度变化频繁的区域. 其一阶差分运算的算式为:g(i,g)=f(i,i)-f(i,j+1),式中,i=,2,3... m:m为图像的宽度;j=1,2 ,3…,n :n为图像的宽度。
再对图像的水平差分图像g(x ,y) 的灰度值沿水平方向累加后做投影,可得投影图:水平方向累加后投影的算式为:T(i) = ∑n j=1 g(i,j)。
从车牌照是一个矩形这一特点, 我们可以判断它所对应的水平投影图与车牌的形状相仿,是一块较为独立的矩形区域,从水平投影图中可以看车牌位置基本对应子图中从下到上的第一个较大的波蜂,车牌投影值区域大致对应干上述波峰值上、下邻域的波谷之间所包含的投影值区域,且这两个波谷大致对称于波峰,波峰和波谷的变化率较大. 在这个过程中最重要的是确定选择哪个波峰,如果这个波峰的两个波谷之间的值的高度都大于某一个设定的值,并且两个波谷之间的宽度大致等于车牌照的高度,就认定它所确定的区域就是车牌的水平位置. 对于车牌垂直方向的定位算法:一般情况下,车牌的底色和字符的颜色的对比度很大, 而且在一个相对范围较小的范围内变化比较频繁,通过这个特征确定车牌垂直方向. 该方法对质量较高的图像有很好的定位,不过对于图像中车前和车牌附近的车辆背景过多,容易导致错误的车牌定位。
《车牌定位》专业:计算机科学与技术学号:19100211姓名:叶超日期: 2013年5月车牌定位一、引言机动车车牌自动识别是智能交通控制系统中的一个重要组成部分,可广泛用于高速收费站、停车场管理、十字路口违章车辆记录等领域。
车牌识别的方法有很多,主要分为几大类,有基于彩色的方法、基于灰度梯度的方法、基于搜索车牌边框的方法、基于边缘检测的方法、基于数学形态学的方法。
二、车牌识别的一般方法识别。
通俗来讲就是,第一步找到车牌在图片中在哪一块区域,第二步将找到的区域图片分割成一个个的字符,第三步识别每个字符并得出最终的结果。
本文主要就车牌定位方法做一些研究和说明。
三、车牌定位车牌定位有多种方法,前文已经讲过。
本文主要使用灰度边缘检测的方法来定位车牌。
流程:(1)打开图片第一步,打开图片,不用说,直接打开图片就好。
本文所配程序为winform 程序,直接将图片绑定到picturebox 控件上显示。
(2)预处理预处理的作用是将图片变得有利于处理,比如彩色图像信息量比较大,可以转化为灰度图像;图像中噪点比较多不利于后期处理,可以进行去噪处理。
①灰度化将彩色图像转化为灰度图像,用到一般简单的彩色转灰度的公式:gray = (int)(c1.B * 0.114 + c1.G * 0.587 + c1.R * 0.299) ,其中c1是box1.GetPixel(i,j)即为遍历的每个点。
然后用双重循环将每个点的RGB颜色重新赋值,c2 = Color.FromArgb(gray, gray, gray); box2.SetPixel(i, j, c2);②去噪去噪是为了去除数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响。
去噪的方法有很多,这里采用效果较好的高斯滤波去噪。
高斯去噪主要就是用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
这里模型取中心点的八联通区域,采用加权平均。
3.1车牌区域定位3.1.1定位算法研究车牌定位是车牌识别系统的一项关键技术,也是难点之一。
因为现场采集的车辆图像受环境影响,采集的车辆图像质量波动较大,同时存在其它字符区域的干扰,使得真实车牌区域难以准确定位。
第二章中已经采用图像滤波、二值化、边缘检测等预处理方法增强图片效果,本章主要解决车辆图像中准确定位车牌区域的问题。
车牌图像的定位处理算法,常用的有以下几种:1.基于纹理特征的车牌定位法车辆图像随拍摄环境的变化而不同,然而车辆牌照具有不因外部条件变化而改变的特征。
车牌内有多个基本成水平排列的字符,字符和牌照底在灰度值上存在跳变,因而车牌这个矩形区域(包括边缘)有丰富的边缘存在,呈现出规则的纹理特征。
在传统的基于灰度分割技术上,这些特征为车牌定位研究提供了切实可行的依据。
基于纹理分析的方法利用车牌区域内字符纹理丰富的特征定位车牌,它对于光照偏弱、偏强、不均匀性、牌照倾斜和变形等情况不敏感。
但该方法应用于背景复杂的图像时,容易把一些纹理分布较丰富的非车牌区域定位进来,产生包含车牌在内的车牌候选区域,这是纹理分析方法的缺陷。
2.基于神经网络的定位算法利用神经网络来定位车牌是一类较为常见的方法。
本算法的基本步骤和各模块的功能如下:(1)神经网络训练模块:收集一定数量的车牌图像样本,归一化后输入至BP神经网络进行训练,达到预定的正确率后,训练结束。
本模块将获得一个对车牌敏感的BP神经网络。
(2)图像预处理模块:提取车牌前,对图像进行预处理;抑制噪声,提高图片质量。
(3)车牌定位模块:利用训练好的神经网络在图像中搜索车牌区域,定位车牌。
本方法的特点是从车牌区域特征来判别牌照,因此在搜索时会重点考虑以下表面特征(如边缘、对比度、纹理等)而忽视图像区域的内容。
有用信号的特征有时会误导搜索,如果因为定位模块忽视了非牌照区域包含的车牌特征信号点,将这些区域送入后续步骤将会影响车牌字符识别。
4基于特征统计的车牌定位基于特征统计的车牌定位利用车牌区域的结构特征和字符纹理特征。
一种车牌定位的有效方法11.简介车牌定位在智能交通系统中的机动车辆牌照识别有着很重要的地位。
这篇论文介绍了一种实时的并且有效的牌照定位方法。
牌照的区域包括了很丰富的边缘以及文字信息,我们首先利用图形增强法以及Sobel算子将车子上垂直方向的边缘全部提取出来,接着运用行之有效的算法将大部分噪声背景和边缘移除,最后我们在剩余的边缘中用矩形窗来得到了牌照的区域并且将这个区域从车的原始图像中分离出来。
实验结果表明这个方法是很有效的。
Fig. 1. An example car image with 384 · 288 pixels and 256 gray levels (图1,有384×248象素和256级灰度的汽车图像实例)这篇论文旨在找到一个来认证个人身份证件如身份证、驾驶执照、照片等的方法。
这种方法尝以特定的图像处理方法从相关文件中得到一个图像签名。
在这里利用的是基于离散余弦转化的方法来获得这个签名的。
这给一些特别的文件提供了一种独特的相当压缩的签名,如果要应用于一个很庞大的数据库,这个签名也可以提供散列法索引,实验证明在大型数据库中使用可以达到预期目标。
个人身份认证文件比如护照、带照片的身份证、信用卡、选民身份证等等,现在都被很广泛的应用。
它们越来越多的被应用于像保险、银行、政府办公室的认证、医疗服务、航空、对进入有限制的区域的验证以及最近流行的电子商务等等各种领域。
但是除此以外,为了达到违法的目的已经出现了这类身份认证文件的赝品。
这是利用了图像技术的飞快进步,比如彩色打印、复制以及扫描。
赝品是伪造一个卡然后贴上其他人的照片来代替它真实的照片。
这样就制造了一个合法的卡,因为它上面的文字信息都是完全正确的。
这种卡能大行其道是因为现在使用中的卡没有将卡上的文字内容与照片联系起来。
本文我们设计了一种新的基于签名生成技术的新1图像,它可用来检测这些赝品。
这些签名会被保存在一个安全的数据库中,或者被保存在一个加密文件中。
OpenCV下车牌定位算法实现代码(一)车牌定位算法在车牌识别技术中占有很重要地位,一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。
车牌定位有很多种算法,从最简单的来,车牌在图像中一般被认为是长方形,由于图像摄取角度不同也可能是四边形。
我们可以使用OpenCV中的实例:C:\Program Files\OpenCV\samples\c.squares.c 这是一个搜索图片中矩形的一个算法。
我们只要稍微修改一下就可以实现定位车牌。
在这个实例中使用了canny算法进行边缘检测,然后二值化,接着用cvFindContours搜索轮廓,最后从找到的轮廓中根据角点的个数,角的度数和轮廓大小确定,矩形位置。
以下是效果图:这个算法可以找到一些车牌位置,但在复杂噪声背景下,或者车牌图像灰度与背景相差不大就很难定位车牌。
所以我们需要寻找更好的定位算法。
下面是squares的代码:#ifdef _CH_#pragma package <opencv>#endif#ifndef _EiC#include "cv.h"#include "highgui.h"#include <stdio.h>#include <math.h>#include <string.h>#endifint thresh = 50;IplImage* img = 0;IplImage* img0 = 0;CvMemStorage* storage = 0;CvPoint pt[4];const char* wndname = "Square Detection Demo";// helper function:// finds a cosine of angle between vectors// from pt0->pt1 and from pt0->pt2double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 ){double dx1 = pt1->x - pt0->x;double dy1 = pt1->y - pt0->y;double dx2 = pt2->x - pt0->x;double dy2 = pt2->y - pt0->y;return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10); }// returns sequence of squares detected on the image.// the sequence is stored in the specified memory storageCvSeq* findSquares4( IplImage* img, CvMemStorage* storage ){CvSeq* contours;int i, c, l, N = 11;CvSize sz = cvSize( img->width & -2, img->height & -2 );IplImage* timg = cvCloneImage( img ); // make a copy of input imageIplImage* gray = cvCreateImage( sz, 8, 1 );IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 );IplImage* tgray;CvSeq* result;double s, t;// create empty sequence that will contain points -// 4 points per square (the square's vertices)CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );// select the maximum ROI in the image// with the width and height divisible by 2cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ));// down-scale and upscale the image to filter out the noisecvPyrDown( timg, pyr, 7 );cvPyrUp( pyr, timg, 7 );tgray = cvCreateImage( sz, 8, 1 );// find squares in every color plane of the imagefor( c = 0; c < 3; c++ ){// extract the c-th color planecvSetImageCOI( timg, c+1 );cvCopy( timg, tgray, 0 );// try several threshold levelsfor( l = 0; l < N; l++ ){// hack: use Canny instead of zero threshold level.// Canny helps to catch squares with gradient shadingif( l == 0 ){// apply Canny. Take the upper threshold from slider// and set the lower to 0 (which forces edges merging)cvCanny( tgray, gray,60, 180, 3 );// dilate canny output to remove potential// holes between edge segmentscvDilate( gray, gray, 0, 1 );}else{// apply threshold if l!=0:// tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0//cvThreshold( tgray, gray, (l+1)*255/N, 255, CV_THRESH_BINARY ); cvThreshold( tgray, gray, 50, 255, CV_THRESH_BINARY );}// find contours and store them all as a listcvFindContours( gray, storage, &contours, sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );// test each contourwhile( contours ){// approximate contour with accuracy proportional// to the contour perimeterresult = cvApproxPoly( contours, sizeof(CvContour), storage,CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0 );// square contours should have 4 vertices after approximation// relatively large area (to filter out noisy contours)// and be convex.// Note: absolute value of an area is used because// area may be positive or negative - in accordance with the// contour orientationif( result->total == 4 &&fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 &&cvCheckContourConvexity(result) ){s = 0;for( i = 0; i < 5; i++ ){// find minimum angle between joint// edges (maximum of cosine)if( i >= 2 ){t = fabs(angle((CvPoint*)cvGetSeqElem( result, i ),(CvPoint*)cvGetSeqElem( result, i-2 ),(CvPoint*)cvGetSeqElem( result, i-1 )));s = s > t ? s : t;}}// if cosines of all angles are small// (all angles are ~90 degree) then write quandrange// vertices to resultant sequenceif( s < 0.3 )for( i = 0; i < 4; i++ )cvSeqPush( squares,(CvPoint*)cvGetSeqElem( result, i ));}// take the next contourcontours = contours->h_next;}}}// release all the temporary imagescvReleaseImage( &gray );cvReleaseImage( &pyr );cvReleaseImage( &tgray );cvReleaseImage( &timg );return squares;}// the function draws all the squares in the imagevoid drawSquares( IplImage* img, CvSeq* squares ){CvSeqReader reader;IplImage* cpy = cvCloneImage( img );int i;// initialize reader of the sequencecvStartReadSeq( squares, &reader, 0 );// read 4 sequence elements at a time (all vertices of a square)for( i = 0; i < squares->total; i += 4 ){CvPoint* rect = pt;int count = 4;// read 4 verticesmemcpy( pt, reader.ptr, squares->elem_size );CV_NEXT_SEQ_ELEM( squares->elem_size, reader );memcpy( pt + 1, reader.ptr, squares->elem_size );CV_NEXT_SEQ_ELEM( squares->elem_size, reader );memcpy( pt + 2, reader.ptr, squares->elem_size );CV_NEXT_SEQ_ELEM( squares->elem_size, reader );memcpy( pt + 3, reader.ptr, squares->elem_size );CV_NEXT_SEQ_ELEM( squares->elem_size, reader );// draw the square as a closed polylinecvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 );}// show the resultant imagecvShowImage( wndname, cpy );cvReleaseImage( &cpy );}void on_trackbar( int a ){if( img )drawSquares( img, findSquares4( img, storage ) );}char* names[] = { "pic1.png", "pic2.png", "pic3.png","pic4.png", "pic5.png", "pic6.png", 0 };int main(int argc, char** argv){int i, c;// create memory storage that will contain all the dynamic datastorage = cvCreateMemStorage(0);for( i = 0; names[i] != 0; i++ ){// load i-th imageimg0 = cvLoadImage( names[i], 1 );if( !img0 ){printf("Couldn't load %s\n", names[i] );continue;}img = cvCloneImage( img0 );// create window and a trackbar (slider) with parent "image" and set callback// (the slider regulates upper threshold, passed to Canny edge detector)cvNamedWindow( wndname,0 );cvCreateTrackbar( "canny thresh", wndname, &thresh, 1000, on_trackbar );// force the image processingon_trackbar(0);// wait for key.// Also the function cvWaitKey takes care of event processingc = cvWaitKey(0);// release both imagescvReleaseImage( &img );cvReleaseImage( &img0 );// clear memory storage - reset free space positioncvClearMemStorage( storage );if( c == 27 )break;}cvDestroyWindow( wndname );return 0;}#ifdef _EiCmain(1,"squares.c");#endifOpenCV下车牌定位算法实现代码(二)前面介绍了用OpenCV的squares实例定位车牌的算法,效果不是很理想。
研究设计 电 子 测 量 技 术 EL ECTRONIC M EASUREM EN T TEC HNOLO GY 第30卷第12期2007年12月 智能交通系统中车牌定位算法杨 超 杨鼎才(燕山大学信息科学与工程学院 秦皇岛 066004)摘 要:对于智能交通系统(俗称“电子警察”)来说,车牌自动识别技术是其中最核心最重要的技术,而从获取的汽车图像中定位车牌区域又是进行车牌识别的先决条件和关键步骤。
本文对车牌定位算法进行了较为完整的阐述:首先,根据车辆牌照的自身特点,利用图像处理技术对初始图像进行预处理;然后,采用模糊模板匹配算法对车牌区域进行定位;最后,对发生倾斜的车牌图像使用改进的Hough变换算法进行校正。
实验结果表明,该算法可以准确的定位车牌图像,使车牌区域较完整的显现出来。
关键词:车牌定位;模板匹配;Hough变换中图分类号:TP391.4 文献标识码:ALicense plate location algorithm in the intelligent transportation systemYang Chao Yang Dingcai(College of Information Science and Engineering,YanShan University,Qinhuangdao066004)Abstract:In the Intelligent Transportation System which is called electronic police,license plate recognition technology is the most important and central technology,and the process of license plate district location f rom the car image is a key process and a crucial condition in the license plate recognition.This paper perfectly explains license plate location algorithm:first,we use image process technology to deal with the initial image;second,we employ template matching algorithm to locate the district of license plate;finally,we use improved Hough transform algorithm to rectify the inclined license plate image.The experimental results demonstrate that using this method to locate license plate can get a high accuracy.The district of license plate can be perfectly presented.K eyw ords:license plate location;template matching;Hough transform0 引 言在车牌自动识别系统中,车牌区域的确定是进行车牌识别的先决条件和关键步骤,车牌定位的准确与否直接影响到字符分割和字符识别的准确率,甚至影响到整个系统的功能。
python+opencv实现车牌定位写在前⾯HIT⼤三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对⽐发现每⼀级实验要求都不⼀样,因此这⾥标明了是2019年秋季学期的视觉实验三。
由于时间紧张,代码没有进⾏任何优化,实验算法仅供参考。
实验要求对给定的车牌进⾏车牌识别实验代码代码⾸先贴在这⾥,仅供参考实验代码如下:import cv2import numpy as npdef lpr(filename):img = cv2.imread(filename)# 预处理,包括灰度处理,⾼斯滤波平滑处理,Sobel提取边界,图像⼆值化# 对于⾼斯滤波函数的参数设置,第四个参数设为零,表⽰不计算y⽅向的梯度,原因是车牌上的数字在竖⽅向较长,重点在于得到竖⽅向的边界# 对于⼆值化函数的参数设置,第⼆个参数设为127,是⼆值化的阈值,是⼀个经验值gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)GaussianBlur_img = cv2.GaussianBlur(gray_img, (3, 3), 0)Sobel_img = cv2.Sobel(GaussianBlur_img, -1, 1, 0, ksize=3)ret, binary_img = cv2.threshold(Sobel_img, 127, 255, cv2.THRESH_BINARY)# 形态学运算kernel = np.ones((5, 15), np.uint8)# 先闭运算将车牌数字部分连接,再开运算将不是块状的或是较⼩的部分去掉close_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)open_img = cv2.morphologyEx(close_img, cv2.MORPH_OPEN, kernel)# kernel2 = np.ones((10, 10), np.uint8)# open_img2 = cv2.morphologyEx(open_img, cv2.MORPH_OPEN, kernel2)# 由于部分图像得到的轮廓边缘不整齐,因此再进⾏⼀次膨胀操作element = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))dilation_img = cv2.dilate(open_img, element, iterations=3)# 获取轮廓contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 测试边框识别结果# cv2.drawContours(img, contours, -1, (0, 0, 255), 3)# cv2.imshow("lpr", img)# cv2.waitKey(0)# 将轮廓规整为长⽅形rectangles = []for c in contours:x = []y = []for point in c:y.append(point[0][0])x.append(point[0][1])r = [min(y), min(x), max(y), max(x)]rectangles.append(r)# ⽤颜⾊识别出车牌区域# 需要注意的是这⾥设置颜⾊识别下限low时,可根据识别结果⾃⾏调整dist_r = []max_mean = 0for r in rectangles:block = img[r[1]:r[3], r[0]:r[2]]hsv = cv2.cvtColor(block, cv2.COLOR_BGR2HSV)low = np.array([100, 60, 60])up = np.array([140, 255, 255])result = cv2.inRange(hsv, low, up)# ⽤计算均值的⽅式找蓝⾊最多的区块mean = cv2.mean(result)if mean[0] > max_mean:max_mean = mean[0]dist_r = r# 画出识别结果,由于之前多做了⼀次膨胀操作,导致矩形框稍⼤了⼀些,因此这⾥对于框架+3-3可以使框架更贴合车牌cv2.rectangle(img, (dist_r[0]+3, dist_r[1]), (dist_r[2]-3, dist_r[3]), (0, 255, 0), 2)cv2.imshow("lpr", img)cv2.waitKey(0)# 主程序for i in range(5):lpr(str(i+1) + ".jpg")参数调整上述代码中,所有涉及到参数调整的函数,例如形态学操作,都需边调整边观察当前参数下的运⾏结果,待本步运⾏结果较好时,再继续写下⼀步。
I=imread('18.jpg');I=imresize(I,[515,407]);figure(1),imshow(I);Scolor=I;Scolor = imread('3.jpg');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图像figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strei函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减figure,imshow(Egray);title('增强黑白图像');%输出黑白图像bw2=im2bw(Egray,graythresh(Egray));figure,imshow(bw2);title('图像二值化');%得到二值图像SE=strel('disk',2);bw3=imerode(bw2,SE);grd=imsubtract(bw2,bw3);figure,imshow(grd);bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。
进行区域特征参数比较,提取车牌区域[L,num] = bwlabel(bg2,8);%标注二进制图像中已连接的部分Feastats = imfeature(L,'basic');%计算图像区域的特征尺寸Area=[Feastats.Area];%区域面积BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌的框架大小RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %标志图像向RGB 图像转换figure,imshow(RGB);title('图像彩色标记');%输出框架的彩色图像lx=0;for L=1:numwidth=BoundingBox((L-1)*4+3);%框架宽度的计算hight=BoundingBox((L-1)*4+4);%框架高度的计算if (width>98 & width<160 & hight>25 & hight<50)%框架的宽度和高度的范围lx=lx+1;Getok(lx)=l;endendfor k= 1:lxL=Getok(k);startcol=BoundingBox((L-1)*4+1)-2;%开始列startrow=BoundingBox((L-1)*4+2)-2;%开始行width=BoundingBox((L-1)*4+3)+8;%车牌宽hight=BoundingBox((L-1)*4+4)+2;%车牌高rato=width/hight;%计算车牌长宽比if rato>2 & rato<4break;endendsbw1=bw2(startrow:startrow+hight,startcol:startcol+width-1);%获取车牌二值子图subcol1=Sgray(startrow:startrow+hight,startcol:startcol+width-1);%获取车牌灰度子图figure,subplot(2,1,1),imshow(subcol1);title('车牌灰度子图');%输出灰度图像subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出车牌的二值图filename='241.jpg';I=im2gray(filename);%调用自编函数读取图像,并转化为灰度图象;tic %计时开始[height,width]=size(I);%预处理I_edge=zeros(height,width);% 创建height*width的矩阵for i=1:width-1 % 对每一列开始遍历I_edge(:,i)=abs(I(:,i+1)-I(:,i));% 每列的值赋为原图像中左右两列相减的绝对值(即梯度)end% 归一化处理(0~255)I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));figureimshow(I_edge);title('归一化处理')[I_edge,y1]=select(I_edge,height,width); %%%%%%调用select函数figureimshow(I_edge);title('选择')BW2 = I_edge;%%%%%%%%%%%%%%%%%一些形态学处理SE=strel('rectangle',[10,10]);IM2=imerode(BW2,SE);%腐蚀figureimshow(IM2);title('腐蚀');IM2=bwareaopen(IM2,20);%开运算,消除细小物体figureimshow(IM2);title('开运算');IM3=imdilate(IM2,SE);%膨胀figureimshow(IM2);title('膨胀');%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置p_h=projection(double(IM3),'h'); %调用projection函数if(p_h(1)>0)p_h=[0,p_h];endp_v=projection(double(IM3),'v'); %调用projection函数if(p_v(1)>0)p_v=[0,p_v];end%%%%%%p_h=double((p_h>5));p_h=find(((p_h(1:end-1)-p_h(2:end))~=0));len_h=length(p_h)/2;%%%%%p_v=double((p_v>5));p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));len_v=length(p_v)/2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%粗略计算车牌候选区k=1;for i=1:len_hfor j=1:len_vs=IM3(p_h(2*i-1):p_h(2*i),p_v(2*j-1):p_v(2*j));if(mean(mean(s))>0.1)p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];k=k+1;endendendk=k-1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进一步缩小车牌候选区for i=1:kedge_IM3=double(edge(double(IM3(p{i}(1):p{i}(2),p{i}(3):p{i}(4))),'canny')); [x,y]=find(edge_IM3==1);p{i}=[p{i}(1)+min(x),p{i}(2)-(p{i}(2)-p{i}(1)+1-max(x)),...p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];p_center{i}=[fix((p{i}(1)+p{i}(2))/2),fix((p{i}(3)+p{i}(4))/2)];p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1));end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对上面参数和变量的说明:p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;%存放格式为:p{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标%p_ratio为一矩阵,用来存放图像块的长宽比例%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合并临近区域%%%%%%%%如果有多个区域则执行合并if k>1n=0;ncount=zeros(1,k);for i=1:k-1%%%需要调整if条件中的比例%%%需要调整%检查是否满足合并条件if(abs(p{i}(1)+p{i}(2)-p{i+1}(1)-p{i+1}(2))<=height/30&&abs(p{i+1}(3)-p{i}(4))<=width/15)p{i+1}(1)=min(p{i}(1),p{i+1}(1));p{i+1}(2)=max(p{i}(2),p{i+1}(2));p{i+1}(3)=min(p{i}(3),p{i+1}(3));p{i+1}(4)=max(p{i}(4),p{i+1}(4)); %向后合并n=n+1;ncount(n)=i+1;endend%如果有合并,求出合并后最终区域if(n>0)d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。