document image processing

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

现在我正在寻找一些工具来简化开发。具体来说,我正在寻找一些工具来自动校正文档图像的倾斜,并分析文档结构(例如,将图像转换为四叉树结构以便于处理)。虽然我偏爱Java和ImageJ,但我对任何编程语言编写的库/代码/论文都感兴趣。

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


回答:

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

导入图片,创建打印部分的二进制掩码,并使用水平闭合(膨胀和侵蚀)扩大这些部分。

enter image description here

查询每个斑点的方向,聚类这些方向,并通过平均最大聚类的方向来确定整体旋转角度。

enter image description here

使用之前的角度来校正图像。此时可以进行OCR,但您会丢失文本块的空间信息,这会使后处理变得比必要的更困难。相反,通过水平闭合查找文本块。

enter image description here

对于每个连通组件,查询边界框位置和中心点位置。使用边界框位置提取相应的图像块,并对该块进行OCR。

enter image description here

此时,您有一系列字符串及其空间位置。这还不是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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注