无法识别 Tesseract 中的数字 - android

Posted

技术标签:

【中文标题】无法识别 Tesseract 中的数字 - android【英文标题】:Trouble recognizing digits in Tesseract - android 【发布时间】:2012-04-28 14:36:39 【问题描述】:

我希望有人能告诉我为什么我的 Tesseract 无法识别一些带有数字的图像,如果有什么我可以做的。 一切都根据测试工作,因为它只是我需要的数字,我想我可以用英文模式来管理,直到我也必须从 7segmented 显示器开始。

虽然我在附加图像方面遇到了很多麻烦,但我想知道我是否应该开始研究我自己的识别算法,或者我是否可以为 Tesseract 做我自己的数据集,然后它会起作用,有人吗?知道 Tesseract 的限制在哪里吗?

尝试过的事情: 试图将 psm 设置为 one_line、one_word、one_char(并切碎图片)。 使用 one_line 和 one_word 没有显着变化。 使用 one_char 它确实识别得更好,但有时,由于间距大,它附加了一个额外的数字,然后把它搞砸了,如果你看一下附加的图像,那么它会导致 04。 我也尝试自己进行二值化,这导致识别效果较差并且非常消耗资源。 我试图反转图片,这对 tesseract 没有任何影响。

我已经附上了我需要处理的图片。

图片说明:

是 tesseract 可以毫无问题地识别的图像,尽管它是为了方便围绕工作图像构建应用程序而用 word 制作的。

是与 image_seven 匹配的真实图像。但它无法识别这一点。

是另一个我希望它识别的图像,是的,我知道它不能被歪斜,我在测试时做了解开(认为 skrew 是这里的术语=="straighting")它。

【问题讨论】:

skrew=skew nice :)。此外,图像工具集可以减少噪点、锐化等等。这可能会有所帮助 【参考方案1】:

我知道一些可能对您有所帮助的选项:

    在图像边框和文本之间添加额外的空间。如果图像中的文本位于边缘,Tesseract 会很糟糕。 复制您的图像。例如,如果您对单词“foobar”执行 OCR,克隆图像并将“foobar foobar foobar foobar foobar”发送到 tesseract,结果会更好。 Google 为 font trainingimage binarization 为 tesseract。

请记住,移动设备中的内置摄像头大多会产生低质量的图像(模糊、噪点、歪斜等)。OCR 本身是一个消耗资源的过程,如果您在其中添加有价值的图像预处理,那么低端和中型移动设备(可能有 android)可能会面临出乎意料的性能下降甚至资源不足的问题。这对于免费/研究项目来说是可以的,但如果您正在规划一个商业应用程序 - 考虑使用更好的 SDK。

详情请看这个问题:OCR for android

【讨论】:

感谢您的意见,我一定会尝试的。关于低端中端移动,普通的中段imo。至少有 3mpix 摄像头,这应该足够了,尽管自动对焦是一个问题,但它是可控的。为了避免图片歪斜,我在屏幕上设置了一个非常有限的矩形作为叠加层,因此也可以避免这种情况。但我同意它可能对手机来说太重了,我不介意它在服务器上运行,我只需要知道它首先工作,我还没有获得:-/ 虽然您知道如何复制和/或为图片添加框架吗?生病开始四处寻找它,只要你已经有任何经验:) 1 和 2 不起作用。我在折腾 tesseract,尝试改用 javaocr【参考方案2】:

Tesseract 不会为您进行分段。 Tesseract 将在实际的 tesseract 算法之前对图像进行阈值处理。阈值处理后,图像中可能会残留一些边缘、伪影。

尝试手动将您的图像修改为黑白颜色,并查看 tesseract 作为输出返回的内容。

尝试(自动)阈值化您的图像并查看 tesseract 作为输出返回的内容。阈值的输出可能太糟糕了,导致 tesseract 给出错误的输出。

您的第四张图片可能会因阈值处理而失败(您有 3 种颜色:黑色背景、灰色背景和白色字母),并且阈值可能介于(黑色背景、灰色背景)之间。

通常,Tesseract 想要漂亮的黑白图像。可能需要对图像进行预处理以获得更好的结果。

对于您的第一张图像(结果为“04”),尝试查看框结果(字符 + 包含已识别字符的框坐标)。 “0”可能是一个小的人工制品 - 就像一个 4 x 4 的像素块。

【讨论】:

【参考方案3】:

你可以试试 javaocr(http://sourceforge.net/projects/javaocr/,是的,我是开发者)

虽然没有正式发布,但您必须寻找来源(好消息:有工作的 android 示例,包括采样器、离线训练器和识别器应用程序)

如果你只有一种字体,你可以用它得到很好的结果(我在同一字体的数字上达到了 99.96 的识别率)

PS:它是纯 java 并且使用不变矩来执行匹配(所以缩放和旋转没有问题)。还有非常有效的二值化。

查看实际效果:

https://play.google.com/store/apps/details?id=de.pribluda.android.ocrcall&feature=search_result#?t=W251bGwsMSwxLDEsImRlLnByaWJsdWRhLmFuZHJvaWQub2NyY2FsbCJd

【讨论】:

试用了您的应用,似乎无法识别我的任何数字/图片:-/ 这个应用程序被训练成白色背景上的黑色文本。如果您需要底片,您可以在 javaocr 过程中尝试 android 样本(在二值化过程中只需稍作修改即可使用底片) PS:您可以发布识别结果截图吗?然后我可以提供更多提示 不需要,因为我的是底片:-) 好吧,你应该试试安卓演示。 也试过了,之前一直在尝试你的,尝试教它多种数字字体。尤其是这个问题遇到了很大的麻烦:dafont.com/silverball-oblique.font 仅供参考 :)

以上是关于无法识别 Tesseract 中的数字 - android的主要内容,如果未能解决你的问题,请参考以下文章

如何训练 tesseract 识别低 DPI 下的小数字?

如何使用 tesseract.js 识别乐透彩票上的日期和数字?

有没有办法将 tesseract 用于个位数?

Tesseract不会识别png文件中的验证码,该文件包含英文字母的数字和字母

Tesseract 无法识别随机英文字符序列

Tesseract 无法识别德语“für”