【问题标题】:OCR: How to localize characters in a serial number image?OCR:如何本地化序列号图像中的字符?
【发布时间】:2018-02-19 14:17:00
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    当角色是孤立的并且是一体的时,连接组件是要走的路。只需忽略小斑点并使用边界框即可。

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

    有时字符会被分成两三部分。您可以通过几何考虑和对文本结构的先验知识重新组合这些片段。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多