发票/OCR: 检测发票图像中的两个重要点

3

我目前正在开发OCR软件,我的想法是使用模板来识别发票内部的数据。

然而,扫描的发票可能存在一些问题:

  • 并非所有基于单个模板的发票都正确对齐在扫描仪下面。
  • 人们可以在发票上写字。
  • 等等。

发票示例:(必须通过Google搜索,很遗憾无法添加更具体的版本,因为客户数据显然是机密的)

Example invoice

我根据文本的x值在发票中找到我的数据。

但是,在我能够使用检索到的所有数据进行任何实际计算之前,我需要知道发票的比例和左/右的偏移量。

我到目前为止尝试了什么?

1)使图像单色,并使用第一个黑色像素出现的左右边界。由于人们可以在发票上写字,此方法失败了。

2)将发票划分为垂直部分,使用黑色像素最多的部分。由于分布在类似模板之间并不总是均匀的,所以此方法失败了。

我真的需要您的帮助,关于(1)如何识别发票中的重要点,以及(2)我应该关注哪些重要点。

希望问题已经足够清楚,因为很难解释。


你可以依赖发票的哪些固定部分?表格本身,特别是它的黑盒子,在所有扫描中都会被使用吗?灰色背景也可用吗,还是在某些扫描中会丢失?即使图像应该旋转进行扫描,比例尺是否仍然相同,或者您也预计存在比例尺变化? - MvG
你使用什么技术来定位表格中的描述和数字? - joe
2个回答

1

检测旋转

建议您先检测直线。

查找(可能是随机的)具有高对比度的小区域,即大部分为白色但也有相当数量的黑色像素。然后尝试拟合这些黑色像素的线条,例如使用最小二乘法。删除离群值,并对剩余点拟合另一条线。必要时迭代此过程。评估拟合的好坏,即观察区域中有多少像素与该线条非常接近,以及该线条延伸到观察区域之外的距离。对若干区域执行此过程,您应该得到一份加权列表。

对于每条线,可以计算出线本身的方向和垂直于它的方向。其中一个数字可以从区间[0°,90°)中选择,另一个数字将是该值加上90°,因此只需存储一个数字即可。取所有这些方向,并找到最匹配它们的一个角度。您可以使用滑动窗口(例如5°)来完成:在该(循环)区域内滑动并找到最大数量的线位于窗口内的值,然后计算窗口内角度的平均值或中位数。可以考虑线的权重来完成所有这些计算。

一旦您找到了线的方向,就可以将图像旋转,使得线与坐标轴完全对齐。
检测平移:
假设图像在任何时候都没有缩放,然后尝试使用基于FFT的相关性将图像与模板匹配。将两个图像都转换为灰度,并用零填充它们,直到原始图像最多占用填充图像的边缘长度的1/2,而填充图像最好是2的幂。在两个方向上都进行FFT,将它们逐元素相乘并iFFT回来。生成的图像将编码两个图像相对于彼此的给定移位有多少协议。只需找到最大值,您就知道如何使它们匹配。
添加的文本不会造成任何问题。这种方法最适合大面积区域,例如公司徽标和灰色背景框。细线将提供较差的匹配,因此在这些情况下,您可能需要在进行相关性之前模糊图片以扩大特征。您不必在进一步处理时使用模糊图像;一旦您知道偏移量,就可以返回旋转但未模糊的版本。
现在您知道了旋转和平移,并且假设没有缩放或剪切,因此您知道模板的哪个部分对应于扫描的哪个部分。继续。

有趣的阅读,感谢您的回答。不过我已经设计了一种处理旋转的方法。您是否知道如何同时检测缩放和平移?至少我现在知道需要在(任意?)图像中寻找平移和缩放,更具体地说是发票。 - skiwi
@skiwi:检测缩放的一种可能方法是(重新)使用我方法中检测到的线条:它们应该与表单中的线条匹配,因此可以寻找一个匹配,使所有距离都按比例缩放。我曾经与某人合作,将扫描图像与线条相交,通过查看交叉模式,能够获得有关原始图像的一些信息。不过我不确定我能否直接了解其中的细节。也不确定它是否适用于这里。 - MvG

0
如果旋转已经解决,我会将所有像素颜色值水平和垂直地相加到单个水平/垂直“线”中。这应该提供明显的尖峰,其中您在形式上具有水平和垂直线。
附注:使用Gimp的缩放功能生成了相应的水平图像,如下所示(因为只有一个像素高,可能会被缩小,因为它> 700 px宽;url为http://i.stack.imgur.com/Zy8zO.png)。

Image compressed vertically to a horizontal line


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接