王凌燕
(山西传媒学院 融媒技术学院, 山西 晋中 303619)
随着我国经济的发展, 各行业各领域经济交流活动不断增多, 每天都产生大量的纸质合同、 表单表据等文件, 而由人工处理这些文件的工作量大, 且容易产生错误, 因而纸质文件的电子化处理需求不断提高。而现有的基于模式识别的OCR(Optical Character Recognition) 系统识别速度慢, 且对字迹清晰度和图片亮度的依赖性较大。针对上述问题, 笔者提出了一种基于DAG-SVM(Directed Acyclic Graph Support Vector Machine)的OCR识别系统。
OCR(Optical Character Recognition)指利用计算机技术将光学图片信息中的字符进行识别、 提取, 从而得到可编辑的电子文本[1]。OCR识别系统通常分为3部分: 图像预处理、 分割和字符识别。OCR识别系统性能的提高也是通过对这3个模块的研究与改进实现的。
图像预处理包括灰度化处理(最大值法、 均值法和加权平均值法)、 图像滤波(空域和频域)、 归正处理。图像分割包括二值化(迭代阈值法、 大方法、 灰度直方图法和分块阈值法等)和字符分割。字符识别的算法主要分为三大类: 模板匹配法、 神经网络识别法和统计支持向量机法。
通过文字识别的特性以及对各算法的仿真研究, 笔者采用加权平均值法对图像进行灰度化处理, 利用空域算法中的直方图均衡化算法完成图像滤波, 选择迭代阈值法和分块阈值法相结合的算法进行图像二值化, 采用投影算法分横向和纵向两次进行字符分割处理。在字符识别的几种算法中, 模板匹配法的算法简单, 其缺点是抗干扰性差, 神经网络算法的缺点是算法复杂, 实现相对比较困难, 因此笔者对支持向量机算法SVM(Support Vector Machin)进行了改进, 采用有向无环图SVM(DAG-SVM)算法进行字符识别处理。
笔者将基于模式识别的OCR识别系统分为3部分: 图像预处理、 分割和字符识别, 并分别对3个模块的算法进行了研究及实现。实验结果表明, 该系统识别率及速度均有提高。
图1 系统架构图Fig.1 System architecture diagram
系统的框架结构图如图1所示, 依次将待处理图片经过图像预处理、 分割和字符识别后, 提取出图片中的信息, 获得文本类型的信息。其中3个模块的主要功能如下。
1) 图像预处理。图像预处理是OCR识别系统的一个重要步骤, 因为图像在生成过程中经常会受到一些噪声的影响而造成图片质量下降, 比如光照的强弱变化、 角度的倾斜等都会给字符识别造成困难。因此, 必须对图像进行预处理, 主要包括图像滤波、 灰度化处理和归正处理等。
2) 图像分割。在进行图片信息的字符识别前, 通常还需要进行图像分割处理, 即将待处理的图像经特定的算法分成一定数量特定区域, 以突出OCR识别所关注的目标。图像分割技术同样是OCR识别的关键环节, 主要包括二值化处理和图像分割, 为后续OCR识别提供训练及测试样本。
3) 字符识别。其核心内容为基于模式识别算法, 对图像分割所得区域进行识别并输出结果。OCR识别算法主要包括模板匹配法、 神经网络分类法和支持向量机分类法等。
笔者下面对3个模块的具体算法设计及实现进行详细阐述。
图像预处理的主要内容包括灰度化处理、 图像滤波和图像归正。
通常需要处理的图像均为彩色图片格式, 彩色图像包含RGB(Red Green Blue)3个基色的像素值, 信息量较大。在图像识别处理中, 需要对其进行灰度处理, 从而降低图像大小, 提高处理效率。
图像灰度化即对图像的RGB3个通道的灰度值进行计算, 将24 bit像素的图像变换为8 bit图像, 主要分为3类: 最大值法、 均值法和加权平均值法[2]。
该系统采用加权均值法对图像灰度化进行处理, 灰度处理效果如图2所示。
图2 灰度化处理结果Fig.2 Grayscale processing results
具体采用的灰度值H计算公式如下
H=k0R+k1G+k2B
(1)
k0+k1+k2=1
(2)
其中R、G、B分别为3通道的像素值,k0、k1、k2为像素的加权值。根据人眼对绿色、 红色、 蓝色3个基色的敏感度高低, 选取3个参数的值依次为0.3,0.59,0.11。
待处理的图片由于光照、 背景等拍摄条件不同, 会加入不同程度的噪声, 因而要从图像中提取信息, 首先要对其进行滤波处理, 从而减少噪声, 提高图片质量。图像滤波方法主要包括空域和频域两种, 空域算法即在图片空间内对灰度像素值进行计算, 其算法比较简单, 但会造成一定的像素失真; 频域算法指将图像变换到频域中进行处理, 失真较小[3], 但其实现比较复杂。
该系统处理的图片对象中, 通常只关心其中的字符区域, 而其背景等因素则不予考虑, 且要求具有一定的实时性。综合上述考虑, 该系统采用空域算法中的直方图均衡化算法完成图像滤波。
一幅8 bit图像在范围[0,255]内共有L个灰度级, 其直方图定义为离散函数h(rk)=nk, 其中rk为区间[0,L]内的第k级亮度,nk是灰度级为rk的图像中的像素数。具体直方图均衡化算法由Matlab的工具箱函数histeq()实现。滤波前后的频谱图如图3所示, 由图3可以看出, 滤波加强了图像的主频谱。
图3 滤波前后的频谱图Fig.3 Spectrum before and after filtering
该系统图像归正的处理主要针对倾斜图像的调整, 具体算法如下。
1) 图像边缘检测。采用Hough变换算法完成图像的边缘检测[4], 形成图像的边缘矩形。
2) 倾斜处理。根据检测所得的矩形, 计算与X轴、Y轴方向的夹角, 并通过矩阵变换对图像进行倾斜处理。
图像归正实现的效果如图4所示。
图4 图像倾斜处理效果图Fig.4 Image processing effect
图像分割分为两个步骤实现: 二值化和字符分割。
二值化, 顾名思义, 是将整个图像的灰度值分割为两个数值。二值化的过程, 即将图像每个像素的灰度值处理在{0,1}区间内。二值化后的图像, 是一个取值只有0和1的逻辑数组, 可降低图像处理的复杂度。
图像二值化的主要算法包括: 迭代阈值法、 大方法、 灰度直方图法和分块阈值法等[5]。笔者对上述算法, 使用Matlab分别进行仿真实验, 并根据仿真结果, 最终决定选择迭代阈值法和分块阈值法相结合的算法。
3.1.1 迭代阈值法
图5 迭代阈值法流程图Fig.5 Flow chart iterative threshold method
迭代阈值算法二值化的流程图如图5所示。该算法首先采用迭代算法求取最佳阈值, 再对图像进行二值化处理, 相比于单一阈值法二值化误差更小。
3.1.2 分块阈值法
分块阈值法即首先对将图像进行分块, 随后对每一个分块分别采用单一阈值法进行二值化, 该算法可减小不均匀光照引起的二值化误差, 根据Matlab试验结果, 在2×3分割情况下, 分块阈值法的二值化效果最佳。
3.1.3 分块迭代阈值法
该系统采用二值化算法为上述两种算法的结合, 即分块迭代阈值法。具体实现过程为: 首先对图像进行2×3的分块, 然后对每个分块采用迭代阈值法进行二值化处理。二值化实现的效果如图6所示。
图6 二值化效果图Fig.6 Binary effect diagram
字符分割是对二值化处理后的图像进行切割, 获取字符图片块。该系统处理的图片信息一般横向填写, 而字符之间存在空隙, 因此采用投影算法分横向和纵向两次进行分割处理[6]。
3.2.1横向分割
横向分割的具体步骤如下:
1) 建立数组, 数组的长度为图像的总行数;
2) 分别对图像每行的灰度值进行累加, 并保存;
3) 对得到的数组值进行扫描, 判断相邻位置的数组中保存的灰度累加值是否为0, 若不为0, 则与当前数组位置进行聚合, 依次根据每行的灰度值, 对相邻数组位置的数值是否为零进行判断, 完成聚合, 并将聚合所得结果进行保存;
4) 对第1次聚合所得的结果, 可能存在干扰信息, 因而根据结果计算阈值, 大于该阈值的才能达到聚合要求, 小于该阈值的按空白行设置, 将干扰信息去除后, 最终可得横向分割结果。
图7为横向切割结果其中一行的效果图。
3.2.2 纵向分割
基于横向分割所得的结果继续进行纵向分割, 其原理与横向分割类似, 纵向分割的步骤如下:
1) 对每个聚合的行块, 建立数组, 数组长度为图像的列宽;
2) 纵向对每列的灰度值进行累加并保存于数组;
3) 类似于横向分割的方法, 对纵向的数组值依据相邻数组位置的灰度值是否为0进行聚合, 得到纵向聚合块;
4) 此时所得聚合块的内容主要为字符, 因而采用阈值法将过大或过小的聚合块去除, 最终可得纵向分割结果。
纵向分割的结果如图8所示, 经过阈值处理后仅保留汉字, 去除其中二维码部分的图片。
图7 横向切割结果 图8 纵向切割结果 Fig.7 Transverse cutting results Fig.8 Longitudinal cutting results
经过图像预处理及分割后, 所得到的字符块图像的尺寸存在差别, 直接进行字符识别会造成图像特征不一致。因此, 在进行图像分割后的字符图像需要进行归一化处理。
本系统分割后的图像大小平均值为30.95×32.11, 因此将所有的字符块经过插值/取值计算, 归算得到32×32像素大小的图像。
OCR字符识别的算法主要分为3大类: 模板匹配法、 神经网络识别法和统计支持向量机法。
模板匹配法即将测试样本与模板进行相似性比较, 通过计算得到相似度最高的模板, 即为模板匹配法的识别结果。模板匹配法主要包括两种: 一是将字符图像经点阵化处理后, 与标准的模板匹配提取特征进行比较; 二是首先对字符图像块进行特征提取, 然后再与模板进行比对。模板匹配法的算法简单, 其缺点是抗干扰性差[7]。
图9 DAG-SVM多分类器示意图Fig.9 Schematic diagram of DAG-SVM multiple classifiers
神经网络由若干简单原件以一定的层次组成, 并行连接构造而成网络, 其输入和输出的变换关系一般是非线性的, 具有一定的自学习、 自适应特点。神经网络目前广泛应用于模式识别领域, 具有学习能力强、 容错性好等特点[8]。神经网络算法的缺点是算法复杂, 实现相对比较困难。
支持向量机(SVM)[9-10]是基于统计学习理论发展起来的, 主要用于二类线性可分问题。其基本思想为: 首先选取合适的核函数, 主要包括多项式、 径向基函数、 双曲正切等, 将低维空间的样本通过非线性映射到高维特征空间中; 求解最优分类超平面, 其结果对应低维空间的非线性分类面[9]。SVM算法在解决非线性识别问题中拥有不可替代的优点。
由于SVM主要用于二分类问题[11], 因此本系统对支持向量机算法进行了改进, 采用有向无环图SVM(DAG-SVM)[12]。该算法的原理是在训练阶段训练k(k-1)/2个二类分类器, 在测试阶段构造一个有向无环图(见图9), 在进行决策时, 依次对类别进行判断。
表1 字符识别结果
该系统采用60幅图像进行了字符识别, 并基于Matlab对模板匹配法、 神经网络法和DAG-SVM算法分别进行了仿真实验, 结果如表1所示。
由表1可以看出, 按照识别率排序依次为神经网络法、 DAG-SVM算法和模板匹配法, 但考虑到神经网络算法的训练时间长且实现比较复杂, 因此该系统选择DAG-SVM算法作为字符识别的算法。
笔者提出了一种基于模式识别的OCR字符识别系统, 主要包括3个模块: 图像预处理、 分割和数字识别。图像预处理主要完成滤波、 图像灰度化和倾斜处理等; 图像分割包括二值化处理、 字符分割、 归一化, 完成对字符图像的切割; 字符识别则对分割所得的图像进行识别。该系统对字符识别的3类算法进行了研究及Matlab仿真, 综合识别率及实现复杂性选择DAG-SVM算法。经过仿真试验, 该系统的识别率为92.86%。下一步工作的重点是研究识别率更高的字符识别算法, 将人工智能前沿的深度神经网络与字符识别进行结合。