为什么我从 Tesseract 得到如此糟糕的简单单个字符识别结果?

Why do I get such poor results from Tesseract for simple single character recognizing?

我正在尝试使用 Tesseract 进行单个字符识别,但结果很糟糕。 "h"被识别为"n",“4”被识别为“/i”,"O"被识别为“()”;

单字符模式好像不行,因为很多字符都被识别为两个字符, 不只是一个。我的图像是简单的双层黑白 TIFF 图像, 拉丁字符。这是位图字体,不是扫描图像,它们绝对干净 不需要改进。 О只有大约一半的字符被正确识别,这似乎是 对于如此简单的任务来说,百分比非常低。

我使用的 Tesseract 库版本是“4.0.0-beta.3”。 这就是我对 Tesseract 的称呼。

 int CharRecognizer::recognizeTIFFData(char* data, int datalength){
            char *outText;
            TessBaseAPI* api = new TessBaseAPI();

            if (api->Init(NULL, "eng")) {
                    fprintf(stderr, "Could not initialize tesseract.\n");
                    exit(1);
            }
            api->SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
            Pix *image = pixReadMem(data,datalength);
            api->SetImage(image);
            // Get OCR result
            outText = api->GetUTF8Text();
            printf("\nOCR output:\n%s", outText);
            // Destroy used object and release memory
            int utf8 = outText[0];
            api->End();
            delete[] outText;
            pixDestroy(&image);
            return utf8;
 }

我是 Tesseract 的新手,所以我可能遗漏了一些东西。我必须以某种方式训练吗 先去图书馆?也许我应该设置另一个 OcrEngineMode?我没有预料到 简单位图字体识别的问题,现在很迷茫。 非常感谢您, 尤莉安娜

通过在图像周围添加 1x1 像素边框,我能够使 tesseract 在您的情况下产生正确的结果。我在 Linux:

上使用 tesseract 命令行工具对此进行了测试
$ tesseract R2a51.png stdout --psm 10
n
$ convert R2a51.png -border 1x1 R2a51.border.png
$ tesseract R2a51.border.png stdout --psm 10
h

convert 工具用于创建带有边框的图像版本。

tesseract 似乎无法正确处理与图像边缘接壤的字符(至少在默认设置下)。

N.B。您的第三个字符仍被识别为 0 而不是 O 但我不确定这是否可以被视为 OCR 错误。您可能需要查看 tesseract 字符白名单来解决这个问题。

编辑: "Tesseract legacy algorithm" 似乎也可以在不修改的情况下处理您的图像。它可以通过 --oem 0 在命令行上调用。请注意,您需要在 tessdata 目录中为您的语言匹配 *.traineddata。可以从 https://github.com/tesseract-ocr/tessdata

下载合适的变体