具有密集输入和断开分隔符的分段页面

信息处理 图像分割
2022-02-16 17:59:44

我想分割一本历史书的页面,该书印刷密集并显示断开的黑色列分隔符,见下文。

二值化书页,显示断开的列分隔符。

我想要达到的是以下细分。

所需的页面分割。

到目前为止,我一直在玩ocropy ,它使用了 scipy/ndimage。但是使用的工具并不重要,我对可以解决这个问题的方法(形态学,...)感兴趣。

有任何想法吗?

1个回答

1 自上而下的方法

你的问题看起来像你

  1. 想要水平分割,
  2. 从左右图像边框缩小你的片段,
  3. 检查每个水平段中的文本列数,然后
  4. 在这些段中只需查找列。

1.1 – 水平分段

我能想到的最懒惰的方法:只需找到完全白色的连续线条。

为避免检测到正常文本行之间的空白,请为较大的段落间距设置“安全”边界。在其下方,检查下方和上方的非白线是否具有大致相同的长度。

1.2 – 水平收缩

只需找到不包含黑色的最外面的左右列。裁剪这些以及超出它们的所有内容。

1.3 & 1.4 – 检查列数和垂直段数

我会去:在纯白色段中找到列,接近“安全边距”,就像水平分割一样。如果剩下 1-3 像素宽的垂直线段,请检查它是否大致看起来像一条垂直线。

另一种方法是直接搜索垂直黑线(即通过列,计算黑色像素。如果列超过让我们说 40% 黑色 - > 垂直线),或者如果你必须首先取消图像,无论如何,开始你的在 1 之前使用霍夫变换的整个过程,并寻找接近图像中心的大致垂直线——这些将在霍夫斯典型的位置/角度平面中显示为峰值。

2 基于内容的自下而上方法

我要尝试的另一件事是从逻辑上讲:

  1. 检测字母和垂直线的轮廓
  2. 检测文本行的轮廓(通过对字母轮廓进行分组并使用垂直线作为边界)
  3. 检测段落的轮廓(通过分组行)

2.1 – 检测字母

差不多:找到黑色像素,找到所有直接连接的黑色像素,找到这些组的最小和最大 x 和 y,绘制包围它们的红色矩形。重复下一个黑色像素。(“画红色”我的意思是“将其标记为已处理”)

2.1a – 检测垂直线

与 2.1 相同,但只是按纵横比过滤检测到的矩形。标记为绿色,或者。

2.2 – 检测线条的轮廓

从左边开始,画一个符号轮廓,找到中心,向右移动直到你

  1. 击中垂直(绿色)线或
  2. 超过最大合理词距离或
  3. 点击图像边框或
  4. 点击下一个符号。

在情况 1.-3. 中,将所有找到的符号标记为一行的内容。在情况 4. 中,将找到的符号添加到“堆栈”行,然后重复。

2.3 查找段落大纲

从左上角开始,画一条线轮廓。下去。

如果您点击的下一个轮廓具有大致相同的开始和宽度,则添加到行堆栈。如果没有,或者您遇到了边界,请声明堆栈上的所有行一个段落,标记已处理,从顶部获取下一个未处理的行轮廓,然后重复。

3 自下而上的方法,基于空白

想法:黑白输入

  1. 选择一个白色像素
  2. 找到包围所述像素的最大未受干扰的白色(或红色)矩形。如果面积小于阈值,则标记为绿色。如果大于阈值,标记为红色
  3. 回到 1。

结果几乎应该是一个红色蒙版,当反转时,它会为您提供所需的分割。