基于Python的车牌识别技术的实现

2019-10-21 05:42霍立志
西部论丛 2019年25期
关键词:车牌识别

摘 要:本课题研究内容是基于传统方法实现对车牌号码的识别,运用了计算机视觉等方面的知识。总体设计方案包括图像获取、图像预处理、目标区域检测、目标区域分割、目标区域处理、字符分割以及字符识别及输出。Python 因为它易读、易维护的特点,近年来迅速成为被大量用户所广泛应用和受欢迎的编程开发语言。所以此次选择使用 Python 来完成本次课题的实现。Open CV 应用范围广泛,它还可以提供 Python、Matlab 等语言接口来实现图像处理和计算机视觉中的许多通用算法。本课题设计主要结构采用 Python+Open CV 来实现完成。

关键词:车牌识别;Python;Open CV

汽车的出现改变了步行和骑自行车的时代,更加便于人们日常出行,增加了人们之间的良好沟通。汽车为我们的旅行提供了便利,也给城市的交通造成了压力。来自城市的车辆进行有效的实时监测和管理,能提高智能运输的效率,有效地减少了人工的操作。这不仅节省费用,而且在一定程度上还能杜绝工作人员乱收费,违规操作的问题。因为这诸多原因,社会整体对实现车牌识别技术寄予了厚望。在这项技术中,国外的科技人员要比国内提前一步开始进行研究,其主要方法便是运用图像处理技术将其运用到实际应用之中,牌照识别技术研究没有产生完整的系统。但基于当时的科技水平,使用简单的图像处理技术,以此用于实际生活中的一些具体问题,如果想要得到最终人们想要的结果,则需要工作人员的手动参与。20 世纪 90 年代以后,我国对车牌自动识别系统的研究开始了。一些高端院校与机构同样对此类技术进行了深入的探索,研究期间,需要克服的环境干扰问题极为繁多。截止至今日,国内对于车牌自动识别系统技术的研究已经取得了较为巨大的进步,并且其中较为成熟的产品已经投入使用。本文的主题和内容是使用 Python+ Open CV 技术来提高车牌识别效率。

1研究框架

本课题研究内容是基于传统方法实现对车牌号码的识别,运用数字图像处理、计算机视觉方面的知识。总体设计方案包括图像获取、图像预处理、目标区域檢测、目标区域分割、目标区域处理、字符分割以及字符识别及输出。如图 1 所示为整体设计思路框图。

2图像读取

使用 Python 对图像进行读取有两种方式。

第一种是利用 Open CV 提供的 cv.imread()函数和 cv.imshow()函数,在这其中,cv.imread()函数有两个参数,第一个参数为读取图像资源的路径,若图像资源与项目在同一目录下则可直接输入图像资源的名称加后缀名,若图像资源与项目不在同一目录下,则需要使用绝对路径加图像名称与后缀名。第二个参数为图像资源的读取方式,可用阿拉伯数字 0,1,2 表示,分别表示加载黑白图像,加载彩色图像,加载含阿尔法通道信息图像。cv.imshow()函数则用来显示加载的图像资源,此函数也有两个参数,显示图像的窗体名称及显示的图片变量名称分别为其第一和第二个参数。

第二种方式是使用 cv.imdecode()函数来加载图像资源。cv.imread()函数要求图像资源名称不能包含中文字符,而 cv.imdecode()函数可以选择编码格式,对中文命名的图像资源也可加载显示。

通过 Numpy 数组操作来获取图像的各个属性。在本次课程设计中,需要获得加载的图像资源的宽度与高度,通过 Numpy 提供的 shape 方法来返回图像资源的高度、宽度与通道数的数组。

3图片预处理

3.1色彩空间转换

从网络上下载的图像资源与手机拍摄的图像资源,为避免因图像资源大小格式均不一致而导致出现错误。所以要针对所取得的图像资源进行相应的处理。将图片保存为 jpg 或 png 格式,将图像资源压缩成 1000*750 像素,以便后续对图像资源进行相关操作。

将 RGB 色彩图像使用 cv.cvtColor()函数对其进行处理为 HSV 色彩饱和度图像,其中,调整 HSV 各通道的颜色对应的最大值与最小值来实现HSV 色彩饱和度图像对图像资源的色彩检测。HSV 各通道的颜色对应的最大值与最小值,如图 3 所示。

我们通过输入蓝色对应的各个通道的最大值与最小值,利用 cv.imRange()函数实现对图像的色彩检测。Cv.imrange()函数最重要的三个参数分别为要处理的图像和最大值与最小值,可以使用变量和 array 数组来保存相应的值。

3.2边缘检测与二值化处理

因为无法避免车辆的背景中不存在蓝色的区域,只使用颜色检测不能达到最好的效果。

面对这种情况,需要对颜色检测后的图像进行边缘检测,描绘出各个部分的边缘情况,随后根据现实情况的具体要求对处理后的图像进行二值化操作与形态学操作。首先要对图像资源进行高斯滤波去噪,然后通过多次形态学开闭操作与腐蚀膨胀填充等操作找出车牌轮廓。

3.3外轮廓绘制与字符切割

通过上面的操作,已经找到了车牌的轮廓,但车牌的轮廓并不规则,无法对其进行操作。所以我们将已经找到的车牌的轮廓外围绘制了一个规则的矩形,这个规则的矩形与车牌最外侧轮廓相切,这样就对车牌成功进行了粗定位。然后将绘制的矩形切割下来。

在对字符进行切割之前,还需要做一些准备工作。首先针对不同的图像切割出来的外轮廓尺寸也均不相同。先将切割下来的车牌图像统一尺寸为车牌标准尺寸 450*15 然后对车牌部分同样进行二值化处理与形态学操作,然后通过遍历图像像素值的方法获取字符界限。从上向下遍历每一列像素,如若像素值从 0 变成 255,此时表示颜色从黑色变为白色,则判断为字符上界,反之,如若像素值从 255 变为 0,此时表示颜色从白色变为黑色,则判断为字符下界。然后使用同样的方法,找出字符的左右界限,然后将每个字符分割出来。

4字符识别

4.1 安装Tesseract-OCR

Tesseract-OCR 是一个免费的图片识别文字的软件,可以通过具体网站下载并进行安装,随后通过该软件进行下一步的相关实验。

4.2 字符识别

在 Python 中通过 text = pytesseract.image_to_string(cropImg, lang="chi", config="-psm 10")调用 tesseract。其中 cropimg 是原图片,lang 是我们之后自定义的语言,config 后面一定要跟 10 因为此参数表示对单个字符进行识别,默认是对一行字符识别。

我们需要将所获得的字符转换为 tif 格式才能使用 Tesseract-OCR 进行字符识别,具体的实现方法为:

if type(imgfile) == str and imgfile.endswith(('.bmp', 'gif', 'png', 'jpg')): with Image.open(imgfile)as im:

im.convert('RGB').save(imgfile[:-3] + 'tif')

利用 jTessBoxEditor 對多个字符图片识别,将识别错误的图片改正。最后得到需要的文件放入文件夹即可。最后得到如图 10 所示结果。

5 总结

本实验是利用 Python 语言实现车牌识别技术。实验的工作流程为获取图像、预处理图像、检测目标区域、目标区域分割、目标区域处理、字符分割、字符识别等。在这一具体过程中,为实现目标结果的正常生成,应当合理运用了 PyCharm 软件,才能够较为准确地识别车牌, 达到了题目要求和预期目的。因为 Python 语言的简洁性和通用性,使其开发较为简单,而且很多嵌入式,如树莓派等也都兼容,使其可以方便的进行代码移植,运用实际的场景中。随着软件算法的深入研究和硬件设备的升级换代,车牌识别技术也将越来越成熟化和智能化。

参考文献

[1] Joe Minichino Joseph Howse 著. OpenCV3 计算机视觉 Python 语言实现[M]. 北京:机械工业出版社,2001.5

[2] 毛星云著. OpenCV3 编程入门[M]. 北京:电子工业出版社 2015.7

[3] 冈萨雷斯(美),伍兹(美)著 数字图像处理[M] 北京:电子工业出版社 2011.6

[4] 斯蒂格(德)著 机器视觉算法与应用[M] 北京:清华大学出版社 2008.12

[5] 布拉德斯基(美)著 学习 OpenCV[M] 北京:清华大学出版社 2009.10

[6] 图像处理与分析[M]. 科学出版社 , 崔屹编著, 2000

[7] 李晓莎,林森.基于 Python+OpenCV 的车牌识别技术的研究[J].数字技术与应用,2019,37(06):95-97

作者简介:霍立志(1996),男,安徽淮北人,淮北师范大学信息学院2016级本科在读,研究方向:通信工程

猜你喜欢
车牌识别
基于支持向量机的车牌字符识别方法
车牌识别系统设计与实现
基于车牌识别的机器视觉课程研究
一种改进的BP神经网络车牌识别算法的研究
半开放式智慧校园安防系统