OCR:如何定位序列号图像中的字符?

OCR: How to localize characters in a serial number image?

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

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

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

现在我几乎可以定位每个字符了,但是正如您在第二张图片中看到的那样,由于光线条件不佳,一些嘈杂的杂波被传递为前景(尤其是左侧的 0 和 F 附近) .也许对二进制图像进行一些额外的 dilation/erosion 操作会有助于减少非字符混乱,但我肯定无法完全消除它们。我的问题是关于在 Otsu 阈值之后如何在那个阶段本地化角色的任何帮助和想法?我确实知道每个字符的宽度和高度(由手工测量引起的不确定性很小)而且我也知道它们总是构成两行,每行有 7 个元素。我想到了一种连通分量算法,它将前景像素分组为 blob,然后过滤掉确实具有宽度和高度不一致的边界框的 blob,但它离编码阶段还很远。我对任何类似的想法或例子持开放态度。 (如果有任何帮助,我将 OpenCV 与 Java 一起使用)。

当字符是孤立的并且是一个整体时,连接的组件是可行的方法。忽略小斑点并使用边界框。

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

有时角色会被分成两三部分。您可以根据几何学考虑因素和文本结构的先验知识重新组合这些片段。

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