由于字符识别相对于前面的车牌定位而言,显得较为简单。不像在一个复杂和低分辨场景下进行车牌定位,在字符分割和识别的部分时,所需要处理的场景已经较为固定了,因此其处理技术也较为单一。
我们首先看一下,字符分割所需要处理的输入: 即是前面车牌定位中的结果,一个完整的车牌。由于在车牌定位中,我们使用了归一化过程。因此所需要处理的车牌的大小是统一的,在目前的版本中(v1.3),这个值是136*36。
字符分割的结果就是将车牌中的所有文字一一分割开来,形成单一的字符块。生成的字符块就可以输入下一步的字符识别部分进行识别。在EasyPR里,字符识别所使用的技术是人工神经网络,也就是ANN。
具体而言,字符分割过程是如何做的呢?简单说,就是:灰度化->颜色判断->二值化->取轮廓->找外接矩形->截取图块。
图1 字符分割处理流程
下面,我们使用下图的车牌完整的跑一遍字符分割的流程,以此对其有一个全局的认识。
首先,我们把彩色的图片转化为灰度化图片。注意:为了以后可以利用彩色信息,在前面的车牌检测过程中,我们的输出结果不是灰度化图片,而是彩色图片。这样以后当我们改正算法,想利用彩色信息时就可以使用了。在这里,我们的算法还是针对的是灰度化图片,因此首先进行灰度化处理。灰度化后的图片见下图:
图2 灰度化后结果
投影法,滑动窗口判断法,在这里,EasyPR使用的是取字符轮廓法。
因为需要取轮廓,就需要把图片转化成一个二值化图片。不过,由于蓝色和黄色车牌图片的区别,两者需要用的二值化参数不一样,因此这里需要对车牌图片的颜色进行一个判断。车牌颜色对二值化的影响的分析见后面“其他细节”章节。
这里颜色判断的使用的是前面颜色定位详解里的模板匹配法(HSV颜色空间)。
图3 颜色判断
获取颜色后,就可以选择不同的参数进行大津阈值法来进行二值化。对于本示例图片中的蓝色车牌而言,使用的参数为CV_THRESH_BINARY。二值化后的效果见下图:
图4 二值化后结果
接下来,使用被多次用到的取轮廓方法findContours。取轮廓后的结果如下图:
图5 取轮廓操作
注意:直接使用findContours方法取轮廓时,在处理中文字符,也就是“苏”时,会发生断裂现象。因此为了处理中文字符,EasyPR换了一种思路,使用了额外的步骤来解决这个问题。具体可以见后面的“中文字符处理”章节。
使用了中文字符处理方法以后,成功获取了所有的字符的外接矩形。具体见下图:
图6 所有字符的外接矩形
把图中的外接矩形一一截取出来,归一化到统一格式。留待输入下个步骤--字符识别模块处理。归一化后字符图块见下图:
图7 截取并归一化的图块
上面的流程在处理英文车牌时,效果是很好的。但是在处理中文车牌时,存在一个很大的问题。在取轮廓时,中文由于自身的特性,例如有笔画区间,取轮廓会造成断裂现象。例如下图中的“苏”。英文字符通过取轮廓都被完整的包括了,而“苏”字则分成了两个连通区域。
图8 中文字符轮廓断裂示例
虽然并不是所有的中文都会存在这个问题,但直接用取轮廓操作已经不合适了。
EasyPR是如何解决这个问题的呢?其实想法很简单。那就是既然有些中文字符没办法用取轮廓处理,那么就干脆先不处理中文字符,而是用取轮廓操作处理中文字符后面的字符。例如“苏A88M88”,其中“A88M88”这六个字符我都能用取轮廓操作获得。我先获取这六个字符,再想办法获取中文字符。
1、获取这六个字符后,如何获取“苏”这个中文字符的轮廓?
这里的关键就是“苏”字符后面的“A”字符,这个字符在中文车牌里代表城市的代码,我们在这里简称它为“城市字符”或者“特殊字符”。这个字符有一个特征,就是与后面的字符存在一定的间隔。但是与前面的中文字符靠的较紧。倘若我获取了这个特殊字符的外接矩形,只要把这个外接矩形向左做一些的偏移(偏移的大小可以通过经验指定,例如设置为字符宽度的1.15倍),这样这个外接矩形就成了包含中文字符的一个矩形了。下面就可以截取中文字符的图块。
下图就是“特殊字符”与被反推得到的“中文字符”的矩形,在图中用红色矩形表示。
图9 反推得到的中文字符位置
2、如何获取“特殊字符”的位置?
一种方法是把所有取轮廓操作获取到的矩形进行排序,最左边的就是特殊字符的图块。但是有些中文字符会被取轮廓操作截取为一个连通区域。在这种情况下,最左边的图块矩形是中文字符的矩形,而不是特殊字符的矩形了。所以这个方法不能用。
补充:通过每个矩形框之间的距离进行判断“特殊字符”,因为“特殊字符”右边有一个“圆点”
设矩形的中点恰好在整个车牌的1/7到2/7之间时的矩形为特殊矩形。这样操作的前提是我们的车牌定位的非常准确,恰到把整个车牌截取的正正好。在这种情况下,只要外接矩形满足这些条件,就可以判断为特殊字符的矩形。
这个方法思路很简单,实际中应用效果也不错,因此也是EasyPR目前采用的方法。
图10 获取特殊字符的位置
以下是特殊字符判断的代码:
以上就是EasyPR能处理中文车牌的主要原因。原先的taotao1233的代码中无法处理中文的原因就是没有这样一步预处理。其实这是一个很简单的思想,但在之前并没有被实现。EasyPR里实现了这个思路,同时发现,这个方法效果出奇的好。基本可以应对所有的情况。所以说,这个方法可以说是一个简单,有效的处理中文车牌的方法。
在进行二值化前,需要进行一次颜色判断,这是因为对于蓝色和黄色车牌而言,使用的二值化策略必须不同。
对于蓝色车牌而言,使用的参数为CV_THRESH_BINARY。
而对于黄色车牌而言,使用的参数为CV_THRESH_BINARY_INV。
假设黄色车牌使用了CV_THRESH_BINARY作为参数,则会发生如下图一样的二值化结果,其中字符部分变成了黑色,而背景则是白色(同理,蓝色车牌使用CV_THRESH_BINARY_INV也是一样的效果)。在这种不正确的参数带来的二值化情况下,取轮廓操作将无法按照预期的行为进行处理。因此,必须使用正确的二值化参数。
图11 不正确参数的二值化效果
在颜色判断时,有一个小技巧,就是先把四周的“边”截取后再进行颜色的判断,可以消除车牌定位时一些多余的四周的干扰。代码如下:
颜色判断方法的代码如下:
在获得中文字符图块以后,下面一步就是把剩下的图块获取了。不过由于中文车牌一般只有7个字符,所以可以把后面的图块从左到右排序,依次选择6个即可。一些会被误判为“I”的缝隙可以通过这种方法排除出去。例如下图中,最右边的一个缝隙会被误识别为"1"。但是倘若从左到右依次选择的话,这个缝隙并不会被选入候选集合中,因为它已经是“第八个”字符了。
图12 最右边会被误判为"1"的缝隙
排序与依次选择的代码如下:
有些中国的车牌中有一个非常妨碍识别的东西,那就是柳钉。倘若对一副含有柳钉的图进行二值化,极有可能会出现下图的结果。一些字符图块(下图的"9"和"1")通过柳钉的原因联系到了一体,那样的话就无法通过取轮廓操作来分割了。
图13 柳钉的影响
因此在二值化之后,还需要一个去除柳钉的操作。去除柳钉的思想也并不复杂,就是依次扫描每行,判断跳变次数。车牌字符所在的行的跳变次数是很多的,而柳钉所在的行就会偏少。因此当发现某行跳变次数较少,则可以把该行的所有像素值赋值为0,这样就会大幅度消除柳钉的影响了。下图就是去除柳钉后的效果。
图14 去除柳钉后的效果
去除柳钉函数的代码如下:
本篇字符分割流程就到此结束。最后回顾一下整体的处理流程,首先是对车牌图像进行灰度化,然后根据车牌的不同颜色来进行不同的二值化处理。二值化完后首先去除柳钉,然后进行取轮廓操作。
取轮廓操作以后,在所有的轮廓中根据先验知识,找到代表城市的字符,也就是“苏A”中“A”的位置,根据“A”的位置来反推“苏”的位置。
最后将找到的这些轮廓依次排序,从左到右依次选择6个,和第一个的中文字符组成7个字符的图块数组,输入到下一步字符识别模块中进行处理。
整个字符分割流程就到此结束了,还是比较简单的。其中的中文字符位置的确定使用了“先验知识”这种方法。这种方法在面对固定已知场景中是较好的方法,但是面对特殊情况时就可能会有不太好的效果,因此要根据具体情况来权衡。
校验车牌的格式使用正则表达式去进行车牌校验,检测一个字符串是否为车牌格式private static final String LICENSE_PLATE_PATTERN = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼粤台港澳][A-Z][A-Z0-9]{5,6}$";public static boolean isValidLicensePlate(String lice
引言在数字化和智能化浪潮的推动下,数据集的寻找和应用已成为众多研究者、开发者和工程师关注的焦点。特别是在智能交通、安全管理以及停车场管理等领域,车牌检测技术的重要性日益凸显。本文旨在深入探讨车牌检测的研究意义、重要性以及其在多个领域内的应用,以期为相关领域的研究和实践提供有价值的参考。一、车牌检测的研究意义及重要性车牌检测,作为智能交通系统(ITS)的关键技术之一,其研究意义及重要性不言而喻
在我最近的项目中,我遇到了“车牌识别处理 字符分割Python”的一系列挑战。作为图像识别的一部分,字符分割是一个关键的步骤,影响着最终的识别准确性。### 问题背景在一个自动化车辆识别系统中,我们希望将输入图像中的车牌字符成功分割。具体的目标是提升系统的准确性和效率。- **现象描述:** - 系统在进行字符分割时,字母与数字的区域未能正确识别。 - 识别模型对部分字符的区分能
# Python如何识别字符在Python中,字符是由Unicode字符集中的单个字符组成的。Python提供了多种方式来识别和处理字符。本文将介绍如何使用Python来识别字符,并通过一个具体的问题来演示。## 问题描述假设我们需要编写一个程序来统计一篇文章中每个字符出现的次数。我们需要将文章中的所有字符都识别出来,并统计它们的出现次数。## 方案### 1. 读取文章首
1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要车牌识别系统(Vehicle License Plate Recognition,VLPR) 是计算机视频图像识别技术在车辆牌照识别中的一种应用。车牌识别在高速公路车辆管理中得到广泛应用,电子收费(ETC)系统中,也是结合DSRC技术识别车辆身份的主要手段。 车牌识别技术要求能够将运动中的汽车牌照从复杂背景中
# 使用Python Matplotlib进行车牌字符分割,网上查找到的方案有 tensorflow 和opencv,opencv 也是比较成熟的方案,先从简单的开始,以下是关于使用opencv实现车牌号码提取的部分。1 车牌提取1.1 实现思路读取彩色的图片转换为灰度图高斯模糊Sobel算子进行边缘检测图像二值化闭操作(腐蚀和扩张)循环找到所有的轮廓判断车牌区.
车牌识别系统总的来说,国内不管科研还是商用方面都很成熟了,基本处于世界先进甚至领先的水平。对于目前常见的收费站、红绿灯路口、学校、机关政府等进出口的固定环境车牌识别准确率基本都可以达到99.5%以上。车牌识别的主要步骤分为:车牌定位、字符分割、字符识别;(1)车牌定位:在车牌识别中是很关键的一步,尤其是对于图像背景较为复杂的情况下,要提高车牌定位准确率也不是件容易的事。车牌定位包括车牌定位、车牌倾
第六篇:字符分割 在知道了车牌字符的规律之后,可以根据车牌的特点对字符进行分割。一般最容易想到的方法就是根据车牌投影、像素统计特征对车牌图像进行字符分割的方法。是一种最常用的、最基本的、最简单的车牌字符分割方法。它的精髓是对车牌图像进行逐列扫描,统计车牌字符的每列像素点个数,并得到投影图,根据车牌字符像素统计特点(投影图中的波峰或者波谷),把车牌分割成单个独立的字符。 图像的边缘信息一般都是高
首先利用级联分类器把车牌位置找到取出来,然后用ocr进行车牌识别。1 OCR之Tesseract安装Tesseract安装可以参考这个链接: 写的比较详细,我在使用的时候有一个报错有点意思,记录一下: Tesseract ocr识别报错:tesseract is not installed or it‘s not in your PATH已经安装好tess
车牌识别包括车牌检测(通过图像分割、特征提取获得车牌位置)+车牌识别(对检测到的车牌进行字符内容识别)。一、基本流程如下:1.车牌检测1)读取需要进行车牌识别的图片;2)对图像进行灰度化处理(高斯模糊可选择是否进行)和灰度拉伸;3)进行开运算,消除图像中的噪声;4)将灰度拉伸后的图像和开运算后的图像求差
目录0、引言1、MFC中的车牌显示2、车牌定位3、字符提取4、文字识别5、文字预测0、引言 第一次使用OpenCV完成一个完整的功能,有所收获,特此记录。 这篇博客中的车牌识别功能比较简单,只能识别一般的蓝色车牌,只能识别拍摄较为清楚的车牌。以后可以在此基础上实现更加高级的功能,比如识别较为
OpenCV入门之获取验证码的单个字符(字符切割)~ 介绍 在我们日常上网注册账号以及制作网络爬虫时,经常会遇到奇奇怪怪的验证码,有些容易,有些连人眼都无法辨识。于是,大牛们想到了用深度学习的方法来破解验证码,对于一般的验证码往往能出奇制胜,取得不俗的识别效果。对于利用深度学习方法识别验证码,其预处理就是获取验证码中的单个字符,即字符切割。 本文将通
文章目录简介:项目准备项目阶段车牌的处理和提取原理:实现:筛选图像分隔字符函数入口定义效果展示完整代码 简介:**无人停车场可以说是目前人工智能应用最普通的一个,核心的技术在于车牌的识别,那么作为人工智能的狂热者,自然不能错过这么好的项目。赶紧开始吧! **项目准备python 环境opencv环境numpy环境项目阶段提取车牌部分进行车牌的字符分隔进行车牌的字符识别进行车牌的倾斜调整等特殊情况
用 LaraDumps 高效调试 PHP 和 Laravel 引言 如果你开发 Laravel 应用有一段时间了,肯定用过无数次 dd()、dump() 或 var_dump()。它们确实能用,但也有代价: 会中断应用流程 在浏览器里输出很乱 刷新页面就没了 没法优雅地查看复杂数据 如果 PHP 调 ...
在电子技术领域,增益是衡量系统放大能力的核心参数,定义为输出与输入信号的比值。无论是探头、放大器还是示波器,增益的设计与控制直接决定信号的可观测性和测量精度。 一、基础定义:比值与物理意义 增益(通常用A表示)的精确含义需结合信号类型理解: 1. 三类核心表达式 电压增益 Aᵥ = Vₒᵤₜ/Vᵢₙ ...
【问题描述】大约在1500年前,《孙子算经》中记载一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?大概的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚,问笼中各有多少只鸡和兔?请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算 ...
摘要:在深入学习计算机系统时,很多同学会对操作系统的分页机制和组成原理的组相联缓存产生既视感。它们都涉及“查表”和“多次访存”,形式相似。本文将深入探讨两者的联系与本质区别,并揭示它们如何协同工作,共同构建了现代计算机的基石。一、 问题的由来:一个精彩的直觉当大家学习分页存储管理时,知道一个虚拟地址 ...
1. 系统功能介绍本系统设计旨在实现基于单片机的双机串口通信与数字串存储功能,由两个独立的单片机系统(A端与B端)组成。A端主要负责数字串的输入与发送,B端负责接收、校验、显示及存储。系统的整体功能涵盖了人机交互、串口通信、数据校验与非易失性存储等多个方面,体现了单片机系统在通信与数据管理中的综合应用能力。系统的主要功能如下:数字串输入与发送(A端) 用户通过拨号键盘输入一串数字(2~16位),输