赞
踩
文字识别从本质上可以归类为序列化标注问题,主要目标是寻找文本串图像到文本串内容的映射,类似于NLP
, 但与之不同的是 OCR
具有一些独特性:
- 局部特性:文子串中的局部会直接体现在整个识别目标中;
- 组合特性:文字串的内容组合千变万化
step 1 图像输入: 对于不同的图像来说,因为有着不同的格式和压缩方式,所以需要使用不同的方法进行解码;
step 2 图像预处理: 主要包括二值化、去噪声、倾斜矫正等;
step 3 版面分析: 对文档图片分段落、分行的过程,称为版面分析;
由于实际文档的多样性、复杂性,目前还没有一个固定、统一的切割模型。
step 4 字符切割: 因为需要对每个字做识别,所以需要将版式的文字切割成一个个单字,以便用于后续的识别分类器的使用;
step 5 字符识别: 由早期的模板匹配,到后期的特征提取;
step 6 版面恢复: 根据识别后的文字,回归到原始的文档图片那样显示,段落、位置和顺序都不变的输出到 Word 文档和 PDF 文档等;
step 7 后处理: 根据语言模型,对识别的结果进行语义校正。
在将图片输入检测之前会首先去对原图进行一次图片矫正操作,确保图片文字是水平方向,提高文本检测的准确性。图像矫正的方法一般有两种:水平矫正
,透视矫正
。
- 如果原始图像没有太大透视变形的情况,只是图像发生了角度旋转,则推荐使用水平矫正方法;
- 如果图像存在透视变形,则推荐使用透视矫正方法。
进行识别的图像大部分是卡证、票据、表单类数据,这类数据有些是有明显的轮廓边缘,有些没有明显的轮廓边缘,比如:文档型的图像,背景都是白色的,针对这种图像的话可以根据文本的边缘轮廓信息进行霍夫曼直线检测,然后进行角度检测旋转。有些具有明显的边界轮廓矩形的卡证类,可以先检测出最大轮廓然后根据轮廓角度直接旋转即可。
图片灰度化转为单通道图后,先使用 Canny
算子进行边缘检测,让图形的边缘信息凸显出来;再使用霍夫曼变换检测所有可能的直线;然后统计所有直线与水平方向角度并计算平均值;最后根据平均角度对原图以中心点为旋转点进行旋转矫正。
首先将图片 灰度化
去除噪声,进行 自适应二值化
,然后用 形态学闭操作
将断开的连成块,最后通过 轮廓查找角度
,关键操作包含以下两个方面:
- 找到最大面积的最小外接矩形,返回最小外接矩形的角度
- 找到所有轮廓的最小外接矩形,返回所有外接矩形的平均角度
具体流程如下:
最大轮廓矫正:
现在移动设备越来越普及情况下,印刷类型图片占比呈下降趋势,主流图片获取都是通过移动设备获得,但是通过移动设备获取录入图片质量,很容易受到当时的光线、角度等影响。有些图片可能存在一定的扭曲变形,直接对这些图片进行文本检测,检测出来的文本会存在一定的漏框少框。为了减少文本漏框少框现象,需在对图片进行文本检测前,先对图片进行透视变换矫正图片。
矫正结果如下:
传统图形学方法提取文本位置,一般可以分为两个部分,第一个是连通域的提取,第二个是文字连通域的判别。其中,将图像二值化后,通过连通域提取环节会将所有的连通域找出来作为候选集,然后根据 启发式规则
算法判断提取的连通域是否是文字连通域。流程如图所示:
MSER 的处理过程:
对一幅灰度图像取不同的阈值进行二值化处理,阈值从 0 至 255 递增,这个递增的过程就好比是一片土地上的水面不断上升,随着水位的不断上升,一些较低的区域就会逐渐被淹没,从天空鸟瞰,大地变为陆地、水域两部分,并且水域部分在不断扩大。在这个“漫水”的过程中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。在一幅有文字的图像上,文字区域由于颜色(灰度值)是一致的,因此在水平面(阈值)持续增长的过程中,一开始不会被“淹没”,直到阈值增加到文字本身的灰度值时才会被“淹没”。该算法可以用来粗略地定位出图像中的文字区域位置。
在深度学习序列化模型还未兴起的时候,传统文本识别还不能直接对文本行直接进行文字识别,因为词与词的组合、词组与词组的组合无法枚举穷尽,对这些词组直接分类基本不可能。相对于词语、词组,字符的个数可以穷尽,如果把文本识别当做单个字符的识别组合,那么任务就简单很多,因此传统的文本识别都是基于单字符的识别。传统字符分割的流程大致如下图所示:
每个文本行切片的局部图中,单个字符都是一个个独立的对象存在,如果能找到单个独立对象的轮廓信息,那么它的最小外接矩形也能通过一些 opencv 的函数获取得到;基于连通域的大致流程原理如下:
首先将文本切片二值化,使用 opencv 的 findContours
找到可能的单字符轮廓,然后根据经验规则过滤掉一些噪声,最后对轮廓的外接矩形使用 NMS
过滤些重复框,得到最终的单字符检测框。
文本行的局部图像中,除了文字像素外就是背景像素,单个字符文字区域内的像素在每列的分布和周围的像素分布有差异,字符与字符之间的空隙像素一般比较少,而在文字内像素分布比较多。
基于这样的规律,我们将文本行切片二值化变成黑底白字,统计每列中白色像素的个数,得到每列的白色像素的分布,然后根据规律找到黑白像素在列的范围尺度下的分割间隔点,最后根据分割间隔点对文本行进行单字符分割,得到最终结果,此过程处理字符分割的技术称之为垂直投影法字符分割,流程如下图所示:
字符分割间隔点修补过滤字符分割过程中存在字符粘连或者字符断裂情况,这样情况的发生是因为,粘连的部分白色像素个数明显高于其他分割点,被当成一个字符处理了。为了能正确分割出字符粘连情况,需要借助额外信息,比如平均字符宽度之类的信息,去裁剪分割点。字符断裂情况是由于有些中文字符具有偏旁部首或者去噪声、腐蚀的太厉害造成有些字符被弄成了两个或者多个;为了能正确分割字符,可以借助平均宽度处理。
在传统 OCR 文字识别领域,是将文本行的字符识别看成一个多标签任务学习的过程,也就是多分类问题。
- 在字符分类之前,我们首先将字符切片归一化成统一尺寸,参考经典手写字符分类尺寸大小
28x28
,统一尺寸后根据图像的常见算法去提取特征,比如hog
、sift
等;- 最后分类器选择支持向量机、逻辑回归、决策树等,模型训练完成可以集成端到端进行预测识别。大致流程如下:
传统的OCR解决方案存在着以下不足:
- 通过版面分析(二值化,连通域分析)来生成文本行,要求版面结构有较强的规则性且前背景可分性强(例如文档图像、车牌),无法处理前背景复杂的随意文字(例如场景文字、菜单、广告文字等)。
- 通过人工设计边缘方向特征(例如 HOG)来训练字符识别模型,此类单一的特征在字体变化,模糊或背景干扰时泛化能力迅速下降。
- 过度依赖字符切分的结果,在字符扭曲、粘连、噪声干扰的情况下,切分的错误传播尤其突出。
基于深度学习的 OCR 方法将一些繁琐的传统方法流程分为两个主要步骤:
- 文本检测(主要用于定位文本的位置)
- 文本识别(主要用于识别文本的具体内容)
顾名思义,文本检测就是要检测到图片中文字所在的区域,其核心是区分文字和背景。
常用的文本检测方法可以看我 文本检测专栏
通过文字检测对图片中的文字区域进行定位后,还需要对区域内的文字进行识别。
常用的文本识别方法可以看我 文本识别专栏
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。