Tesseract OCR 输出错误

gma*_*ter 6 c# tesseract bitmap

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

在此输入图像描述 这张图片效果完美

在此输入图像描述这个根本不起作用,要么产生乱码,要么什么也不产生

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

在此输入图像描述根本不起作用,而

在此输入图像描述再次完美运行。

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

小智 3

如果可能,您应该考虑使用更高分辨率的图片。关于付款图像的另一个问题可能是字母之间的间隙太小。如果单个字母(几乎)连接到单词的下一个字母,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);
Run Code Online (Sandbox Code Playgroud)

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

Imgproc.adaptiveThreshold(cropedIm, cropedIm, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 29, 10);
Run Code Online (Sandbox Code Playgroud)

这是我在 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);
Run Code Online (Sandbox Code Playgroud)