Tesseract 错误空间识别

Posted

技术标签:

【中文标题】Tesseract 错误空间识别【英文标题】:Tesseract False Space Recognition 【发布时间】:2015-09-13 08:45:13 【问题描述】:

我正在使用 tesseract 来识别序列号。这适用于可接受的常见问题,例如错误识别零和“O”、6 和 5,或存在 M 和 H。 除此之外,这个 tesseract 为识别的单词添加了空格,图像中没有空格。下图被识别为“HI 3H”

此图像生成“FBKHJ 1R1”

所以 tesseract 添加了一个空格,尽管图像中并没有真正的空格。 是否有可能参数化 tesseract 的间距行为?

编辑

对不起,忘记补充了,我也有包含空格的序列号。所以我无法删除已识别序列号内的所有空格。

例如下图的序列号中包含空格的图片经过tesseract识别成:J4 F1583BB。除了字符的识别是错误的之外,该图像可以正确识别空格。

我对 tesseract 的实际参数是:

tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY);
tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);
tess.SetVariable("tessedit_char_whitelist",
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345789");

char* out = tess.GetUTF8Text();
string text = string(out);

编辑

从已经存在的答案中可以看出,例如,“J”和“I”之间的空间似乎比其他字符之间的空间多一点。我选择的字体类型是 Monotype 字体。原因是我认为这有助于 tesseract 进行字符识别。这种等宽字体类型的缺点是,每个字符都具有相同的宽度,内核(字符之间的空间)会发生变化。 查看以下来源Source的示例图片

您认为哪种字体类型会取得更好的识别效果?

【问题讨论】:

作为一个懒惰的家伙,我想问一下你的连续剧是否会包含空格? 对不起,编辑了我的问题,包含空格的序列号存在... 当你在 TessBaseAPI 对象上调用 Init 时,你传入 "eng" 作为第二个参数。是指定字符集还是语言?如果是后者,您能否将其更改为仅指字母数字字符但不具有英语本身语义的选项? 不知道你的情况,但FBK中的J和我之间的距离可能是一个空格,即使对于人类来说也是如此 好的,谢谢。在打开一个新问题之前我也已经搜索过了:)但是没有找到有用的东西,......但是我会更深入地看看你提到的 cpp 文件。 【参考方案1】:

我不是 C++ 程序员,但我认为可以校准每个字母空间的宽度。我在这个site 中找到了这个参数“textord_space_size_is_variable”,它说“如果为真,即使字符有固定的间距,单词分隔符空格也被认为具有可变宽度。” em>

祝你好运! :)

【讨论】:

没见过这么多参数可调。我会试试的,谢谢。【参考方案2】:

调整参数tosp_min_sane_kn_sp 可能会有所帮助。我通过这样做解决了问题。

如果没有帮助,您可以尝试其他tosp_* 参数,或解决空间源代码“tospace.cpp”

【讨论】:

以上是关于Tesseract 错误空间识别的主要内容,如果未能解决你的问题,请参考以下文章

Tesseract - 识别文本问题

Tesseract OCR 无法识别除法符号“÷”

Tesseract训练

关于用tesseract和tesserocr识别图片的一个问题

tesseract-ocr图片识别开源工具

Tesseract 微调错误 - 计算 CTC 目标失败