Tesseract 假空间识别

8

我正在使用tesseract识别序列号。这个工具可以正常工作,但是存在一些常见问题,例如零和“O”,6和5,或M和H的误识别。

除此之外,tesseract会在识别出的单词中添加空格,而图像中并没有空格。以下图像被识别为"HI 3H"

Example Image 1

这张图片的结果是" FBKHJ 1R1"

Example image 2

因此,即使图像中实际上没有空格,tesseract也会添加一个空格。有没有可能参数化tesseract的间距行为呢?

编辑

很抱歉,我忘记了补充一点,我还有包含空格的序列号。所以我不能删除识别出的序列号中的所有空格。

例如,下面这张包含空格的图像,在经过tesseract识别后变成了J4 F1583BB。除了字符识别错误之外,这张图片的空格被正确识别了。

Example image 3

我目前使用的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”之间的空格似乎比其他字符之间的空格稍微大一些。我选择的字体类型是等宽字体。这样做的原因是我认为这有助于Tesseract进行字符识别。这种等宽字体的缺点是内核(字符之间的空间)会有所变化。请参见以下来源的示例图像Source

Proportional vs. Monospace

你认为哪种字体类型能够实现更好的识别结果?


2
作为一个懒人,我想问一下你的串行号里面会不会包含空格? - Thomas Ayoub
当您在TessBaseAPI对象上调用Init时,将"eng"作为第二个参数传递。这是用来指定字符集还是语言?如果是后者,您能否更改为一个选项,只涉及字母数字字符,但没有英语的语义? - Sam Estep
2
不知道你怎么看,但在 FBK 中,J 和 I 之间的距离可能是一个空格,即使对于人类来说也是如此。 - UmNyobe
同样的问题在2009年就有了:https://groups.google.com/forum/#!topic/tesseract-ocr/5_3N6NShQck 我猜没有这样的参数,但不能保证... 但是也许...可以看看textord/tospace.cpp,如https://groups.google.com/forum/#!msg/tesseract-ocr/PepNaRySaHw/XzmKb_yZ7mkJ所建议的那样(都可以在谷歌上找到)。 - Micka
1
好的,谢谢。在提出新问题之前,我已经进行了搜索 :) 但是没有找到有用的东西,...但我会更深入地查看您提到的cpp文件。 - Mr.Sheep
显示剩余5条评论
2个回答

6

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

如果这不起作用,您可以尝试其他tosp_*参数,或者通过空格源代码“tospace.cpp”进行解决。


0

我不是C++程序员,但我认为可以校准每个字母空间的宽度。 我在这个网站找到了这个参数"textord_space_size_is_variable",它说"如果为真,则假定单词分隔符空格具有可变宽度,尽管字符具有固定的间距。"

祝你好运! :)


还没有看到有这么多可调参数。我会试一试,谢谢。 - Mr.Sheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接