为什么我从 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
下载合适的变体
我正在尝试使用 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