自动化图片文档结构分析 (Document Layout Analysis)

序言

识别一个文档,可以分为三个基本步骤,(1)基本预处理(二值化图片,旋转估算),(2)文档结构分析并提前文本行,(3)识别文本行。

这篇文章主要介绍ocropy里面的前面两个步骤的自动化处理。

作为例子,我们从下面这样图片开始分析如何进行这三个步骤:

holiday_notification

下面的图片需要下载安装deep_ocr, 然后运行下面命令行获得:

基本预处理

  • 旋转图片估计
  • 首先估算旋转的角度,这个可以靠图片的方差(下面代码的np.var的值)计算,然后找出最大的方差值作为旋转的角度。

    screenshot-from-2017-10-07-14-02-53

    上图代码代表图片没有文字旋转,因为0度的地方方差值是最大的。

  • 二值化处理
  • 接着以下代码估算二值化的最低和最高阈值(lo 和 hi):

    上面代码,先把图片的边缘部分(border)去掉,只剩下中心部分作为估计(est),然后用高斯滤波,过滤“细节”,然后求反。

    screenshot-from-2017-10-07-15-25-57

    二次滤波,继续把细节继续去掉,剩下可以看到都是文本行的地方。这次没有求反。

    screenshot-from-2017-10-07-15-29-39

    接着二值化,选取有文本的地方:

    screenshot-from-2017-10-07-15-31-38

    然后用数字形态学里面的膨胀,扩大一点范围作为二值化的lo和hi。

    screenshot-from-2017-10-07-15-34-15

    选取lo和hi的百分比对应的值:

    最后生成二值化的图片如何,效果好像不是很好,不过只是用于估算文本的文档结构使用,不是用于识别单个字使用。

    screenshot-from-2017-10-07-15-39-04

  • 分析文档结构
  • 这里主要为了提取图片中的文本行。举个例子,一般论文中的段落会带有列的,所以首先分析文本中的 列, 然后再提取文本行。

    首先使用以下代码,利用卷积,找出图片里面 列分割 空间。然后过滤出比较大的区域。

    结果图:

    screenshot-from-2017-10-07-19-54-02

    上面的结果还是蛮准确的,因为这个文本段没有分列。

    screenshot-from-2017-10-07-19-56-13

    接着用下面代码把小的噪音点去除。

    screenshot-from-2017-10-07-20-25-15

    上面就是去除噪音的结果图片。接着我们计算水平方向的梯度图。

    然后我们可以获得下面的梯度图,梯度图为文字所在的位置:

    screenshot-from-2017-10-07-20-44-59

    然后计算每行的底部和顶部:

    最终的行分割结果如何

    screenshot-from-2017-10-07-22-43-39

    蓝色为原始二值化图片,红色的 行 的可能分隔,绿色为上下分割线。

    基本上所有字段都分割出来了。

    下一章尝试结合训练好的单字识别器,进行对文本行识别。

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注