我正在使用 Tesseract 库的 C# 包装器(如果我没记错的话,是 3.02)(https://github.com/charlesw/tesseract)。我已经让它运行并给出输出,但该输出本质上是垃圾。通常它什么也不提供,而当它确实提供一些东西时,它通常会变得一团糟。我知道它在理论上是有效的,因为我已经在一些非常完美的图像上尝试过它并且它有效。我想知道是否有人可以帮助我诊断问题并提出一些提高 Tesseract 准确性的方法。我已经将所有图像转换为黑白,分辨率设置为 300x300。我不会以编程方式进行任何直线拉直,但正如您在下面看到的,它们非常直。
我尝试翻转一些示例的颜色,认为这样可能会产生更大的对比度(因为大多数文本是白色背景上的黑色,而工作文本是黑色背景上的白色文本)。但是:
我怀疑这与“INVOICE”中字母之间的额外间距有关。但必须有某种方法可以用更紧凑的字体获得不错的结果。欢迎任何建议,我是这里的相对菜鸟。
如果可能,您应该考虑使用更高分辨率的图片。关于付款图像的另一个问题可能是字母之间的间隙太小。如果单个字母(几乎)连接到单词的下一个字母,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);
Tesseract 需要整页,或者更确切地说,它是针对这些页面进行训练的。 如果你给它一两个字符或单词,它就不会起作用。
我想你有更多这样的图片。将它们作为文本行缝合在一起:就像每个图像都是前一个图像之后的一行文本,它应该工作得更好。
此外,请确保在使用超立方体时正确设置
psm
参数。更多信息:https://www.pyimagesearch.com/2021/11/15/tesseract-page-segmentation-modes-psms-explained-how-to-improve-your-ocr-accuracy/