Tesseract OCR 输出不良

问题描述 投票:0回答:3

我正在使用 Tesseract 库的 C# 包装器(如果我没记错的话,是 3.02)(https://github.com/charlesw/tesseract)。我已经让它运行并给出输出,但该输出本质上是垃圾。通常它什么也不提供,而当它确实提供一些东西时,它通常会变得一团糟。我知道它在理论上是有效的,因为我已经在一些非常完美的图像上尝试过它并且它有效。我想知道是否有人可以帮助我诊断问题并提出一些提高 Tesseract 准确性的方法。我已经将所有图像转换为黑白,分辨率设置为 300x300。我不会以编程方式进行任何直线拉直,但正如您在下面看到的,它们非常直。

这张图片效果完美

这个根本不起作用,要么产生乱码,要么什么也不产生

我尝试翻转一些示例的颜色,认为这样可能会产生更大的对比度(因为大多数文本是白色背景上的黑色,而工作文本是黑色背景上的白色文本)。但是:

根本不起作用,而

再次完美运行。

我怀疑这与“INVOICE”中字母之间的额外间距有关。但必须有某种方法可以用更紧凑的字体获得不错的结果。欢迎任何建议,我是这里的相对菜鸟。

c# bitmap tesseract
3个回答
2
投票

如果可能,您应该考虑使用更高分辨率的图片。关于付款图像的另一个问题可能是字母之间的间隙太小。如果单个字母(几乎)连接到单词的下一个字母,Tesseract 无法检测到它们。 我建议使用像 openCV 这样的图像处理库来改善你的结果。 您可以尝试腐蚀/膨胀。如果内核使用了正确的参数,这将分隔字母。使用不同的内核看看什么最适合您。

Mat element = getStructuringElement(erosion_type,
                                   Size(2 * erosion_size + 1, 2 * erosion_size + 1),
                                   Point(erosion_size, erosion_size));

erode(src, erosion_dst, element);

当我从事项目时,使用自适应阈值对我帮助很大。我发现这比仅仅将其转换为灰度或二值图像更有效。 注意:Java 代码,在 C 中应该非常相似。

Imgproc.adaptiveThreshold(cropedIm, cropedIm, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 29, 10);

这是我在 Pixtern 中选择你的一张图像后得到的,Pixtern 是我的一个 Android 项目(源代码在 github 上)。我使用的是适应阈值,但没有膨胀/侵蚀,结果已经相当不错了。

[已删除损坏的链接]

对于付款图像和类似图像: 尝试使用正常阈值并反转图像(黑色字体,白色背景)。同样,之后可以使用膨胀/腐蚀。 Java代码:

//results in binary image
Imgproc.threshold(cropedIm, cropedIm, 127, 255, Imgproc.THRESH_BINARY);
//Inverting image
Core.bitwise_not(cropedIm, cropedIm);

0
投票

Tesseract 需要整页,或者更确切地说,它是针对这些页面进行训练的。 如果你给它一两个字符或单词,它就不会起作用。

我想你有更多这样的图片。将它们作为文本行缝合在一起:就像每个图像都是前一个图像之后的一行文本,它应该工作得更好。


此外,请确保在使用超立方体时正确设置

psm
参数。更多信息:https://www.pyimagesearch.com/2021/11/15/tesseract-page-segmentation-modes-psms-explained-how-to-improve-your-ocr-accuracy/


0
投票

在传递到超立方体之前,我已将图像更改为高对比度灰度,但我不确定为什么它仍然无法正常工作,并且有时会不断给出垃圾信息。令人惊讶的是,输入的数字 247 被解释为 Pyl。 图像及其提取的文本是attached。需要准备训练数据集吗?我认为这是一个非常简单的文本,它应该与现有的默认 tessdata 一起使用。 非常感谢任何帮助。

© www.soinside.com 2019 - 2024. All rights reserved.