从图像中识别数字更新: 06/01/2018 - 张量流
我正在尝试编写一个应用程序来查找图像中的数字并将其相加。
如何识别图像中的写数字?
图像中有很多框,我需要获取左侧的数字并将它们相加以给出总数。我怎样才能做到这一点?
编辑:我在图像上做了一个java tesseract ocr,但我没有得到任何正确的结果。我该如何训练它?
也
我做了一个边缘检测,我得到了这个:
我正在尝试编写一个应用程序来查找图像中的数字并将其相加。
如何识别图像中的写数字?
图像中有很多框,我需要获取左侧的数字并将它们相加以给出总数。我怎样才能做到这一点?
编辑:我在图像上做了一个java tesseract ocr,但我没有得到任何正确的结果。我该如何训练它?
也
我做了一个边缘检测,我得到了这个:
您很可能需要执行以下操作:
在整个页面上应用 Hough Transform 算法,这应该会产生一系列页面部分。
对于您获得的每个部分,请再次应用它。如果当前部分产生了2个元素,那么您应该处理一个类似于上面的矩形。
完成后,可以使用 OCR 提取数值。
在这种情况下,我建议你看看JavaCV(OpenCV
Java Wrapper),它应该允许你处理Hough Transform部分。然后,您将需要类似于Tess4j
(Tesseract Java Wrapper)的东西,它应该允许您提取所需的数字。
作为额外的注意事项,若要减少误报的数量,您可能需要执行以下操作:
如果您确定某些坐标永远不会包含您想要的数据,请裁剪图像。这应该会给你一个较小的图片来使用。
将图像更改为灰度可能是明智的(假设您正在使用彩色图像)。颜色可能会对 OCR 解析图像的能力产生负面影响。
编辑:根据您的评论,给出这样的东西:
+------------------------------+
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
+------------------------------+
您将裁剪图像,以便通过裁剪图像来删除没有相关数据的区域(左侧的部分),您将获得如下结果:
+-------------+
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
+-------------+
我们的想法是运行Hough Transform,以便您可以获得包含矩形的页面片段,如下所示:
+---+---+
| | |
+---+---+
然后,您将再次应用Hough Transform并最终得到两个段,然后取左段。
一旦你有了左段,你就可以应用OCR。
您可以尝试事先应用OCR,但充其量,OCR将识别两个数值,包括书面和键入的值,从我得到的来看,这不是您想要的。
此外,描绘矩形的额外线条可能会使 OCR 偏离轨道,并使其产生不良结果。
我建议结合2个基本的神经网络组件:
感知器是一个非常简单的神经网络组件。它需要多个输入并产生1个输出。您需要通过向它提供输入和输出来训练它。这是一个自学的组件。
在内部,它具有用于计算输出的权重因子的集合。这些体重因素在训练期间得到完善。感知器的美妙之处在于,(通过适当的训练)它可以处理以前从未见过的数据。
您可以通过将感知器排列在多层网络中来使其更强大,这意味着一个感知器的输出充当另一个感知器的输入。
在你的例子中,你应该使用10个感知器网络,每个数字值(0-9)一个。
但是为了使用感知器,你需要一个数字输入数组。因此,首先您需要一些东西将视觉图像转换为数值。自组织地图 (SOM) 使用相互连接的点的格网。这些点应该被吸引到图像的像素上(见下文)
这两个组件可以很好地协同工作。SOM 具有固定数量的网格节点,并且感知器需要固定数量的输入。
这两个组件都非常流行,并且可以在MATLAB等教育软件包中使用。