如何让Tesseract只识别数字,即使它们与字母混在一起?

71
我想使用tesseract只识别数字,但是问题在于我的图像中有数字和字母的混合,并且当我使用SetVariable("tessedit_char_whitelist", "0123456789")时,tesseract返回错误的数字。
我能否设置阈值值以便tesseract忽略相似度较低的符号?
注意:我已经将tesseract设置为只识别数字,因此不会因为O和0之间产生混淆。

嗨,我也在使用Java项目中的Tesseract,并遇到了一些问题。我有商务名片图像需要提取电子邮件地址。问题是有时会混淆数字和字母。例如,电子邮件“j.schneiderheinze@dunskie.de”变成了“j.5chneiderheinze@dunskie.de”。您有什么想法可以解决这个问题吗? - Francisco Souza
10个回答

43

只识别数字实际上已经在tesseract FAQ页面上得到了回答。请查看该页面以获取更多信息,但如果您安装了版本3软件包,则配置文件已经设置好。您只需在命令行上指定:

tesseract image.tif outputbase nobatch digits

关于阈值,我不确定你指的是哪一个。如果你的输入是一种不寻常的字体,也许可以用你的输入样本重新训练。另一种选择是更改tesseract的剪枝阈值。这两个选项也在常见问题解答中提到。

15

对于Tesseract 3,根据FAQ,命令更简单:tesseract imagename outputbase digits。但是它对我来说并不是很有效。

我尝试了不同的psm选项,并发现-psm 6最适合我的情况。

有关详细信息,请参见man tesseract


所述与数字相关的信息已从常见问题解答中删除。 - user598527
所述与数字相关的信息已从常见问题解答中删除。 - undefined

15

If one want to match 0-9

tesseract myimage.png stdout -c tessedit_char_whitelist=0123456789

如果想要匹配0-9中的任意数字,但又想在其中加入一个或多个不同的字符,可以使用如下正则表达式:

tesseract myimage.png stdout -c tessedit_char_whitelist=01234ABCDE

14

对于Tesseract 3,我尝试根据常见问题解答创建配置文件。

在调用Init函数之前或将其放入名为tessdata/configs/digits的文本文件中:

tessedit_char_whitelist 0123456789                 

然后,它通过使用命令运行:tesseract imagename outputbase digits


9

我用tess-two稍微改了一下,或许对某些人有用。

所以首先你需要初始化API。

TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(datapath, language, ocrEngineMode);

接下来设置以下变量:

baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "!?@#$%&*()<>_-+=/:;'\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, ".,0123456789");
baseApi.setVariable("classify_bln_numeric_mode", "1");

这样引擎只会检查数字。


5

当图片只包含一行时,使用"--psm 7 -c tessedit_char_whitelist=0123456789'"可以为我解决问题。


4

在版本4中不支持此功能。您仍然可以通过使用"--oem 0"和-c tessedit_char_whitelist = 0123456789来使用它,以恢复到旧的模型。

有赏金可解决此问题。

可能的解决方法:

@amitdo所述


3

1
我不知道为什么这个答案是第二个,因为它是最没有帮助和错误的。没有必要再进行培训过程,只是为了将字符列入黑名单! - Arijoon
3
我的回答中没有提到黑名单字符,但在某些情况下,即使我已经指示tesseract使用数字,它们也无法被识别为数字。在这种情况下,训练是唯一的出路。如果您有其他更好的处理方式,请分享您的经验。 - valentt

3
custom_oem=r'digits --oem 1 --psm 7 -c tessedit_char_whitelist=0123456789'

text = tess.image_to_string(croped,config=custom_oem)

我正在使用tesseract 4.1.1。

为了获得更好的结果,您可能需要考虑图像处理技术。


-2
我所做的是识别所有内容,当我有了文本后,除了数字以外的所有字符都被去掉。
//This replaces all except numbers from 0 to 9
recognizedText = recognizedText.replaceAll("[^0-9]+", " ");

这对我来说运作得相当不错。


5
你错过了提高OCR的质量和速度的机会。如果你将Tesseract限制在给定的字符集内,它的表现会更好。采用你的方法,你会失去宝贵的信息。 - Dmitry Zaytsev

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