使用 Tesseract (tess4j) 进行 OCR 图像预处理的下一步

Next step in image preprocessing for OCR with Tesseract (tess4j)

我一直在尝试使用 Tesseract 来识别一系列图像中的一些数字,在寻求建议后,我做出了一些改进。到目前为止,我已经尝试了以下步骤:

尽管它们的边缘有些参差不齐,但这些数字的形状完全相同且完全对齐。处理过的图像示例:

Tesseract 对这些没问题,但它经常混淆 8 为 3、6 为 5、9 为 5。

我一直在寻找不同的方法来平滑图像并尝试不同的比例,但我也想知道只完成训练 Tesseract 的过程是否更有意义。只有 10 个可能的值总是几乎相同,看起来它应该不会太难学会识别它们,但训练 Tesseract 似乎也是一个巨大的痛苦。

关于如何在这些图像上从 Tesseract 获得最终的准确性有什么建议吗?

我正在使用 tess4j 和 Java,因此特别感谢 Java 特定的建议和库。虽然我愿意自己实现算法,但我不想重新发明轮子。

我尝试了更多的预处理思路,但没有取得太大进展,包括各种类型的灰度、图像颜色反转、调整大小和交替二值化策略。 None 比我原来的、未调整大小的二值化有所改进。最终我决定试一试 Tesseract 培训。我按照这里的说明操作: Manual Tesseract Training Walkthrough

我很难找到任何程序来帮助实际在 windows 64 位中工作,最终我手工完成了大部分工作。我使用 jTessBoxEditor 来编辑手动生成的 .box 文件,尽管我也在文本编辑器中进行了一些编辑,以添加框文件生成器遗漏的缺失字符的条目。我只有这些小问题需要处理,所以我的训练文件不符合 Tesseract wiki 指南,但是哦,好吧。

我在使用 box.train 时遇到了一些错误:

FAIL! apply_boxes BOXFILE LINE ... failure! COULDN'T FIND A MATCHING BLOB

谷歌搜索无效后,我决定忽略它们并继续。

我在尝试 运行 cntraining 时遇到更多错误:

Error: Illegal number of feature sets!
signal_termination_handler:Error:Signal_termination_handler called:Code 3001

经过更多无效的谷歌搜索后,我基本上尝试依次忽略我的每个 .tr 文件,看看是哪一个导致了问题。最终我能够在缺少 1 个文件的情况下完成 cntraining。我不知道这对我的输出有什么影响,但我再次决定忽略它并继续前进。

我运行进入另一个问题运行宁combine_tessdata:

Error opening unicharset file
Error combining tessdata files into foo.traineddata

这是因为我需要将我的 lang 前缀放在 unicharset 文件之前,教程没有指示我这样做。这样做之后,我成功地构建了 A 训练数据文件。不知道它是否有效,我将它放入我的 tessdata 目录,将我的语言切换到新的训练语言并再次尝试。

瞧,太完美了。它现在似乎可以 100% 准确地识别我的数字(至少在我有限的样本量内)。我正在做的唯一预处理是将图像二值化,没有进一步清理或重新缩放。

所以,显然对于一个小的字符集,手动训练是值得的。我大概花了 3 个小时才找到有效的工具,并在整个过程中摸索着前进。作为参考,我从 14 个与我最初 post 中的相似的 tif 开始。其中四个在整个过程中出现了一个或另一个错误,加上我在 cntraining 中省略的 1 个(但不是从其他任何东西..?),所以像.. 9 和 2/3 图像用于训练。这显然已经足够了,多亏了我角色的一致性。