如何忽略 OCR Engine 没有意义的输出?

Posted

技术标签:

【中文标题】如何忽略 OCR Engine 没有意义的输出?【英文标题】:How to neglect the output of OCR Engine that has no meaning? 【发布时间】:2012-04-28 03:09:31 【问题描述】:

Tesseract OCR 引擎有时会输出没有意义的文本,我想设计一种算法来忽略任何没有意义的文本或单词,下面是我想忽略的某种输出文本,我的简单解决方案是计数识别文本中由“”分隔的单词和包含太多单词的文本将是垃圾(提示:我正在扫描最多包含 40 个单词的图像)任何想法都会有所帮助,谢谢。

 wo:>"|axnoA1wvw\
 ldflfig
 °J!9O‘ !P99W M9N 6 13!-|15!Cl ‘I-/Vl
 978 89l9 Z0 3+ 3 'l9.l.
 97 999 VLL lLOZ+ 3 9l!q°lN
 wo0'|axno/(@|au1e>1e: new;
 1=96r2a1ey\1 1uauud0|e/\e(]
 |8UJB) p8UJL|\7'

【问题讨论】:

非常广泛的问题。首先,你怎么知道一个文本或一个词是否没有意义? (即你有一本完美的字典吗?)。你如何解释本地错误?例如。如果“ENGINE”被读作“ENGTINE”,你会完全丢弃它吗?我可以继续说下去。 除了查看字长之外,您还可以查找太多连续符号,或文本语言中不出现的连续字母组合。 1-3 个字母的单词不太可能拼写错误或来自其他语言,因此字典可以帮助解决这些问题。 【参考方案1】:

将输出文本分成单词。将单词分成三组。计算三重频率,并与已知良好文本语料库的文本中的三重频率进行比较(例如,一些邮件列表中讨论您打算进行 OCR 的所有文章,减去标题行)。

当我说“三元组”时,我的意思是:

whe, hen, i, say, tri, rip, ipl, ple, les, i, mea, ean

...所以在这个简短的例子中,“i”的频率为 2,而其他的都是频率 1。

如果您对使用预期语言的大型文档的这些三元组中的每一个进行频率计数,则应该可以相当准确地猜测字符串是否使用相同的语言。

当然,这是启发式的。

我在密码更改程序中使用了类似的方法来检测英文密码。它工作得很好,虽然没有完美的“明显的密码拒绝器”这样的东西。

【讨论】:

这些“三元组”被恰当地称为三元组。【参考方案2】:

对照字典查单词?

当然,这会对诸如外来短语或代码之类的内容产生误报。一般的问题是难以解决的(例如是this 代码还是乱码?:))。唯一(几乎)完美的方法是将其用作启发式方法来标记某些部分以供人工审核。

【讨论】:

以上是关于如何忽略 OCR Engine 没有意义的输出?的主要内容,如果未能解决你的问题,请参考以下文章

Python OCR:忽略文档中的签名

没有名为“Ocr”的模块

[转]tesseract OCR Engine overview字符识别学习

如何设置图像大小以改善 OCR 输出。?

ABBYY OCR SDK:我正在尝试识别名片但没有得到任何输出的示例脚本

Tesseract OCR 不会忽略黑名单字符