Lesson 1: 如何做文本行和文字分割

开发语言:python
建议系统:ubuntu

OCR中,把每个字分割出来是最难的,因为分隔出来后就可以进行单个图片的识别(现在识别器太多了, 整体来说单个图片的识别工作难度不大,现在又很多的库可以用。)。

假设我们已经有个文本段,没有什么杂音,譬如平时的电脑截图。

为了方便,我们继续以这个图片为例子:

test_data

需要一些初始化代码

图片数据读到image_color和灰度image里面,为了方便查看,这里我把图片放大两倍了。

首先, 我们开始对图片进行二值化处理:

screenshot-from-2016-10-01-12-51-16

可以看到,二值化的效果还是非常理想的,没有什么噪点。

现在的目标就是提取每行,然后分割每个字符。

screenshot-from-2016-10-01-12-54-15

上面的代码是把图像往水平方向的求和,然后画出结果。可以见到文本行被明显分隔出来。注意,这里我把y轴反了,因为图像的坐标0点在左上角。

接着需要提取数组里面的峰值,然后找出文本行,所以这里定义提取峰值函数:

有些图片比较多噪音,需要minimun_val和minimun_range用于过滤噪音。用这个函数提取峰值:

screenshot-from-2016-10-01-13-05-18

四行文字都被提取出来,然后可以对中文字分割。相类似, 使用垂直方向的求和把字符也可以找出来。

最后我们可以获得这样的一个大致的文字分割图,是不是很好呢 :)

screenshot-from-2016-10-01-13-15-50

在没有文字信息情况下,还有是有一些细节问题可以解决,譬如有些包围盒连续在一起,譬如第三行最后“本上就”连在一起。

这个利用每行宽度的中位值进行切割来解决:

上面的函数是利用中位置切割连在一起的包围盒。我们再分割一次,然后加上切割太长的包围盒。

下图是最终的结果,“本上就”被切割开了。

screenshot-from-2016-10-01-13-30-41

最后还有一个过分割的问题需要解决,但是这个需要识别器的配合才能解决。

简单来利用识别器识别包围盒的内容,假如包围盒的宽度比较小和属于数字,字幕,标点符号等,即不需要合并,否则如果是中文需要找附近的包围盒合并再次识别(譬如“比”字被切开两份)。

但是识别器超出这篇文章的内容。暂时不介绍,但是会在后续的文章继续介绍。好好继续玩玩图像识别 : )

源代码可以在这里下载

deep_ocr/lessons

《Lesson 1: 如何做文本行和文字分割》有8个想法

  1. 博主您好,我目前正在做身份证识别这块。因身份证上的文字,因光照污迹扭曲等原因导致二值化不够理想,进而导致分割出问题。请问博主有在不进行分割的前提下进行识别吗?

    1. 倾斜不粘在一起还好,还是可以靠空隙分割,最怕粘在一起,我写过一篇文章如何分割验证码。

    1. “最后还有一个过分割的问题需要解决,但是这个需要识别器的配合才能解决。” 这个是什么办法

发表评论

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