从图像中识别数字
image-processing
java
ocr
5
0

我正在尝试编写一个应用程序以查找图像中的数字并将其加起来。

如何识别图像中的书面编号?

在此处输入图片说明

图像中有很多框,我需要在左侧获取数字并将其求和以得出总计。我该如何实现?

编辑:我在图像上做了一个Java tesseract ocr,但是我没有得到任何正确的结果。我该如何训练?

我做了边缘检测,我得到了:

在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我建议结合2个基本的神经网络组件:

  • 感知器
  • 自组织地图(SOM)

感知器是非常简单的神经网络组件。它需要多个输入并产生1个输出。您需要通过提供输入和输出来训练它。这是一个自我学习的组成部分。

内部具有权重因子的集合,这些权重因子用于计算输出。这些重量因素在训练过程中得到完善。感知器的美丽之处在于,(经过适当的培训)它可以处理从未见过的数据。

您可以通过将感知器布置在多层网络中来增强其功能,这意味着一个感知器的输出将充当另一个感知器的输入。

在您的情况下,您应该使用10个感知器网络,每个数值(0-9)一个。

但是,为了使用感知器,您将需要一个数字输入数组。因此,首先需要将视觉图像转换为数值的工具。 自组织地图 (SOM)使用相互连接的点的网格。这些点应被吸引到图像的像素上(见下文)

自组织地图

这两个组件可以很好地协同工作。 SOM具有固定数量的网格节点,并且您的感知器需要固定数量的输入。

这两个组件都非常受欢迎,并且可以通过MATLAB等教育软件包获得。

更新:06/01/2018-张量流

该视频教程演示了如何使用Google的TensorFlow框架在python中完成此操作。 (单击此处获取书面教程)。

收藏
评论

在大多数图像处理问题中,您希望利用尽可能多的信息。给定图像,可以做一些假设(可能更多):

  1. 数字周围的框是一致的。
  2. 右边的数字始终为8(或提前知道)
  3. 左边的数字始终是数字
  4. 左边的数字始终是手写的,并且由同一个人书写

然后,我们可以使用以下假设简化问题:

  1. 您可以使用一种更简单的方法来找到数字(模板匹配)。有了匹配的坐标后,就可以创建一个子图像,然后减去模板,只剩下要提供给OCR引擎的数字。 http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
  2. 如果您知道期望的数字,则可以从其他来源获得这些数字,而不必冒险遇到OCR错误。您甚至可以将8作为模板的一部分。
  3. 基于此,您可以大大减少词汇量(可能的OCR结果),从而提高OCR引擎的准确性。 TesseractOCR有一个白名单设置可以执行此操作(请参阅https://code.google.com/p/tesseract-ocr/wiki/FAQ#How_do_I_recognize_only_digits吗?)。
  4. 对于OCR引擎来说,手写要困难得多(它们用于印刷字体)。但是,您可以训练OCR引擎来识别作者的“字体”。 (请参阅http://michaeljaylissner.com/posts/2012/02/11/adding-new-fonts-to-tesseract-3-ocr-engine/

要点是使用所有可以将问题简化为更小,更简单的子问题的假设。然后看一下有哪些工具可以单独解决每个子问题。

如果您必须开始担心现实世界,那么很难进行假设,例如如果要扫描现实世界,则需要考虑“模板”或数字的偏斜或旋转。

收藏
评论

您很可能需要执行以下操作:

  1. 在整个页面上应用霍夫变换算法,这应该会产生一系列页面部分。

  2. 对于您获得的每个部分,请再次应用它。如果当前部分产生2个元素,那么您应该处理与上述相似的矩形。

  3. 完成后,您可以使用OCR提取数值。

在这种情况下,我建议您看一下JavaCV (OpenCV Java包装器),它应该可以解决霍夫变换部分。然后,您将需要类似于Tess4j (Tesseract Java包装器)的工具,该工具应允许您提取所需的数字。

另外,为减少误报的数量,您可能需要执行以下操作:

  1. 如果您确定某些坐标永远不会包含您要获取的数据,请裁剪图像。这应该为您提供一张较小的图片。

  2. 将图像更改为灰度可能是明智的(假设您正在使用彩色图像)。颜色可能会对OCR分辨图像的能力产生负面影响。

编辑:根据您的评论,给这样的东西:

+------------------------------+
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
+------------------------------+

您将对图像进行裁剪,以便通过裁剪图像来删除没有相关数据的区域(左侧的部分),您将得到如下所示的内容:

+-------------+
|+---+---+    |
||   |   |    | 
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
+-------------+

想法是运行Hough变换,以便您可以获取页面的包含矩形的段,如下所示:

+---+---+    
|   |   |     
+---+---+ 

然后,您将再次应用霍夫变换,最后得到两个片段,然后取左一个片段。

一旦有了左段,就可以应用OCR。

可以尝试事先应用OCR,但是充其量,OCR会识别出两个数值,包括写入的值和键入的值,从我得到的结果来看,这并不是您想要的。

另外,描绘矩形的多余线条可能会使OCR偏离轨道,并导致产生不好的结果。

收藏
评论

神经网络是解决此类问题的一种典型方法。

在这种情况下,您可以将每个手写数字视为一个像素矩阵。如果使用与您要识别的图像相同大小的图像训练神经网络,可能会获得更好的结果。

您可以使用手写数字的不同图像来训练神经网络。一旦经过训练,如果您通过手写数字的图像进行识别,它将返回最相似的数字。

当然,训练图像的质量是获得良好结果的关键因素。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号