文字切割算法-基于投影的切割


前言:

         文字识别的关键之所在就是单个文字的切割,切割的准确度极大的影响了文字识别的正确率。本文基于传统横纵投影的思想对文字进行切割,使用java与python实现了本算法。

基本思路:

         1、横向扫描,切出每一行

         2、对每一行进行纵向扫描,得出每一个字

经过对原始图像的相关处理,得出如下二值图(仅有黑白色)。这里的‘相关处理’是很复杂的,涉及图像学相关知识,我是通过opencv进行处理的。本文主要对切割算法进行讨论,图片处理部分望读者自行了解。

(待切割图)

横向扫描

         横向扫描就是依次从左往右统计,得出这一行黑色点的数量。比如上图尺寸为1200*430,经过横向扫描就可以得到430个数值,这个数值表示在1200个点中黑色点的数量。我们把这430个数直观的展示出来,可以得到下图:

(横向切割统计图,x:行数   y:黑色点数)

在上图中,y轴数值不为0的区域就是文字存在的地方,为0的区域就是每行之间相隔的距离。我们通过如下规则就可以找出每一行文字的起始点和终止点,以定位该行文字区域:1、如果前一个数为0,则记录第一个不为0的坐标;2、如果前一个数不为0,则记录第一个为0的坐标。形象的说就是从出现第一个非空白行(开始有字)到出现第一个空白行(没有字)这段区域就是文字存在的区域。

(横向切割说明图)

纵向扫描

         纵向扫描与横向扫描同理。针对横向扫描切割出的区域,进行纵向扫描,得出每一个字。

我们对横向扫描得出的第一行进行纵向扫描,可以得到1200个数值,如下图:

(横向切割统计图,x:行数   y:黑色点数  省略了部分区域)

再运用横向扫描的思维,对纵向扫描的数据进行切割,就可以得出单个文字了。

切割结果

(切割结果)

         可以看到切割结果有些不理想,会存在很多连在一起的字。

结果分析

         算法对于数字切割十分理想,但是对于汉字会存在切割失败的现象。分析发现部分汉字两两之间没有空白区域,是连在一起的,所以纵向扫描算法就无法准确切割。如下图所示:

所以直接使用投影进行切割,这种方法是不可行的。我们需要对该算法进行优化,以便得出更为准确的结果。优化算法敬请期待下篇(文字切割算法-投影切割优化)。

项目源码:我的github(https://github.com/printlin/tmOcr/tree/master)

猜你喜欢

转载自blog.csdn.net/print_lin/article/details/80143002
今日推荐