【问题标题】:Grouping together of lines while doing line segmentation of printed text在对打印文本进行行分段时将行分组在一起
【发布时间】:2016-12-20 05:33:28
【问题描述】:

我一直在尝试从打印的文本文档中分割行。我遵循了以下论文:

基于霍夫变换的文本分割技术 Satadal Saha、Subhadip Basu、Mita Nasipuri 和 Dipak Kr。巴苏

根据论文,我使用霍夫变换在文本上生成直线并将角度限制在 90 度附近,并使用连通分量算法对生成的直线进行分组以从文本中分离出线。

霍夫变换输出如下:

但是,生成的直线有时会在两条文本行之间重叠,并且不止一条线段会组合在一起。

文中线条的边界框如下:

谁能帮我避免这种文本行组合在一起?请提出一种方法,以便连接组件分析将文本行视为单独的组件。

【问题讨论】:

  • 一个快速的建议是在 Hough 获得的图像中应用Erode 操作。内核应该像 1x3(即更长的高度)以在两行之间留出一些间隙。这将有助于制造一些间隙,从而避免重叠。
  • 我相信开放形态可能比侵蚀更干净,因为它会更加努力地保留您的实际尺寸(侵蚀会导致 2 像素尺寸过小框)。
  • @SneakyPolarBear 我尝试了你的建议。我得到了更好的结果。谢谢!

标签: matlab image-processing computer-vision image-segmentation text-extraction


【解决方案1】:

您正在使用连接的组件将您的霍夫线分组为文本线。此过程对噪声非常敏感:即使是一个错误检测的像素也会将两条线合并在一起。
如果您查看图像中每行的平均“开启”像素,您可以使此过程更加稳健:

bw = imread('http://i.stack.imgur.com/tg2xN.png');
bw=bw>100;
figure; plot( mean(bw,2) ); xlabel('image row'); ylabel('#"on" pixels');

红线显示每行“开启”像素数的阈值为 7.5%。如您所见,它可以帮助区分连接良好的霍夫线和错误连接的霍夫线。
使用此阈值修改掩码:

msk = bsxfun(@times, bw, mean(bw,2)>0.075);

现在您可以获得正确的边界框

bb=regionprops(bwlabel(msk,8),'BoundingBox');

结果:

【讨论】:

  • 这种方法(虽然很强大)有一个关键缺陷,即它假设全行长度。我的意思是说,段落末尾的很短的一行文本会产生错误的旅行如果你以某种方式标准化为行长,将会有更广泛的成功阈值。我可以看到这样做的一种方法是,如果您在文档中运行一个窗口平均像素。基本上每行(以及几行上的窗口)上的像素平均值是多少。您可以使用这个术语来规范化,因此我认为大大扩展您的目标区域
  • @SneakyPolarBear 你是绝对正确的。我想使这个答案尽可能清楚,并且我避免进行此类修改。但是,根据此输入的性质,您可以做一件更简单的事情:所有短行都以相同的方式变短:它们都从页面左侧开始。您可以进行列求和,看看您在哪里获得最大的“行支持”并仅根据这些列计算掩码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2017-04-01
  • 2016-10-26
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多