基于多特征提取的手写汉字识别算法及其实现 第4页
接下来提取交叉点和轮廓。 假设交叉段只包括一个交叉点,当程序发现一个交叉段后,就首先计算交叉度和交叉点的位置,然后延长所有与该交叉段相接的轮廓段到该交叉点处,从而形成完整的字符轮廓。 假设 代表方向代码同为 且与同一个交叉段相接的轮廓段的个数,令 为该交叉段的交叉度,则有 。 为了确定交叉点的位置,本文按照方向代码考虑了全部四种不同的情况:
(1) ,即没有轮廓段。
(2) ,只有一个轮廓段,确定该轮廓段方向上与白色像素相邻接的黑色像素为交叉点。
(3) 且 至少有两个轮廓段,而且一个方向上最多只有一个轮廓段。 选择任意两个轮廓段并沿各自的方向将其延长,延长线的交点即为交叉点。
(4) , ,至少有两个具有相同方向代码的轮廓段. 如果有一对延伸方向相反的 向轮廓段,则标识量 置为1 ,相反则为0.此时确定交叉点时需要分三种情况讨论:
(a) ,不存在延伸方向相反的一对轮廓段. 如果有两个轮廓段方向码不相同,则将其沿各自的方向延长后必然会形成一个交叉点. 而如果所有轮廓段的方向码都相同,则将其中一段按估计的笔画宽度的某一倍数延长后即得到所期望的交叉点。
(b) ,只存在一对延伸方向相反的轮廓段. 用一段直线将它们连接起来,取该直线的中点作为交叉点。
(c) ,至少存在两个延伸方向相反的轮廓段. 任选两对轮廓段,将每对用一条直线相连,两条直线的交点便是所期望的交叉点。
提取出一个交叉点后,将每个在该交叉点相接的轮廓段与该交叉点连接起来,这样把所有轮廓段和交叉点都连接起来便构成了字符轮廓,即瘦化字符。
在提取出交叉点和轮廓段(即点特征和线段特征) 后,就可根据这两种信息进而提取基本笔画,根据轮廓段信息还可以提取出笔画方向图. 该处用一种简单的轮廓段合并策略将轮廓段合并成基本笔画. 依次检查各个交叉点处所有相接的轮廓段中是否有两个轮廓段共线,如果有就将它们合并成一个新的轮廓段,即基本笔画. 记φ1 和φ2 分别为两个轮廓段的方向角,令φ= min (| φ1 - φ2 | ,360°- | φ1- φ2 | ) 为两段的夹角,若155 φ 180°,则允许将两段合并. 然后以合并后的轮廓段取代原来的两个轮廓段,且更新轮廓段和交叉点的端点标记,同时选择与新轮廓段方向最接近的方向代码作为新的方向代码 。当检查完所有交叉点后,全部基本笔画便最终确定了。
最后根据各轮廓段的方向代码来绘制笔画方向图. 首先将 字符沿水平和垂直方向分成 个单元,每个单元为 ,其中 。选择每个单元中像素数目最多的轮廓段的方向代码为该单元方向码。如果某单元没有轮廓段经过,则其方向码置空( ) ,所有单元的方向代码一起就构成了笔画方向图.
2 基于多特征提取的识别算法
现在对于联机手写体的汉字识别算法很多,在本章第一节,我们先对这些算法做初步的分析认识,然后在其基础上导出多特征提取的算法,而用于实现这些算法的代码将在下章给出。
2.1 手写汉字识别的现行算法分析
2.1.1 以笔划序列为特征的算法
该算法将汉字的笔画分为若干类,然后根据各类笔画的输入顺序做为一个汉字的特征并存入字库,当汉字联机输入时,得到该文字图像的笔画序列特征并和字库中的特征进行比较,若有一组特征与该图像特征的差别很小,即可认为是同一字。下面我们先介绍笔画的分类方法,然后在分别介绍图像的预处理和距离定义。
在介绍笔划的划分前,我们先把二维平面做一个划分,如下图所示:
图2.1 二维平面的划分
在上图基础上,笔划通常划分为以下几种:
(1) 横,用数字1标识,方向为1;
(2) 竖,用数字2标识,方向为3;
(3) 撇,用数字3标识,方向为4;
(4) 捺,用数字4标识,方向为2;
(5) 折,用数字5标识,有至少两个方向;
在有些算法中,又把折细分为顺时针方向折、逆时针方向折和混合方向折三种,在此不再细述。
将笔划分类以后,我们就要面临一个问题,如何从文字图像的读入过程中得到方向序列,自然地我们会想到斜率,即得到一个笔划中每一相素点的斜率,然后依照上图得到该笔划的方向,但严格来讲,用斜率表示并不明智,比如方向3和7的斜率根本不存在。得到一个相素点方向的可行方法是:用该相素后面第二个点的坐标与该相素坐标做比较,如下:
1、 若point[a+2].y=point[a].y且point[a+2].x>point[a].x,方向1。
2、 若point[a+2].y=point[a].y且point[a+2].x<point[a].x,方向5。
3、 若point[a+2].x=point[a].x且point[a+2].y>point[a].y,方向3。
4、 若point[a+2].x=point[a].x且point[a+2].y<point[a].y,方向7。
5、 若point[a+2].x>point[a].x且point[a+2].y>point[a].y,方向2。
6、 若point[a+2].x>point[a].x且point[a+2].y<point[a].y,方向8。
7、 若point[a+2].x<point[a].x且point[a+2].y>point[a].y,方向4。
8、 若point[a+2].x<point[a].x且point[a+2].y<point[a].y,方向6。
为得到一笔划方向,在得到该笔划内各相素的方向后,我们还要做一些去噪处理。比如为消除下笔和收笔时的抖动误差而去除两边若干相素点、为消除书写时的歪曲而除去若干奇异点等。得到笔划方向序列后,就必须为以后的匹配定义距离,即定义何谓相似的标准。通常做以下定义:
距离d= 2.2
其中m为输入文字图像的笔划数, 为输入文字图像第 笔test[i]的笔划与字库中某组待比较特征的第 笔的相似度,经过大量的调查分析, 一般取值如下表:
横 竖 撇 捺 折
横 1 0 0.2 0.6 0.25
竖 0 1 0.6 0.6 0.1
撇 0.2 0.6 1 0 0.1
捺 0.6 0.6 0 1 0
折 0.25 0.1 0.1 0 1
表2.3 笔划的相似度表该算法的一般步骤如下:
(1) 从输入端得到输入点序列。
(2) 由输入点序列去噪、计算得到方向码序列。
(3) 将方向码序列去噪处理得到笔画码序列。
(4) 根据笔画码序列参照表2.3得到距离d,匹配判别识别汉字。
根据此定义得到距离后与事先设定的阙值dis进行比较,若d<dis 可认识两字相同,即对手写汉字图像做了识别。这种识别算法原理简单且易于实现,但也有其不足之处,例如:汉字“六”和“文”的笔划序列都是“4134”,所以无法正确识别。
2.1.2 基于统计特征的汉字识别算法
统计特征即汉字图像的相素分布特征 ,为简化起见,一般把汉字图像转换成二值图像再做处理,通常把一副汉字图像分成4*4=16或3*3=9个区,统计每个区的黑色相素点数,然后与字库里已有特征做比较,将距离最小的做为匹配字符。这种算法中的距离也有多种定义,通常采用两种方法,方差距离和绝对值距离,下面以绝对值距离为例,讲述一下该方法的具体应用。
下图是一个汉字图像并对其做了4*4划分,其中各区的特征值如图所示:
图2.4 汉字图像的统计特征图
现在把其特征表示为一个数组即test.p[16],若字库中第 组特征为tez[i].p[16],则待识别汉字图像与字库里第 个字的距离为:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页