自然场景文本识别:基于笔画宽度变换的文本检测

2024-02-10 20:18

本文主要是介绍自然场景文本识别:基于笔画宽度变换的文本检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自然场景文本识别:基于笔画宽度变换的文本检测

最近在学习自然场景(Natural Scenes)的文本识别(Text Recognition)问题,这一问题也是时下一个非常热门的亟待解决的问题。在阅读学习了一定量的文献资料之后,有了一定收获,本文提到的基于“笔画宽度变换”(Stroke Width Transform)的方法,是目前个人看到比较认同的方法。

        对于自然场景的文本识别,一个很重要的问题就在于如何从自然场景的图片中检测与定位出文本信息,考虑到文本的结构、像素、几何变形、背景复杂度、图像分辨率等多种问题带来的干扰,对于文本的检测着实存在着不小的难度。就本人所学习到的文献中所提到的文本检测定位的方法主要可以分为三类:基于连通域的分析、基于边缘特征的分析、基于纹理特征的分析。然而遗憾的是,由于以上的特征并不单单只属于文本独有的特征,比如植物以及某些景物都有类似的特征,这就意味着以上的方法还具有很多后续的处理需要进行,何况存在的很大的一个问题是,对于文本的检测,以上方法是否对所有的语言具有普适性,有待研究。

        本文所讨论的基于笔画宽度变换的方法,是个人在学习中看到的比较推崇的方法。这一方法的一个很大的优势在于,笔画特征基本上是属于文字独有的特征(当然也不排除某些视觉景物的干扰,需要后续操作加以剔除),而基于笔画特征,对于不同语言的文本是普适的,这是一个极大的优势。这一方法的一个基础的依据在于:统一的文本基本具有统一的笔画宽度。本文主要对Microsoft Corporation的文献Detecting Text in Natural Scenes with Stroke Width Transform 进行一定的学习,并加以总结,作为分享。

       下面就这一方法的几个主要的部分进行描述说明,首先再次强调的是本文方法所基于的基础现实是文本具有基本一致的笔画宽度。在论文中主要提出三部分过程来解决自然场景的文本识别问题,本文将依次总结介绍:


一、The Stroke Width Transform :

1、利用Canny edge detector对图像进行边缘检测,得到的每个边缘像素点p都具有一个方向梯度值dp;

2、若p位于笔画边缘,dp一定大致垂直于笔画方向,沿着射线 r=p+n*dp (n>=0)梯度查找与之对应的另一个边缘像素点q,那么dp与dq的方向是大致相反的(dp = dq ± π/6 ) ,此时会出现两种情况:

(1)p找不到对应的匹配的q或者dp 与dq不满足大致反向的要求,那么该射线r 废弃掉;

(2)如果找到满足要求的q那么在[p,q]这条路线上的每个像素点都会被指定笔画宽度属性值||p-q||(欧式距离),除非该店已经被指定了一个更小的笔画宽度属性值。

3、重复步骤2,计算出所有未被废弃的路线上的像素的笔画宽度值,算法结束。

注意:

(1)这一方法实质上就在对于每个可能属于文字部分的像素点与它最有可能所属的笔画建立联系,这一联系就是该笔画的宽度,可以想见的在未来的处理中,将会对该值相近的连通候选区域进行聚类,即认为他们属于同一笔画,进一步的可以构造出每个笔画,形成文字区域。

(2)在上述的过程中,实际上是默认了针对于亮底暗字的正向文本,如果是对于暗底亮字的反向文本,那在步骤2中就需要沿着dp的返方向来查找q,这样,在实际算法的推行过程中,是需要重复以上过程两次的:一次沿着dp方向,另一次则沿着-dp方向。


二、Finding letter candidates:

这一步要做的是,对于过程一中找到的候选文字狱加以剔除的处理,鉴于上一步骤中得到的结果可能存在干扰(如电线杆可能被识别为文字候选域),需要进一步的处理,主要有以下部分:

(1)计算每个连通候选区域各个像素点笔画宽度属性值的最大差值,对于差值太大的情况加以排除,这可以排除掉如树叶这样的区域,此处的 阙值设定为连通区域笔画宽度属性之平均值的一半;

(2)对于候选区域长宽比要求在0.1到10之间,不符合要求的剔除掉,对于电线杆等长宽比较大的区域可以排除;

(3)一块区域的边界框包含不超过两块区域,以消除文本外围包围线之类(符号框架);

(4)对于太大或太小的连通域也排除掉;

(5)单独的字符通常不出现在图像中,当作噪声剔除;


三、Grouping letters into text lines:

这里认为文本是以线性的形式出现的,一行文本时有相似之处的,如:笔画宽度、字幕宽度、高度、字符间距等。

如果两候选字符满足:

(1)具有相似笔画宽(中值之比小于2.0);

(2)高度比不超过2.0;

(3)距离不超过宽字符的三倍;

(4)颜色相近

等特征,那么就对满足条件的字符聚类,形成text lines,实际上,这并不需要在文本的检测中加以处理,在OCR的过程中是可以进行的。


OK,以上是个人学习的一点总结概括,如果个人理解有不当之处,或读者有进一步见解,欢迎留言探讨,共同学习。


这篇关于自然场景文本识别:基于笔画宽度变换的文本检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697973

相关文章

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景