我想用它tesseract
来识别数字。问题是我混合了数字和字母,当我使用SetVariable("tessedit_char_whitelist", "0123456789")
每个符号时,tesseract 返回错误的数字。
我可以设置一个阈值以tesseract
省略相似度低的符号吗?
注意:我设置tesseract
为只识别数字,因此 O 和 0 之间没有混淆。
tesseract FAQ页面实际上回答了仅识别数字。有关更多信息,请参阅该页面,但如果您有版本 3 包,则配置文件已经设置。您只需在命令行上指定:
tesseract image.tif outputbase nobatch digits
至于阈值,我不确定你的意思。如果你的输入是一种不寻常的字体,也许你可以用你的输入样本重新训练。另一种方法是更改 tesseract 的修剪阈值。常见问题解答中也提到了这两个选项。
对于 tesseract 3,tesseract imagename outputbase digits
根据FAQ ,命令更简单。但这对我来说不是很好。
我转而尝试不同的psm
选择,并找到-psm 6
最适合我的情况。
man tesseract
详情。
对于 tesseract 3,我尝试根据FAQ创建配置文件。
在调用 Init 函数之前或将其放入名为的文本文件中tessdata/configs/digits
:
tessedit_char_whitelist 0123456789
然后,它使用以下命令工作:tesseract imagename outputbase digits
如果要匹配0-9
tesseract myimage.png stdout -c tessedit_char_whitelist=0123456789
或者如果一个人几乎想匹配 0-9,但有一个或多个不同的字符
tesseract myimage.png stdout -c tessedit_char_whitelist=01234ABCDE
我让它有点不同(用 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");
这样,引擎将只检查数字。
您可以指示 tesseract 仅使用数字,如果这不够准确,那么获得更好结果的最佳机会是通过培训过程: http ://www.resolverradiologic.com/blog/2013/01/15/training-正方体/
当图像仅包含 1 行时,添加“--psm 7 -c tessedit_char_whitelist=0123456789'”对我有用。
版本 4 不支持此功能。您仍然可以通过 -c tessedit_char_whitelist=0123456789 与“--oem 0”一起使用它,它会恢复为旧模型。
可能的解决方法:
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。
为了获得更好的结果,您可能需要考虑图像处理技术。
我所做的就是识别所有内容,当我有文字时,我会取出除数字以外的所有字符
//This replaces all except numbers from 0 to 9
recognizedText = recognizedText.replaceAll("[^0-9]+", " ");
这对我来说效果很好。