3

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

然而,扫描的发票可能有几个“缺陷”:

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

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

示例发票

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

但是,我需要知道发票的比例和从左/右的偏移量,然后才能对检索到的所有数据进行任何实际计算。

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

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

2)将发票分成垂直部分,使用黑色像素最多的部分。由于分布在相似模板之间并不总是一致的事实而失败。

我真的可以在(1)如何识别发票中的重点和(2)我应该关注的重点方面使用您的帮助。

我希望这个问题足够清楚,因为它很难解释。

4

2 回答 2

1

检测旋转

我建议你从检测直线开始。

寻找(可能是随机的)具有高对比度的小区域,即大部分是白色但也有相当数量的非常黑的像素。然后尝试为这些黑色像素拟合一条线,例如使用最小二乘法。删除异常值,并将另一条线拟合到其余点。根据需要进行迭代。评估拟合的好坏,即观察区域中有多少像素真正靠近线,以及该线超出观察区域的距离。对多个区域执行此过程,您应该得到一个加权的行列表。

对于每条线,您可以计算线本身的方向以及与其正交的方向。这些数字之一可以从区间 [0°, 90°) 中选择,另一个将是 90° 加上该值,因此存储一个就足够了。采取所有这些方向,并找到一个最适合所有方向的角度。您可以使用例如 5° 的滑动窗口来做到这一点:滑过该(循环)区域并找到窗口内的最大线数的值,然后计算该窗口内角度的平均值或中值。所有这些计算都可以在考虑线的权重的情况下完成。

找到线条的方向后,您可以旋转图像,使线条与坐标轴完美对齐。

检测翻译

假设图像在任何时候都没有缩放,那么您可以尝试使用基于 FFT 的图像相关性将其与模板匹配。将两个图像都转换为灰色,用零填充它们,直到原件最多占据填充图像边缘长度的 1/2,最好应该是 2 的幂。在两个方向上对两个图像进行 FFT,将它们逐元素相乘并返回 iFFT。生成的图像将编码两个图像在给定偏移下相对于彼此的一致程度。只需找到最大值,您就知道如何使它们匹配。

添加的文本根本不会引起任何问题。这种方法最适合大面积区域,例如公司徽标和灰色背景框。细线将提供较差的匹配,因此在这些情况下,您可能必须在进行相关之前模糊图片,以扩大特征。您不必使用模糊图像进行进一步处理;一旦您知道偏移量,您就可以返回到旋转但未模糊的版本。

现在您知道旋转和平移,并且假设没有缩放或剪切,因此您确切知道模板的哪个部分对应于扫描的哪个部分。继续。

于 2013-10-01T12:52:39.233 回答
0

如果已经解决了旋转问题,我只需将所有像素颜色值水平和垂直汇总为一条水平/垂直“线”。这应该在表单中有水平和垂直线的地方提供清晰的尖峰。

ps 使用 Gimp 的缩放功能生成了相应的水平图像,附在下面(有点难以看到,因为它只有一个像素高,并且可能会缩小,因为它 > 700 px 宽;网址是http://i.stack.imgur .com/Zy8zO.png)。

图像垂直压缩成水平线

于 2015-01-01T13:40:08.943 回答