从单词位置检测文本列

Ale*_*AIT 4 delphi ocr text design-patterns

我有一个tiff文件和文本,它在早期阶段已被OCR.单词的确切位置为信息(左上角,右下角).我现在需要在用户绘制的矩形中阅读文本.

正常的段落没有问题,但我不知道我应该如何处理文本列.如果彼此相邻有两个段落,只需将该行作为单行将使结果无法使用.

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

我也不确定列表/表格的影响,例如订单和账单.在这里,以线为导向的方法可能会更好.

我正在开发Delphi,但也可以欣赏其他语言的自适应算法.

编辑:我明天会尝试发布样本数据,但基本上我有一个单词数组,在图像上有各自的坐标(例如,我可以轻松地在它们周围画一个矩形).

Adr*_*thy 5

假设您的原始文本位于两列中,如下所示:

Aaaa bb ccc ddddd     mmmm nn oooo pp
eee fff ggggg hh      qqq rrrrrrrrr
i jjjj kkk lll        sss tttt uu.
Run Code Online (Sandbox Code Playgroud)

根据您的描述,听起来您的OCR已经为您提供了单个单词及其边界矩形.如果正交扫描原始页面,则给定行上的所有单词应具有相同(或非常接近)的y值.如果它们不完全相同,则可以对垂直位置进行整数除法,其中只有一小部分典型的箱高.那应该聚集y值.您可以对x坐标执行类似的处理,以确保列边缘的单词也具有相同的x值.

为了检测单独的列,我会尝试制作所有单词的所有"左"值的直方图(如果文本从右向左运行,则为右边缘).您应该在每列的开头看到一个峰值.

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

然后,您可以通过检查其左右坐标所在的水平范围,将您的单词划分为列组.在我们的示例中,来自Aaaathrough 的单词lll将最终出现在第一个分区中,而来自mmmmthrough 的单词uu.将最终出现在第二个分区中.

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

同样的基本思想可以应用于表格和文本列,但您可能需要一些调整来处理像右对齐的单元格这样的事情.