- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在开发 OCR 软件,我的想法是使用模板来尝试识别发票中的数据。
然而,扫描的发票可能有几个“缺陷”:
发票示例:(必须用谷歌搜索,遗憾的是无法添加更具体的版本,因为客户数据显然是 secret 的)
我根据文本的 x 值在发票中找到我的数据。
但是,在我可以对检索到的所有数据进行任何实际计算之前,我需要知道发票的比例和左/右偏移量。
到目前为止我尝试了什么?
1) 使图像成为单色并使用黑色像素第一次出现的左右边界。这失败了,因为人们可以在发票上写字。
2) 将发票分成垂直部分,使用黑色像素最多的部分。由于类似模板之间的分布并不总是统一而失败。
在 (1) 如何识别发票中的重点以及 (2) 我应该重点关注的重点方面,我真的需要你的帮助。
我希望这个问题足够清楚,因为它很难解释。
最佳答案
我建议您从检测直线开始。
(可能是随机地)寻找具有高对比度的小区域,即大部分是白色但也有相当数量的非常黑的像素。然后尝试为这些黑色像素拟合一条线,例如使用最小二乘法。删除异常值,并用另一条线拟合剩余的点。根据需要重复此操作。评估拟合的好坏,即观察区域中有多少像素真正靠近线,以及该线超出观察区域的距离。对多个区域执行此过程,您应该会得到一个加权行列表。
对于每条线,您可以计算线本身的方向以及与其正交的方向。这些数字中的一个可以从区间 [0°, 90°) 中选择,另一个将是 90° 加上该值,因此存储一个就足够了。采取所有这些方向,找到一个最适合所有方向的角度。您可以使用例如滑动窗口来做到这一点5°:滑动穿过该(循环)区域并找到窗口内最大线数的值,然后计算该窗口内角度的平均值或中值。所有这些计算都可以在考虑线的权重的情况下完成。
找到线条的方向后,您可以旋转图像,使线条与坐标轴完美对齐。
假设图像在任何时候都没有缩放,您可以尝试使用基于 FFT 的图像相关性将其与模板匹配。将两个图像都转换为灰色,用零填充它们,直到原始图像最多占据填充图像边长的 1/2,最好是 2 的幂。在两个方向上对两个图像进行 FFT,将它们按元素相乘,然后返回 iFFT。生成的图像将编码两个图像对于给定的相对于彼此的偏移的同意程度。只需找到最大值,您就知道如何使它们匹配。
添加文本不会造成任何问题。此方法最适用于大面积区域,例如公司 Logo 和灰色背景框。细线会提供较差的匹配,因此在这些情况下,您可能必须在进行相关之前对图片进行模糊处理,以扩大特征。您不必使用模糊图像进行进一步处理;一旦知道偏移量,就可以返回到旋转但未模糊的版本。
现在您知道了旋转和平移,并且假设没有缩放或剪切,因此您确切地知道模板的哪个部分对应于扫描的哪个部分。继续。
关于image - 发票/OCR : Detect two important points in invoice image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19113525/
我刚刚通过更改 import * as CodeMirror 修复了一个错误简单明了import CodeMirror . 我复制了this code . (从 TypeScript 移植) impo
我调试(在 PyCharm 中)一个脚本。我在断点处停止,然后转到调试控制台窗口,然后从那里调用导入行,如下所示: import my_util1 from my_utils 然后我调用 my_uti
谁能给我解释一下 import 语句是如何工作的? 例如,我在 myapp/app/models 包中有一个类型 User: package models type User struct {
我想导入 Control.App进入一个引用 PrimIO.PrimIO 的模块通过不合格的名称 PrimIO在很多地方。当然,问题在于 Control.App还导出一个名为 PrimIO 的定义.我
我应该使用 from foo import bar 或者 import foo.bar as bar 当导入模块 还有无需/希望更改名称 (bar)? 有什么不同吗?有关系吗? 最佳答案 假设 bar
我正在 Windows 上使用 Theano 进行深度学习实验的第一步,我很惊讶仅仅加载库需要多少时间。 这是小测试程序: from time import time t0 = time() impo
在 TypeScript 中,如何在不创建任何别名的情况下从文件“导入 *”? 例如我有一个包含顶级导出函数的文件“utils”,我想导入所有这些函数而不为每个函数重新创建别名。 像这样: impor
我应该使用 from foo import bar 或 import foo.bar as bar 当导入模块并且不需要/希望更改名称(bar)? 有什么不同吗?有关系吗? 最佳答案 假设bar是fo
这个问题在这里已经有了答案: Use 'import module' or 'from module import'? (23 个回答) 关闭8年前。 我想知道代码片段之间是否有任何区别 from u
我试过了 from urllib import request mine = request.Request() 和 import urllib.request mine = urllib.reque
所以,我有一个关于 Python 导入的小谜团。我确信出于某种原因事情应该是这样的,因为 Guido 很少出错。但是,为什么会这样呢? $ cat myModule.py #!/usr/bin/pyt
我们正在将 Rails 3.2 应用程序升级到 Rails 4.0。 我们有一个 assets/stylesheets/application/index.css.sass加载一些其他 sass 文件
我正在开发一个相当小的 Typescript 代码库,该代码库已经足够大,可以拆分到多个文件中。这是一个二十一点游戏。我目前有一堆代码,看起来像: var player = new Player();
是否可以以当模块为 use 时的方式编写模块? d 没有显式导入所有子例程都被导入,当它是 use d 显式导入只有这些显式导入的子程序可用? #!/usr/bin/env perl6 use v6;
这个问题在这里已经有了答案: how to watch changes in whole directory/folder containing many sass files (9 个回答) 5年前
我真的很难让它在 xcode 4 中工作。 我有一个项目将在许多应用程序(网络)中重用,因此我创建一个工作区并添加我的两个项目。到目前为止,一切都很好....这就是失败的地方.. #import "J
经典提取器和新提取器之间的主要区别是什么,哪个最好用? 最佳答案 经典提取器使用原始工作流程,与爬虫和连接器相同。 新的提取器更加精简,通常看起来和感觉都更好,并且经典提取器中的许多小错误已在新提取器
在处理 google webfont import mixin 时,我注意到无法动态构建 @import URL。 .gFontImport (@name, @weights, @subsets) {
我正在关注Django 1.8 tutorial 。在我的项目中mysite ,有一个源文件夹polls 。文件夹中有views.py模块其中 index函数已定义。还有一个urls.py文件: fr
我想使用名为 warp 的第三方库编译一个简单的 Rust 程序: [package] name = "hello-world-warp" version = "0.1.0" [dependencie
我是一名优秀的程序员,十分优秀!