从OCR文本中提取段落分隔符?

10

我正在尝试从OCR处理过的图像文本输出中重新创建段落和缩进,如下所示:

输入(想象一下这是一张图像,而不是打字):

enter image description here

输出(存在一些错误):

enter image description here

正如您所见,没有保留任何段落换行或缩进。

使用Python,我尝试了以下方法,但它不起作用(失败率过高):

代码:

def smart_format(text):
  textList = text.split('\n')
  temp = ''

  averageLL = sum([len(line) for line in textList]) / len(textList)

  for line in textList:
    if (line.strip().endswith('!') or line.strip().endswith('.') or line.strip().endswith('?')) and not line.strip().endswith('-'):
      if averageLL - len(line) > 7:
        temp += '{{ paragraph }}' + line + '\n'
      else:
        temp += line + '\n'
    else:
      temp += line + '\n'

  return temp.replace(' -\n', '').replace('-\n', '').replace(' \n', '').replace('\n', ' ').replace('{{ paragraph }}', '\n\n      ')

有人有关于如何重新创建这种布局的建议吗?我正在处理旧书,所以希望能够使用LaTeX重新排版它们,因为可以轻松创建Python脚本来完成这项工作。

谢谢!


请澄清一下,您是只查看文本输出并猜测段落应该在哪里分开吗?还是还有其他的问题? - Mu Mind
我有源图像文件,但只使用输出的文本文件会更好。我正试图实现下面 @Nick ODell 的答案,但我的OpenCV技能非常生疏... - Blender
这难道是在段落的最后一行而不是之后插入段落分隔符吗? - Mu Mind
2
什么软件正在进行OCR(光学字符识别)?有些软件可以配置以提供换行。 - dkretz
@Mu Mind,看起来好像出了问题(捂脸)。让我们再试一次运行这个程序…… - Blender
@le dorfier 我正在使用几周前从 SVN 编译的 tesseract。它是唯一免费且能够产生良好结果(对于英文文本几乎完美)的 OCR 引擎。似乎有一些文档分析在进行,但我不知道它是否能够满足我的需求... - Blender
2个回答

5
您可以通过查看每个5-10像素水平切片的来将图像分成多个段落。虽然这通常用于从较大的图像或视频创建“有趣”的缩略图,但您也可以使用它来识别文本的存在或不存在。以下是方法。
您将图像分成一堆水平条带,每个条带高度为5-10像素。如果一个条带不是“繁忙”的,则可以假定那里没有文本。您可以使用此方法来隔离段落。现在,您单独取出每个段落,并将其输入到OCR中。

哦,那很酷。我会尝试做到这一点。我希望有一种不需要拆分图像的方法来完成这个操作,但如果它有效,那就可以了。 - Blender
最终,我做成了这个。由于行高几乎是恒定的,我扫描了每一行的熵(6000像素大约需要10秒),提取了行高,并从那里扫描像素条。谢谢! - Blender
没问题。很高兴知道你已经解决了你的问题。 - Nick ODell
链接已经失效了。不过,熵听起来像是我正在寻找的tesseract,所以谢谢。 - Pogrindis
1
@Pogrindis感谢您提供的信息,链接已修复。 - Nick ODell
不错,就我而言,我在使用tesseract时遇到了一些困难,所以只使用了cv2,使用采样并调整阈值。也许通过学习,它会识别得更好,但是你分割它的想法优化了处理过程,所以如果可以的话,我会给你双倍积分。 - Pogrindis

1
你可以尝试判断一行的第一个单词是否可以轻松地放在前一行,表明这是有意的换行,而不仅仅是寻找短行。除此之外(并且像你在例子中所做的那样密切关注标点符号),我认为唯一的其他选择是返回原始图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接