当前位置:文档之家› 联机手写数字识别实验报告

联机手写数字识别实验报告

联机手写数字识别设计一、设计论述模式识别是六十年代初迅速发展起来的一门学科。

由于它研究的是如何用机器来实现人(及某些动物)对事物的学习、识别和判断能力,因而受到了很多科技领域研究人员的注意,成为人工智能研究的一个重要方面。

字符识别是模式识别的一个传统研究领域。

从50年代开始,许多的研究者就在这一研究领域开展了广泛的探索,并为模式识别的发展产生了积极的影响。

字符识别一般可以分为两类:1.联机字符识别;2.光学字符识别(Optical Chara- cter Recognition,OCR)或称离线字符识别。

在联机字符识别中,计算机能够通过与计算机相连的输入设备获得输入字符笔划的顺序、笔划的方向以及字符的形状,所以相对离线字符识别来说它更容易识别一些。

参照联机字符识别的原理,我们对手写数字的特征进行了深入的研究,同时作为一个初学者,我们本次考虑设计联机手写数字0——9识别,以达到加深对《模式识别》课程理论的了解和掌握的目的。

二、设计内容本次设计,我们使用Visual C++ 6.0软件,在《模式识别》课程理论基础上,运用VC++语言设计联机手写数字识别系统。

三、设计原理1、基于笔划及笔划特征分类的联机识别联机手写汉字识别的方法可以分为两类:基于整字识别方法和基于笔划识别的方法。

大多数联机识别都是采取笔划识别的方法,这是因为在联机识别过程中,汉字笔划是以点坐标形式一笔一划地输入到计算机的,同样,数字在联机输入过程中也是按照一笔一划输入的。

笔划的分类有很多,基于便于识别的原理,我们在这里仅介绍一种笔划的分类。

我们把汉字看成是由把构成所有汉字的笔划分为两大类:即单向笔划和变向笔划。

单向笔划表示笔划的走向保持在某一方向上,即人们通常所说的基本笔划,包括有横(笔划代码1)、竖(笔划代码2)、撇(笔划代码3)、捺(笔划代码4)。

变向笔划的一种分类,规定变向笔划由三种笔划组成:(1)顺笔划(笔划代码5):笔划的变向是按照顺时针规律变化的;(2)逆笔划(笔划代码6):笔划的变向是按照逆时针规律变化的;(3)混合笔划(笔划代码7):笔划的变向既有顺时针又有逆时针规律变化。

同样,这样的汉字分类也适用于对数字0——9的笔划特征分类,这样的分类有助于我们对数字0——9的特征提取,在本次设计中,我们就参照汉字的这一分类。

2、联机数字识别的原理框图四、设计过程 1、前处理1)手写数字输入在设计数字输入时,我们设计了一个画板做手写屏,运行程序时,我们在该画板上用鼠标输入0——9的数字。

2)笔划识别前的噪声处理由于在原始笔划点坐标数据中,有大量的冗余和噪声,必须对这些输入数据进行预处理以消除这些冗余和噪声。

处理的方法有很多,这里根据汉字的特点,把笔划走笔方向进行8方向编码,如下图所示,将坐标平面的360度分为8个区,按顺序编号为1、2、3、4、5、6、7、8。

原始数据的滤波处理分为两步:第一步是对原始点坐标的滤波;第二步是对由这些点坐标所计算出的方向码的滤波。

原始坐标数据的滤波(1)平滑滤波处理由于同一笔划中的相相邻点具有一定相关关系,不可能出现距离较大的相邻点,这里可以采用一种有限的平滑处理方法。

X XXt ptpt)1(αα-+= L L max min <∆<手写数字输入前处理模式表达(特征抽取)判别后处理识别结果输出Y Y Yt pt pt)1(αα-+=L Lmax min<∆<))()1(()1(22Y Y X X t p t t p t -+-=∆--噪声点为:L max >∆;冗余点为:L m in <∆。

其中,(Y X t t ,)是笔划在t 时刻的坐标,下标p 表示经过平滑后的数据,α是平滑系数,10≤≤α,α越大,平滑后两点相关性越大,反正α为0,不进行平滑处理。

Lmin和L max 是判别冗余点和噪声点的距离阈值。

(2)笔划方向码的确定根据输入点坐标,由下式产生笔划方向码: )/()()()(X X Y Y m t p pt m t p pt k ----=其中,k 是两点间的变化斜率,根据斜率来确定出相应的方向码;m 是在计算t 时刻的方向码时,所取的前第m 点坐标。

在实际中m 的选取,带有很大的技巧和直感,通常选取m=,即只在两相邻点上计算方向码,显然这不能克服抖动所带来的噪声,m 取得太大,容易造成方向的错判。

这里的m 值需要根据实际所用手写板的采样频率等确定。

方向码的滤波处理由于在实际书写过程中,输入的笔划并不标准,在方向码序列中,还含有大量的噪声和人为的错笔,这就需要对方向码进行滤波。

(1)笔划起始处和终止处的噪声人们的书写习惯容易在落笔和抬笔是引入噪声,一般消除同一笔划的前两个方向码和后两个方向码,能克服这种噪声。

(2)笔划平直处的噪声笔尖的抖动容易造成在一串相同的方向码中混有一个或两个不同的方向码,删除这个方向码,即可克服这种噪声。

(3)笔划变向处的噪声在笔划变相=向处容易引入噪声,出现一个或两个方向码与前后方向码不相同,删除它们来克服这种噪声。

(4)带笔噪声这基本上是人为的噪声,通过下面将介绍的笔划合并方法来消除这种噪声。

参照以上对笔划的噪声处理,在该程序中,数字是通过模拟手写板输入的,为了后面特征提取的方便,以及减少数据量,先做了一下下面的去除直角处理。

如上图所示,斜着的直线是笔迹经过的点,本来图中的三个黑点都应该在这条笔迹经过的路径上,但考虑到为了不使方向变来变去,对于该图这种处在拐角上的点我们都给剔除掉,剔除的条件的数学描述是:|x[I+2]-x[I]|=1且 |y[I+2]-y[I]|=1如果满足以上条件,则剔除点(x[I+1],y[I+1])。

//在输入过程中动态的去除直角点的代码实现如下:if((i!=oldpoint.x)||(j!=oldpoint.y)){int k,n;if(mytime<2){k=0;n=0; }else{k=(i-mypoint[mytime-2].x)*(i-mypoint[mytime-2].x);n=(j-mypoint[mytime-2].y)*(j-mypoint[mytime-2].y); }if((k==1)&&(n==1)){mypoint[mytime-1].x=i;mypoint[mytime-1].y=j;oldpoint=mypoint[mytime-1]; }//disable=1;else{mypoint[mytime].x=i;mypoint[mytime].y=j;oldpoint=mypoint[mytime];mytime++; }3)笔划方向码合并处理及笔划识别通过上述方法,根据原始坐标数据,获得了所需的笔划方向码,在确定7种笔划代码之前,还得再对笔划方向码进行合并处理。

由于不同的书写习惯,往往书写笔划时有些变异。

因此,对这些笔划方向码应作出合并处理。

处理原则是:首先对同一笔划中的方向码进行合并处理,得到两组数。

第一组数,代表输入笔划的方向码序列Mi(i=1,2,...,n),1≤Mi≤8,相邻方向Mi与Mi-1经合并后,不可能是同方向的码值,第二组数代表方向码序列Mi所对应的某方向上的方向码数Ni(i=1,2,...,n)。

然后再对方向码序列Mi进行合并处理,当|Mi+1-Mi|=1或|Mi+1-Mi|=7成立时,表示Mi与Mi-1是相邻的两个方向。

由于采用了上面所定义的七种笔划,可以对相邻两个方向合并为一方向,当两个方向的方向数之比Ni+1/Ni≤K时,Mi与Mi-1合并为Mi ;当Ni+1/Ni >K时,Mi与Mi-1合并为Mi-1 ;n'=n-1,其中方向数为:Nf'=(Nf+Ni+1)/2。

得到两组新数Mi',Ni',(i=1,2,...,n)。

式中K是合并阈值,可根据实际书写情况进行调整,一般K=1。

根据上述原则,可再对方向码序列Mi进行合并处理。

有了正确的笔划方向码序列Mi ,我们就能对笔划进行正确的分类,实线笔划识别,其识别过程如下:第一,判断方向码序列Mi的方向码数n是否为一,即是否是单方向的基本笔划,由右表可查出对应的笔画码。

第二,如果n>1,即是变方向的复合笔划,根据下式可以确定出顺笔画、逆笔划、混合比划。

如果-4≤Mi - Mi+1≤-1或4≤Mi - Mi+1≤7对于所有i=1,2,...,n成立,那么输入笔划顺笔划。

如果1≤Mi - Mi+1≤4或-7≤Mi - Mi+1≤-4对于所有i=1,2,...,n成立,那么输入笔划逆笔划。

其他情况,输入笔划是混合比划。

参照以上笔划方向码合并处理及笔划识别原理,在本次程序设计中,为了量化特征,我们规定了如下四个方向:向右、向下、向左、向上,各方向包含的范围如下图所示:之所以每个方向都包含3个范围,是为了避免一些小的方向扰动或抖动改变方向。

从上面四个图中,我们可以看到,在斜线上的4个方向,每个都包含在两个方向上,对于方向的确定,我们有如下的规则:(1)对于每一个起点,选择方向的优先顺序是:向右、向下、向左、向上。

这里我们这样规定的原因是:考虑手写数字的特点和人的书写习惯。

(2)如果已经处在一个方向上,那么对于接着的一个方向,应尽量保持和原来的方向一致,这样方向在一个小的范围内波动,可以尽最大可能保持方向的一致性,除非已经超出了这个方向的范围。

除做以上的规定外,我们还考虑了相邻点间的方向,分析出了如下表格的方第I个点的方向第I+1个点的方向符号表示根据表格中信息,设计了如下实现程序代码:if(mypoint[j+1].x>mypoint[j].x)mytezheng->VHDerection[i]=1;else if(mypoint[j+1].y>mypoint[j].y)mytezheng->VHDerection[i]=2;else if(mypoint[j+1].x<mypoint[j].x)mytezheng->VHDerection[i]=3;elsemytezheng->VHDerection[i]=4;mytezheng->lenth=1;//尽量保持目前的方向else{if(j==0){if(mypoint[1].x>mypoint[0].x)mytezheng->VHDerection[0]=1;else if(mypoint[1].y>mypoint[0].y)mytezheng->VHDerection[0]=2;else if(mypoint[1].x<mypoint[0].x)mytezheng->VHDerection[0]=3;elsemytezheng->VHDerection[0]=4;mytezheng->lenth=1;}//end ifelse{switch(mytezheng->VHDerection[i]){case 1:if(mypoint[j+1].x<=mypoint[j].x){i++;mytezheng->lenth=1;if(mypoint[j+1].y>mypoint[j].y)mytezheng->VHDerection[i]=2;else if(mypoint[j+1].y<mypoint[j].y)mytezheng->VHDerection[i]=4;elsemytezheng->VHDerection[i]=3;}elsemytezheng->lenth++;break;case 2:if(mypoint[j+1].y<=mypoint[j].y){i++;mytezheng->lenth=1;if(mypoint[j+1].x<mypoint[j].x)mytezheng->VHDerection[i]=3;else if(mypoint[j+1].x>mypoint[j].x)mytezheng->VHDerection[i]=1;elsemytezheng->VHDerection[i]=4;}elsemytezheng->lenth++;break;case 3:if(mypoint[j+1].x>=mypoint[j].x){i++;mytezheng->lenth=1;if(mypoint[j+1].y<mypoint[j].y)mytezheng->VHDerection[i]=4;else if(mypoint[j+1].y>mypoint[j].y)mytezheng->VHDerection[i]=2;elsemytezheng->VHDerection[i]=1;}elsemytezheng->lenth++;break;case 4:if(mypoint[j+1].y>=mypoint[j].y){i++;mytezheng->lenth=1;if(mypoint[j+1].x>mypoint[j].x)mytezheng->VHDerection[i]=1;else if(mypoint[j+1].x<mypoint[j].x)mytezheng->VHDerection[i]=3;elsemytezheng->VHDerection[i]=2;}elsemytezheng->lenth++;break;default:break;}//end switch}//end else}//end else}//end for4)特征抽取方向的特征抽取如3中笔划的方向处理,在得到方向序列后,我们还要计算几个特征,即节点的分支数、尾点距交点的距离、首点距交点的距离、首点和尾点的距离。

相关主题