OCR技术分析
今天我们简单分析一下OCR技术的原理,不会涉及具体的算法解释和推导。毕竟每个算法都可以占很长篇幅,每个算法都可以重写。
总的来说,OCR一般分为两大步骤:图像处理和文本识别。
在识别字符之前,我们需要对原始图像进行预处理,以便进行后续的特征提取和学习。这个过程通常包括:灰度化、二值化、降噪、倾斜校正、文本分割等子步骤。每一步都涉及不同的算法。下面就以原图为例来说明一下每一步。
灰度处理,在RGB模型中,如果R=G=B,color表示一种灰色,其中R=G=B的值称为灰度值,所以灰度图像的每个像素只需要一个字节来存储灰度值(也叫强度值和亮度值),灰度范围为0-255。说白了就是把彩色图片变成黑白图片。
一般来说,彩色图像灰度化有四种方法:分量法、最大值法、平均法和加权平均法。
图像包括目标物体、背景和噪声。从多值数字图像中直接提取目标物体,最常用的方法是设置一个阈值T,用T将图像数据分为大于T的像素组和小于T的像素组两部分..这是研究灰度变换最特殊的方法,称为图像二值化。
二值黑白图片不含灰色,只有纯白和纯黑。
二值化最重要的是阈值的选择,一般分为固定阈值和自适应阈值。常用的二值化方法有:双峰法、P参数法、迭代法和OTSU法。
现实中的数字图像在数字化和传输过程中,往往会受到成像设备和外界环境的噪声干扰,称为噪声图像或噪声图像。降低数字图像中噪声的过程称为图像去噪。
图像中的噪声有很多来源,来自于图像的采集、传输、压缩等各个方面。噪声的类型也不同,如椒盐噪声、高斯噪声等。不同的噪声有不同的处理算法。
在上一步得到的图像中,我们可以看到很多零星的小黑点,这是图像中的噪声,会极大的干扰我们程序对图像的切割和识别,所以需要降噪。降噪在这个阶段非常重要,降噪算法的好坏对特征提取有很大影响。
图像去噪方法一般包括均值滤波、自适应维纳滤波、中值滤波、形态噪声滤波、小波去噪等。
对于用户来说,拍照时不可能做到绝对水平。所以我们需要通过程序旋转图像,找到一个被认为是最水平的位置,这样切割出来的图像才能是最好的效果。
最常用的倾斜校正方法是Hough变换,其原理是将画面展开,将断续的字符连成一条直线,便于直线检测。在计算出直线的角度后,我们可以使用旋转算法将倾斜的图片校正到水平位置。
对于一个多文本的文本,文本分割包括行分割和字符分割两个步骤,而倾斜校正是文本分割的前提。我们将倾斜校正后的文本投影到Y轴上,累加所有的值,这样就可以得到Y轴上的直方图。
直方图的底部是背景,峰值是前景(文本)所在的区域。所以我们确定了每一行文字的位置。
字符分割类似于行分割,只是这次我们要将每行文本投影到X轴上。
但需要注意的是,同一行中的两个字符往往靠得很近,有时会出现垂直重叠。投影时会被当成一个字符,导致切割错误(多为英文字符);有时同一字符的左右结构在X轴上的投影有很小的间隙,切割时会把一个字符错分成两个字符(多为汉字)。所以字符分割比行分割更难。
在这种情况下,我们可以预先设置一个字符宽度的期望值,如果被切割字符的投影超过期望值太多,则认为是两个字符;如果远小于该期望值,则忽略该间隙,并将该间隙左右两侧的“字符”组合成一个字符进行识别。
经过预处理后,就是字符识别阶段。这个阶段会涉及到一些人工智能的知识,比较抽象,无法用图片表达。我会尽量让它简单易懂。
特征是用来识别字符的关键信息,每个不同的字符都可以通过特征与其他字符区分开来。对于数字和英文字母,这个特征提取比较容易,总共* * *是10+26 x 2 = 52个字符,而且都是小字符集。对于汉字来说,特征提取的难度更大,因为首先汉字是大字符集;其次,国标中有3755个一级汉字。最后,汉字结构复杂,相似字多,所以特征维数比较大。
确定要使用的特征后,可能有必要减小特征的尺寸。在这种情况下,如果特征的维数过高,分类器的效率会受到很大影响。为了提高识别率,往往需要降维。这个过程也很重要,不仅要降低特征维数,还要让降维后的特征向量保留足够的信息(区分不同的字符)。
对于一个文本图像,把特征提取出来扔给分类器,分类器会对它进行分类,告诉你这个特征应该被识别为哪个文本。分类器的设计是我们的任务。分类器的设计方法一般有:模板匹配法、判别函数法、神经网络分类法、基于规则的推理法等等,这里不做描述。在实际识别之前,往往需要训练分类器,这是一个有监督学习的过程。有许多成熟的分类器,如SVM和CNN。
其实就是优化分类器的分类结果,一般涉及到自然语言理解的范畴。
首先是相似字的处理:比如“分”和“xi”这两个字,形状相似,但如果遇到“分数”这两个字,就不要认成“xi数”,因为“分数”是一个正常的字。这需要通过语言模型来纠正。
其次是文字排版的处理:比如有的书分左右两栏,同一行的左右两栏不属于同一个句子,没有语法联系。如果按线切割,会把左线的末端和右线的起点连接起来,这是我们不愿意看到的。这种情况需要特殊对待。
这是OCR的一般原理。总的来说,OCR的步骤比较多,涉及的算法比较复杂。对于每一步,每一个算法都有很多单独的研究论文,无法在本文中深入讨论。如果从零开始做OCR,那将是一个巨大的工程。我只是有点懵懂,在模式识别和机器学习的初级阶段。如有错误,请指正。