什么是车牌检测的好algorithm?
背景
对于我在大学的最后一个项目,我正在开发车牌检测应用程序。 我认为自己是一名中级程序员,但是我的math知识缺乏中学以上的知识,这使得制定正确的方程式比实际上更难。
我花了很多时间查找学术论文,例如:
- 在图像中检测车辆牌照
- 使用图像显着性的强大的车牌检测
- 车牌图像的局部增强用于车牌检测
说到math,我迷路了。 由于这种testing,各种graphics图像被certificate是有效的,例如:
至
然而,这种方法只适用于特定的图像,如果这些技术应用于不同的图像,我相信会发生较差的转换。 我读过一个叫做“底帽形态变换”的公式,它有以下几点:
基本上,变换保留了图片的所有黑色细节,并消除了其他所有内容(包括较大的黑色区域和较亮的区域)。
我无法find有关这方面的很多信息,但报告结尾附近的文件中的图像显示了它的有效性。
其他限制
- 在C#中开发
- 将项目仅限于英国注册牌照
- 我可以select要转换的图像作为演示
题
我需要关于我应该关注什么转换技术的build议,以及哪些algorithm可以帮助我。
编辑:新信息目前继续 – 车牌照检测
你可以采取多种方法,但是首先想到的策略是:
- 发现/研究:确定您可能需要识别的一组颜色和字体。 如果你的样品图片是大多数英国板块的代表,那么你的工作变得更容易。 例如简单,奇异的字体和白色背景上的黑色刻字
- 代码:尝试识别颜色主要是白色和黑色的图像的矩形区域。 这不是一个非常重要的math问题,它应该给你的车牌区域集中。
- 代码:在你的分区做一些清理工作,例如转换成纯黑白(单色),或者缩放/转换成一个漂亮的矩形。
- 使用API:接下来,在您的子select的图像区域使用现有的OCR(光学字符识别)algorithm,以查看是否可以读取文本。
就像我所说的,这是很多人的策略,但是它只是一个需要最less数量的重math的问题……也就是说,如果你能find一个适合你的OCR实现。
你可以看一看emgucv的例子,告诉你一个真实世界的工作使用OCR车牌检测的例子
http://www.emgu.com/wiki/index.php/License_Plate_Recognition_in_CSharp
几年前,我在Java中做了一个类似的项目,首先我应用了Sobel算子 ,然后用一个平板的图像掩盖了所有的图像(也应用了Sobel算子)。 最大的重合区域是板块的位置。 然后将OCR应用于选定的区域以获取该号码。
以下是我build议你应该做这个任务。 在这里阅读我的详细答案。
- 转换为灰度。
- 高斯模糊与3×3或5x5filter。
-
应用索贝尔filter来查找垂直边缘。
Sobel(gray, dst, -1, 1, 0)
- 阈值得到的图像得到一个二进制图像。
- 使用合适的结构元素应用形态学closures操作。
- find生成图像的轮廓。
- find每个轮廓的
minAreaRect
。 根据长宽比和最小和最大面积select矩形。 - 对于每个选定的轮廓,查找边缘密度。 设置边缘密度的阈值,并select违反阈值的矩形作为可能的板区域。
- 之后几乎没有矩形。 您可以根据方向或您认为合适的任何标准过滤它们。
- 从原始(灰度)图像的
adaptiveThreshold
之后的图像中剪切检测到的矩形部分,并应用OCR。
这显然是一个计算机视觉types的问题。 看看OpenCV 。 它是用C ++编写的,但也许你可以以某种方式与之交互 。
英国已经有一个这样的系统。 我记得看过一个电视节目,他们表示他们可以在10分钟内在伦敦内find一辆车(假设他们知道这个数字,而且车子在四处开车)。刚刚阅读的维基百科给了你开始思考问题的指针: http ://en.wikipedia.org/wiki/Automatic_number_plate_recognition
它告诉你如何计算底部帽子变换(看起来像倒转的分级阈值变换)。
首先要做的是实现两个形态函数的扩张和侵蚀。
要做到这一点,你需要你的f和b,然后你在图像的一个小区域计算的function,保持最大的价值发现。
(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y) |(s − x), (t − y) ∈ Df ; (x, y)∈Db}
这就是说,在域的所有点(例如一个以你的点(s,t)为中心的小矩形)上取最大值。
简单的伪代码将是
max = -infinity // for the point (s,t) on the image, must compute this for all points for(x = -5 to 5) for(y = -5 to 5) max = Max(max, f(s - x, t - y) + b(x,y))
有效地,我们现在有一个最大值的新形象。
实际上它非常简单,所以不要让它比它更难(我们只是将b(x,y)添加到区域中的每个点,并找出哪个给出最大值)。
你也一样的侵蚀(非常类似于上面)
现在开幕式和闭幕式是两者的组成部分
你可以先把它想象成一个扩张,然后是一个开放的侵蚀。
它说最后从原始图像中减去closures,你应该有你的变换。
如果您对检测牌照存在的问题(而不是识别牌照)感兴趣,那么您应该查看图像中的文本检测,因为它与您正在做的事情有关。
这个问题与你有关: 检测图像上是否存在文本的algorithm
你可以在opencv中使用矩形检测或者像haar一样的特征来检测在opencv中也存在的板
您也可以参考自动车牌识别库和此查询 。 这也会给你一些关于如何处理事情的想法,以及现有的解决scheme。
但是,如保罗所回答的那样,您应该首先尝试从完整图像中find矩形号码盘,然后对其进行二值化,然后使用可用的OCR库(build议使用Tesseract)
你可以参考这个链接 ,这将帮助你find矩形板。 你需要使用openCV库,所以你不需要很多math,但是对于幕后发生的事情的基本了解可以帮助你更好地解决问题。
你可能想要看看www.openalpr.com作为一个起点。 它使用了许多技术来查找和分析车牌。