【问题标题】:document image processing文档图像处理
【发布时间】:2011-12-03 02:20:13
【问题描述】:

我正在开发一个用于处理文档图像(主要是发票)的应用程序,基本上,我想将某些感兴趣的区域转换为 XML 结构,然后根据该数据对文档进行分类。目前我正在使用 ImageJ 来分析文档图像,并使用 Asprise/tesseract 来进行 OCR。

现在我正在寻找使开发更容易的东西。具体来说,我正在寻找能够自动校正文档图像并分析文档结构的东西(例如,将图像转换为四叉树结构以便于处理)。虽然我更喜欢 Java 和 ImageJ,但我对任何库/代码/论文都感兴趣,不管它是用什么编程语言编写的。

虽然我正在使用的系统应尽可能自动处理数据,但用户应监督结果,并在必要时更正系统建议的分类。因此,我有兴趣使用机器学习技术来获得更可靠的结果。处理类似文件时,例如特定公司的发票,其结构通常相同。当用户以前更正了来自公司的文件数据时,将来应该考虑这些更正。我对机器学习技术的了解有限,想知道如何实现我的想法。

【问题讨论】:

  • 您介意发布示例图片吗?它将评估解决方案的性能。
  • @Matthias Odisio 我自己无法在此处发布真实发票,但任何示例发票都可以。例如。这个here.
  • 谢谢,我可以提出一个解决方案。
  • 我会对它非常感兴趣!我不需要提取文档中包含的所有数据。基本上,我有兴趣获取发行者和接收者的名称和国家、发票编号、总金额以及由描述、单位、数量和金额组成的行项目列表。重要的是,最终算法应该能够可靠地处理许多不同格式的发票。但是,我对实现这一目标的任何信息感兴趣。
  • 糟糕,我在回答之前发表了评论。我已经编辑了我的答案,以便更容易复制粘贴代码。

标签: language-agnostic image-processing machine-learning classification


【解决方案1】:

我们用于倾斜角度检测的论文是:Gatos 等人在数字化文档中的倾斜检测和文本行位置确定。人。本文的唯一限制是它可以检测高达 -5 度和 +5 度的倾斜。在那之后,我们需要一些东西来给用户一个消息! :)

在您的情况下,主要是发票扫描,您可以很好地使用:多分辨率分析从具有灰度背景的文档中提取参考线 by Tag et。人。

我们在 MATLAB 中编写了代码,如果您需要帮助,请告诉我!

【讨论】:

    【解决方案2】:

    我曾经做过一个类似的项目,作为OpenCV 的长期用户,我最终再次使用它。 OpenCV 是一个流行的跨平台计算机视觉库,它为 C 和 C++ 提供编程接口。

    我发现了一个有趣的博客,上面有一篇关于使用 OpenCV 的 how to detect the skew angle of a text 的帖子,然后还有一篇关于 how to deskew 的帖子。

    要检索文档的文本并能够将较小的图像传递给 tesseract,我建议查看bounding box 技术。

    我不知道图像采集过程是否是你的责任,但如果是你可能想看看如何做camera calibration with OpenCV来修复某些相机镜头引起的图像失真。

    【讨论】:

      【解决方案3】:

      Mathematica 中的以下原型查找文本块的坐标并在每个块内执行 OCR。您可能需要调整参数值以适应实际图像的尺寸。我没有解决问题的机器学习部分;也许您甚至不需要它来进行此应用程序。

      导入图片,为打印的部分创建二进制蒙版,并使用水平闭合(膨胀和腐蚀)放大这些部分。

      查询每个 blob 的方向,对方向进行聚类,并通过平均最大聚类的方向来确定整体旋转。

      使用前一个角度拉直图像。此时 OCR 是可能的,但您会丢失文本块的空间信息,这将使后处理变得比需要的困难得多。相反,通过水平关闭来查找文本块。

      对于每个连接的组件,查询边界框位置和质心位置。使用bounding box位置提取对应的图像patch,并对patch进行OCR。

      此时,您有一个字符串列表及其空间位置。这还不是 XML,但听起来是一个很好的起点,可以直接根据您的需求进行定制。

      这是代码。同样,形态函数的参数(结构元素)可能需要根据实际图像的比例进行更改;此外,如果发票过于倾斜,您可能需要粗略地“旋转”结构元素,以便仍然实现良好的“不倾斜”。

      img = ColorConvert[Import@"http://www.team-bhp.com/forum/attachments/test-drives-initial-ownership-reports/490952d1296308008-laura-tsi-initial-ownership-experience-img023.jpg", "Grayscale"];
      b = ColorNegate@Binarize[img];
      mask = Closing[b, BoxMatrix[{2, 20}]]
      orientations = ComponentMeasurements[mask, "Orientation"];
      angles = FindClusters@orientations[[All, 2]]
      \[Theta] = Mean[angles[[1]]]
      straight = ColorNegate@Binarize[ImageRotate[img, \[Pi] - \[Theta], Background -> 1]]
      TextRecognize[straight]
      boxes = Closing[straight, BoxMatrix[{1, 20}]]
      comp = MorphologicalComponents[boxes];
      measurements = ComponentMeasurements[{comp, straight}, {"BoundingBox", "Centroid"}];
      texts = TextRecognize@ImageTrim[straight, #] & /@ measurements[[All, 2, 1]];
      Cases[Thread[measurements[[All, 2, 2]] -> texts], (_ -> t_) /; StringLength[t] > 0] // TableForm
      

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 2011-06-12
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 2011-04-22
        相关资源
        最近更新 更多