从图像中识别数字更新: 06/01/2018 - 张量流

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

如何识别图像中的写数字?

enter image description here

图像中有很多框,我需要获取左侧的数字并将它们相加以给出总数。我怎样才能做到这一点?

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

我做了一个边缘检测,我得到了这个:

enter image description here


答案 1

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

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

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

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

在这种情况下,我建议你看看JavaCV(OpenCV Java Wrapper),它应该允许你处理Hough Transform部分。然后,您将需要类似于Tess4j(Tesseract Java Wrapper)的东西,它应该允许您提取所需的数字。

作为额外的注意事项,若要减少误报的数量,您可能需要执行以下操作:

  1. 如果您确定某些坐标永远不会包含您想要的数据,请裁剪图像。这应该会给你一个较小的图片来使用。

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

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

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

您将裁剪图像,以便通过裁剪图像来删除没有相关数据的区域(左侧的部分),您将获得如下结果:

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

我们的想法是运行Hough Transform,以便您可以获得包含矩形的页面片段,如下所示:

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

然后,您将再次应用Hough Transform并最终得到两个段,然后取左段。

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

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

此外,描绘矩形的额外线条可能会使 OCR 偏离轨道,并使其产生不良结果。


答案 2

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

  • 感知器
  • 自组织地图

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

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

您可以通过将感知器排列在多层网络中来使其更强大,这意味着一个感知器的输出充当另一个感知器的输入。

在你的例子中,你应该使用10个感知器网络,每个数字值(0-9)一个。

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

Self Organized Map

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

这两个组件都非常流行,并且可以在MATLAB等教育软件包中使用。

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

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


推荐