2011-10-04 38 views
4

我有一个tiff文件及其上的文本,它已在早期阶段被OCR。这些单词有其确切位置作为信息(左上角,右下角)。我现在需要阅读用户绘制的矩形内的文本。从字位置检测文本列

普通段落都没有问题,但我不知道我应该如何处理文本列。如果有两个段落相邻,则将该行作为单个行将会使结果不可用。

是否有算法来帮助我按照正确的顺序放置单词?我猜测我必须检查单词之间的空格以检测识别列的模式。我想避免直接处理图像,尽管它应该是可能的(但没有OCR)。

我也不确定列表/表格的影响,例如,在订单&票据。面向行的方法在这里可能会更好。

我在Delphi开发,但在其他语言的适应算法也将不胜感激。

编辑:我会尝试后的样本数据的明天,但基本上我有话数组,在图像上各自的坐标(我可以很容易地画出他们周围的矩形,例如)。

+2

示例数据将使得提供有用答案变得更容易。 – Argalatyr

回答

5

假设你的原文是两列这样的:

Aaaa bb ccc ddddd  mmmm nn oooo pp 
eee fff ggggg hh  qqq rrrrrrrrr 
i jjjj kkk lll  sss tttt uu. 

从你的描述,这听起来像你的OCR给你个人单词和他们的边界矩形。如果原始页面被正交扫描,那么给定行上的所有单词应该具有相同(或非常接近)的y值。如果它们不完全相同,则可以对垂直位置进行整数除法,使用典型框高度的一部分。这应该聚集y值。您可以在x坐标上执行类似的处理,以确保列边上的单词也具有相同的x值。

为了检测单独的列,我想尝试做的所有的话所有的“左”值的直方图(或右边缘,如果你的文本串从右到左)。您应该在每列的开头看到一个峰值。

您可以通过确保在每行中在列的候选开始之前的最后一个框的右侧坐标之间存在间隙来排除任何误报。差距应该至少与任何单词的最小宽度一样大。

然后,您可以通过检查其水平距离其左,右坐标下降到了分割你的话成列组。在我们的示例中,从Aaaalll的单词将在第一个分区中结束,而从mmmmuu.的单词将在第二个分区中结束。

在每个分区,然后你可以在网上通过在y坐标排序分区。最后,对于每一行,您在x坐标上排序。 (无论是按升序还是降序排列取决于您的坐标系和文本流向)

相同的基本思想可应用于表格以及文本列,但您可能需要一些调整来处理像右对齐的单元格。

+0

谢谢,这应该有助于我通过它。 –