OCR:如何本地化序列号图像中的字符?

时间:2018-02-19 14:17:01

标签: java opencv image-processing computer-vision ocr

我有以下问题:我有一些序列号,总共由2行7个字符组成,(0-9和A-Z),总共14个字符。这些序列号位于各种产品的图像上;我可以通过使用大量图像处理和几何变换算法将这些本地化为以下形式:

enter image description here

现在我的目标是阅读这些序列号。在将数字本地化为如此紧凑的图像之后,我首先尝试了Tesseract API。不幸的是,要么我没有正确调整API,要么这个特定字体不在Tesseract的训练集中,因为Tesseract无法正确解析序列号。然后我迅速转向自定义解决方案。

要做的基本事情是,因为我知道字符的宽高比和相对大小,所以在标记字符和背景图像上训练一个简单的分类器(HOG +线性SVM)(无论如何我必须这样做)然后通过经典的滑动窗口方式运行它,然后应用非最大值抑制来消除误报检测。这种蛮力方法对我来说似乎不是很有效,因为1)每个窗口必须运行很多特征提取+分类操作2)我必须手动标记许多背景(负)样本,其中包括过渡区域在两个字符之间,两行之间的垂直空间,纯背景等。由于我能够将序列号本地化为一个矩形,只包括除字符之外的纯实背景,我想到了一个简单的前景/背景分割方案。我尝试的第一件事是将图像转换为灰度,缩小它并运行低通滤波器以消除高频噪声并应用Otsu阈值处理。如果我能够几乎完美地定位每个角色,我可以运行一个只包含其边界框的分类器,我不需要很多负过渡/背景等标记样本。从上面的操作,我得到以下结果,具有最佳模糊内核大小:

enter image description here

现在我几乎可以对每个角色进行本地化,但正如你在第二张图片中看到的那样,由于光线条件不好,一些嘈杂的杂波作为前景传递(特别是左侧的0和F左右)。也许二进制图像上的一些额外的扩张/侵蚀操作将有助于减少非字符杂乱,但当然我不能完全根除它们。我的问题是关于在Otsu阈值处理之后如何在那个阶段本地化角色的任何帮助和想法?我知道每个角色的宽度和高度(由手工制作的测量引起的小的不确定性)我也知道它们总是构成两条线,每条线有7个元素。我想一个连通分量算法,它将前景像素分组为blob,然后过滤出具有宽度和高度不一致的边界框的blob,但它远离编码阶段。我对任何类似的想法或例子持开放态度。 (如果有任何帮助,我将OpenCV与Java一起使用)。

1 个答案:

答案 0 :(得分:2)

当角色被隔离并且是单件时,连接的组件是可行的方式。只需忽略微小的斑点并使用边界框。

有时字符会有小突起(如F),这会导致字符看起来比它们大。对于固定宽度字体,您可以将框调整为该大小。

有时字符将被分成两个或三个部分。您可以通过计量考虑和文本结构的先验知识重新组合这些部分。

在这种情况下,实现100%的可靠性是一项真正的挑战。