文字定位

经过前面的特征提取,我们已经较好地提取了图像的文本特征,下面进行文字定位。 主要过程分两步:

1、邻近搜索,目的是圈出单行文字;

2、文本切割,目的是将单行文本切割为单字。

邻近搜索

我们可以对提取的特征图进行连通区域搜索,得到的每个连通区域视为一个汉字。 这对于大多数汉字来说是适用,但是对于一些比较简单的汉字却不适用,比如“小”、“旦”、“八”、“元” 这些字,由于不具有连通性,所以就被分拆开了,如图13。 因此,我们需要通过邻近搜索算法,来整合可能成字的区域,得到单行的文本区域。

图13 直接搜索连通区域,会把诸如“元”之类的字分拆开。

邻近搜索的目的是进行膨胀,以把可能成字的区域“粘合”起来.。如果不进行搜索就膨胀,那么膨胀是各个方向同时进行的,这样有可能把上下行都粘合起来了。因此,我们只允许区域向单一的一个方向膨胀。我们正是要通过搜索邻近区域来确定膨胀方向(上、下、左、右):

邻近搜索* 从一个连通区域出发,可以找到该连通区域的水平外切矩形,将连通区域扩展到整个矩形。 当该区域与最邻近区域的距离小于一定范围时,考虑这个矩形的膨胀,膨胀的方向是最邻近区域的所在方向。

既然涉及到了邻近,那么就需要有距离的概念。下面给出一个比较合理的距离的定义。

 距离

图14 两个示例区域

如上图,通过左上角坐标(x,y)和右下角坐标(z,w)就可以确定一个矩形区域,这里的坐标是以左上角为原点来算的。 这个区域的中心是( (x+z) / 2, (y+w) / 2 )。对于图中的两个区域S和S′,可以计算它们的中心向量差

如果直接使用作为距离是不合理的,因为这里的邻近应该是按边界来算,而不是中心点。因此,需要减去区域的长度:

距离定义为

至于方向,由的幅角进行判断即可。

然而,按照前面的“邻近搜索*”方法,容易把上下两行文字粘合起来,因此,基于我们的横向排版假设,更好的方法是只允许横向膨胀:

邻近搜索   从一个连通区域出发,可以找到该连通区域的水平外切矩形,将连通区域扩展到整个矩形。 当该区域与最邻近区域的距离小于一定范围时,考虑这个矩形的膨胀,膨胀的方向是最邻近区域的所在方向,当且仅当所在方向是水平的,才执行膨胀操作。

结果

有了距离之后,我们就可以计算每两个连通区域之间的距离,然后找出最邻近的区域。 我们将每个区域向它最邻近的区域所在的方向扩大4分之一,这样邻近的区域就有可能融合为一个新的区域,从而把碎片整合。

实验表明,邻近搜索的思路能够有效地整合文字碎片,结果如图15。

图15 通过邻近搜索后,圈出的文字区域

文本切割

经过前面文字定位得到单行的文本区域之后,我们就可以想办法将单行的文本切割为单个的字符了。因为第三步的模型师针对单个的字符建立的,因此这一步也是必须的。

均匀切割

基于方块汉字的假设,事实上最简单的切割方法是均匀切割,也就是说不加任何判断,直接按照高度来将单行文本切割为一个个的正方形图片。这种思路可以应对大部分的单行文本,如下图。

当然,均匀切割的弊端也是很明显的。 大多数汉字都是方块汉字,但多数英语和数字都不是,因此如果出现中英文混排的时候,均匀切割就失效了,如上图。

统计切割 

从图15中可以看出,经过前面的操作,字与字都被很好地分离开了。 因此,另外一种比较简单的思路是对单行的文字图片进行垂直方向的求和,和为0的所在的列就是被切割的的列。

用这种统计的思路可以很好地解决中英文混排的单行文字图片分割的问题,但是它也存在一定的弊端。 最明显的就是诸如“小”、“的”等字就被切割开为两部分了。

前后比较

一个更好的思路是结合前面两部分结果,通过比较前后两部分区域是否组成方形来确定是否切割。 具体步骤是:

1。 通过统计求和的思路,得出候选的切割线;

2。 如果该候选切割线到左右两条候选切割线的距离之和超过宽长度的1。2倍,那么该候选切割线确定为切割线;

3。 如果得到的区域是一个明显的长条矩形,并且没办法按照上面两个步骤切割,那个就均匀切割。

这三个步骤比较简单,基于两个假设:

1、数字、英文字符的底与高之比大于60%;

2、汉字的底与高之比低于1.2。经过测试,该算法可以很好地用于前面步骤所提取的图片文本特征的分割。

OCR技术浅探 : 文字定位和文本切割(2)的更多相关文章

  1. OCR技术浅探:基于深度学习和语言模型的印刷文字OCR系统

    作者: 苏剑林 系列博文: 科学空间 OCR技术浅探:1. 全文简述 OCR技术浅探:2. 背景与假设 OCR技术浅探:3. 特征提取(1) OCR技术浅探:3. 特征提取(2) OCR技术浅探:4. ...

  2. OCR技术浅探(转)

    网址:https://spaces.ac.cn/archives/3785 OCR技术浅探 作为OCR系统的第一步,特征提取是希望找出图像中候选的文字区域特征,以便我们在第二步进行文字定位和第三步进行 ...

  3. OCR技术浅探: 光学识别(3)

    经过前面的文字定位和文本切割,我们已经能够找出图像中单个文字的区域,接下来可以建立相应的模型对单字进行识别. 模型选择 在模型方面,我们选择了深度学习中的卷积神经网络模型,通过多层卷积神经网络,构建了 ...

  4. OCR技术浅探:特征提取(1)

    研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究人员对相关的技术研究已久,也有不 ...

  5. OCR技术浅探: 语言模型和综合评估(4)

    语言模型 由于图像质量等原因,性能再好的识别模型,都会有识别错误的可能性,为了减少识别错误率,可以将识别问题跟统计语言模型结合起来,通过动态规划的方法给出最优的识别结果.这是改进OCR识别效果的重要方 ...

  6. OCR技术浅探: 语言模型(4)

    由于图像质量等原因,性能再好的识别模型,都会有识别错误的可能性,为了减少识别错误率,可以将识别问题跟统计语言模型结合起来,通过动态规划的方法给出最优的识别结果.这是改进OCR识别效果的重要方法之一. ...

  7. OCR技术浅探:Python示例(5)

    文件说明: 1. image.py——图像处理函数,主要是特征提取: 2. model_training.py——训练CNN单字识别模型(需要较高性能的服务器,最好有GPU加速,否则真是慢得要死): ...

  8. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)

    文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...

  9. 【转】腾讯OCR—自动识别技术,探寻文字真实的容颜

    文字,一种信息记录的图像符号,千年来承载了太多的人类文明印记.OCR,一种自动解读这种图像符号的技术,一直以来都备受关注.尤其在信息时代的今天,数字图像纷繁复杂,如何便捷高效的获取其中的文字信息,更有 ...

随机推荐

  1. 常用jar命令

    JAR包是Java中所特有一种压缩文档.存储格式格式就是.zip包.但是与ZIP包不同的地方是,生成JAR包时候,会自动添加一个META-INF\MANIFEST.MF文件 命令参数jar {c t ...

  2. PHP——修改数据库1

    主页面——0126.php 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  3. kafka_2.11-0.10.2.1中的auto.offset.reset

    在使用spark连接kafka消费topic时,发现无论怎么设置,也无法从头开始消费. 查看配置得出auto.offset.reset的以下3种设置及含义: earliest 当各分区下有已提交的of ...

  4. 脚本中出现“+ $'\r' : command not found

    脚本中的部分应该是从doc直接拷过来的,造成回车符“\r”出现问题 通过将脚本内容在linux下拷贝一次,就解决了这个问题!

  5. CSS3实现0.5px的边框

    前端页面细节处理好了才会显得精致.边框在网页中是常见的一种样式了.虽然不把它处理为0.5px看上去没毛病,但是想让你做的东西征服更多的人,这些细节处理是必须的. 今天主要说一下如何让边框显示0.5px ...

  6. python 2.7安装某些包出现错误:"libxml/xmlversion.h:没有那个文件或目录"

    解决办法: 1. ubuntu系统: 首先: apt-get install libxml2-dev sudo ln -s /usr/include/libxml2/libxml /usr/inclu ...

  7. Hadoop是原Yahoo的Doug Cutting根据Google发布的学术论文研究而来

    Hadoop是原Yahoo的Doug Cutting根据Google发布的学术论文研究而来.Doug Cutting给这个Project起了个名字,就叫Hadoop. Doug Cutting在Clo ...

  8. Statement和PreparedStatement都是用来发送和执行SQL语句的

    Statement和PreparedStatement都是用来发送和执行SQL语句的 DriverManager管理一组驱动程序

  9. java中不用BigInteger实现超大整数的乘法操作

    昨天看到一个题目:计算1234!,不能用BigInteger类 众所周知阶乘的数据会非常大,经常使用的int和long型根本不够用.一般想到的仅仅有BigInteger类,可是题目中明白说了不能用,所 ...

  10. php 文件下载代码

    1.对于一般 $file = "/tmp/dummy.tar.gz"; header("Content-type: application/octet-stream&qu ...