gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:32:21 25 4
gpt4 key购买 nike

我有以下问题:我有一些序列号总是由 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 附近)。也许对二值图像进行一些额外的膨胀/腐 eclipse 操作有助于减少非字符的困惑,但我肯定无法完全消除它们。我的问题是关于在 Otsu 阈值之后如何在那个阶段本地化角色的任何帮助和想法?我确实知道每个字符的宽度和高度(由手工测量引起的不确定性很小)而且我也知道它们总是构成两行,每行有 7 个元素。我想到了一种连通分量算法,它将前景像素分组为 blob,然后过滤掉确实具有宽度和高度不一致的边界框的 blob,但它离编码阶段还很远。我对任何类似的想法或例子持开放态度。 (如果有任何帮助,我将 OpenCV 与 Java 结合使用)。

最佳答案

当角色被孤立并成为一个整体时,连接组件是可行的方法。只需忽略小 Blob 并使用边界框即可。

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

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

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

关于java - OCR:如何定位序列号图像中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com