我目前正在研究OCR软件,我的想法是使用模板来尝试识别发票内的数据。
然而,扫描的发票可能会有几个“缺陷”:
发票示例:(必须谷歌,遗憾的是无法添加更具体的版本,因为客户数据显然是保密的)
我根据文本的x值在发票中找到我的数据。
但是,在我可以使用我检索到的所有数据进行任何实际计算之前,我需要知道发票的比例和左/右的偏移量。
到目前为止我尝试了什么?
1)使图像单色并使用黑色像素的第一个外观的左右边界。由于人们可以在发票上写字,因此失败了。
2)将发票分成垂直部分,使用黑色像素数最多的部分。由于在类似模板中分布并不总是一致的,因此失败。
我可以真正使用你的帮助(1)如何识别发票中的重要点,以及(2)我应该把重点放在哪些重点上。
我希望这个问题很清楚,因为很难解释。
答案 0 :(得分:1)
我建议你从检测直线开始。
对于具有高对比度的小区域(可能是随机的),即大多数是白色但也有相当数量的非常黑色像素。然后尝试在这些黑色像素上插入一条线,例如:使用最小二乘法。丢弃异常值,并在剩下的点上安装另一条线。根据需要迭代它。评估拟合的好坏程度,即观察区域中有多少像素真正靠近线,以及该线延伸到观察区域以外的距离。对许多地区执行此过程,您应该获得加权的行列表。
对于每一行,您可以计算线本身的方向以及与其正交的方向。其中一个数字可以从区间[0°,90°]中选择,另一个可以是90°加上该值,因此存储一个就足够了。采取所有这些方向,找到一个最适合所有方向的角度。你可以使用例如滑动窗口来做到这一点。 5°:滑过该(循环)区域并找到最大行数在窗口内的值,然后计算该窗口内角度的平均值或中值。所有这些计算都可以考虑到线的权重来完成。
找到线条的方向后,您可以旋转图像,使线条与坐标轴完美对齐。
假设图像在任何点都未缩放,您可以尝试使用基于FFT的图像相关性将其与模板匹配。将两个图像转换为灰色,用零填充它们,直到原始图像占据填充图像的边缘长度的1/2,这最好应该是2的幂。在两个方向上对两个图像进行FFT,将它们与元素和iFFT相乘。得到的图像将编码两个图像对于给定的移位相对于彼此的一致程度。只需找到最大值,您就知道如何使它们匹配。
添加的文字根本不会引起任何问题。此方法最适用于大面积区域,例如公司徽标和灰色背景框。细线将提供较差的匹配,因此在这些情况下,您可能必须在执行关联之前模糊图片,以扩大功能。您不必使用模糊图像进行进一步处理;一旦你知道了偏移,你就可以回到旋转但不模糊的版本。
现在您知道旋转和平移,并且假设没有缩放或剪切,因此您确切地知道模板的哪个部分对应于扫描的哪个部分。继续进行。
答案 1 :(得分:0)
如果旋转已经解决,我只是将所有像素颜色值水平和垂直地汇总到单个水平/垂直“线”。这应该提供明确的尖峰,表单中有水平和垂直线。
P.S。使用Gimp的缩放功能生成相应的水平图像,附在下面(它有点难以看到,因为它只有一个像素高,可能会缩小,因为它的宽度大于700 px;网址为http://i.stack.imgur.com/Zy8zO.png)。