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

数字识别实验报告数字识别实验报告引言:数字识别是计算机视觉领域的一个重要研究方向,它涉及到图像处理、模式识别等多个学科。
本实验旨在通过构建一个数字识别模型,探索不同算法在数字识别中的效果,并比较它们的准确性和稳定性。
一、实验设计1. 数据集选择本实验选用了MNIST数据集,该数据集包含了大量手写数字的图像样本,是数字识别领域中最经典的数据集之一。
2. 算法选择本实验采用了三种常见的数字识别算法:K近邻算法、支持向量机算法和深度学习算法(卷积神经网络)。
3. 实验步骤(1)数据预处理:对原始图像进行灰度化、二值化等处理,以便将图像转化为算法所需的输入格式。
(2)特征提取:提取图像中的特征,如边缘、纹理等,以便算法能够更好地区分不同的数字。
(3)模型训练:使用训练集对选定的算法进行训练,并调整算法的参数以提高模型的准确性。
(4)模型测试:使用测试集对训练好的模型进行测试,并记录准确率和识别速度等指标。
(5)结果分析:比较不同算法在数字识别中的表现,并分析其优缺点。
二、实验结果1. K近邻算法经过实验,我们发现K近邻算法在数字识别中表现出较高的准确性,但由于其计算复杂度较高,在大规模数据集上的运行速度较慢。
2. 支持向量机算法支持向量机算法在数字识别中也取得了不错的效果,尤其在处理非线性可分问题时表现出色。
然而,该算法对于大规模数据集的训练时间较长。
3. 深度学习算法(卷积神经网络)深度学习算法在数字识别中展现出了强大的潜力,通过构建多层卷积神经网络,我们得到了较高的准确率和较快的识别速度。
然而,该算法对于数据集的规模和质量要求较高,需要更多的计算资源和训练时间。
三、结果分析综合比较三种算法的实验结果,我们可以得出以下结论:1. K近邻算法在准确性方面表现出色,但在处理大规模数据时速度较慢。
2. 支持向量机算法在处理非线性问题时具有优势,但对于大规模数据集的训练时间较长。
3. 深度学习算法在准确率和识别速度方面都有较好的表现,但对数据集的规模和质量要求较高。
手写数字识别调研报告

手写数字识别调研报告手写数字识别是一种将手写数字转换为可识别数字的技术,它在现实生活中有着广泛的应用。
本调研报告旨在对手写数字识别的相关技术进行调查研究,并对其应用领域和未来发展进行探讨。
首先,我们对手写数字识别的技术进行了研究。
目前常用的手写数字识别技术包括基于传统机器学习算法的方法和基于深度学习算法的方法。
传统机器学习算法通常使用特征提取和分类器的组合,如支持向量机(SVM)和k最近邻(k-NN)算法。
深度学习算法则通过构建多层神经网络,通过大量数据的训练来实现高准确率的分类。
当前,深度学习算法在手写数字识别方面取得了很大进展。
其次,我们调查了手写数字识别的应用领域。
手写数字识别可以应用于各种场景,如无人驾驶、金融支付、邮件分类等。
在无人驾驶方面,手写数字识别可以帮助车辆识别交通标志和路标,并做出相应的行动。
在金融支付方面,手写数字识别可以应用于支票的自动识别和存储,提高支付效率和精确度。
在邮件分类方面,手写数字识别可以帮助自动邮件分拣系统进行分类,提高邮件处理的效率。
最后,我们对手写数字识别的未来发展进行了讨论。
随着深度学习技术的不断进步,手写数字识别的准确率将不断提高。
此外,随着各种硬件设备的发展,如智能手机、平板电脑等,手写数字识别技术将更加广泛地应用于日常生活中。
另外,结合其他技术如图像处理和自然语言处理,手写数字识别的应用领域将进一步扩展。
综上所述,手写数字识别是一种在现实生活中有广泛应用的技术。
随着技术的不断进步,手写数字识别的准确率将不断提高,并在更多领域得到应用。
未来,我们可以期待手写数字识别技术在各个行业中发挥更大的作用。
基于 lenet 手写数字体识别实验总结

基于LeNet的手写数字识别实验是计算机视觉领域中一个经典的实例,通过对MNIST数据集进行处理和分析,使用LeNet-5神经网络模型实现对手写数字(0-9)的识别。
以下是对该实验的总结:1. 数据集介绍MNIST数据集是计算机视觉领域的经典入门数据集,包含了60,000个训练样本和10,000个测试样本。
这些数字已经过尺寸标准化并位于图像中心,图像是固定大小(28x28像素)。
数据集分为训练集、验证集和测试集,方便进行模型训练和性能评估。
2. LeNet-5模型LeNet-5是一种卷积神经网络模型,由Yann LeCun于1998年提出。
尽管其提出时间较早,但在手写数字识别任务上取得了显著的成功。
实验中,我们采用LeNet-5模型对MNIST数据集进行处理。
3. 模型结构LeNet-5模型包括两个卷积层和三个全连接层。
卷积层分别包含6个和16个卷积核,卷积核大小为5x5。
每个卷积层之后跟着一个最大池化层,池化核大小为2x2。
全连接层分别具有64、120和84个神经元。
最后,模型输出10个神经元,对应10个数字类别。
4. 实验流程实验中,首先对数据集进行预处理,将图像缩放到28x28像素。
然后,将数据集划分为训练集、验证集和测试集。
接着,构建LeNet-5模型并使用训练集进行训练。
在训练过程中,采用交叉熵损失函数和随机梯度下降(SGD)优化器。
最后,使用验证集评估模型性能,并选取最优模型在测试集上进行测试。
5. 实验结果经过训练,LeNet-5模型在MNIST数据集上取得了较好的识别效果。
在测试集上,模型对数字的识别准确率达到了98.89%。
实验结果表明,尽管LeNet-5模型相对简单,但在手写数字识别任务上具有较高的准确率。
6. 实验总结基于LeNet的手写数字识别实验展示了卷积神经网络在计算机视觉领域的应用。
通过搭建LeNet-5模型并对MNIST数据集进行处理,实验证明了卷积神经网络在识别手写数字方面的有效性。
基于HMM的联机手写汉字识别的开题报告

基于HMM的联机手写汉字识别的开题报告一、研究背景及意义随着信息时代的发展,人们对手写汉字识别技术的需求越来越大。
联机手写汉字识别就是指将一笔一划的输入过程与识别过程同时进行,实时地将手写笔迹转化成汉字,这种识别方式比离线手写汉字识别更加实用。
联机手写汉字识别的应用场景非常广泛,涉及到自然语言处理、信息检索、语音合成、OCR等多个领域,尤其在移动设备上的输入交互中得到广泛应用。
因此,研究联机手写汉字识别有极高的实际应用和研究价值。
二、研究内容本研究的主要内容是基于HMM(隐马尔科夫模型)的联机手写汉字识别。
HMM是一种基于概率的统计模型,在语音识别、图像识别、自然语言处理等领域得到广泛应用。
HMM模型是一种基于时间序列的模型,将输入序列转化成一个隐藏序列和一个观测序列,其中,隐藏序列是模型中不可见的状态序列,观测序列是模型中可见的观测值序列。
在联机手写汉字识别中,输入的手写笔迹就是观测序列,而笔迹所代表的汉字就是隐藏序列,使用HMM来建模可以充分利用笔迹的时间序列特征。
具体实现上,本研究将研究和探讨:1. 建立HMM模型:通过对手写汉字进行分析和研究,确定HMM的状态数和观测序列,构建初始HMM模型。
2. 模型训练:通过学习手写汉字的样本,对HMM模型进行训练,得到训练好的HMM模型,使其能够准确地识别手写汉字。
3. 模型评估:考虑使用交叉验证等方法,对训练好的HMM模型进行评估,包括准确率、召回率、F1值等指标。
4. 应用实现:将训练好的HMM模型应用于实际的联机手写汉字识别场景中。
例如,可以将其集成到智能手机的输入法中,实现快速精准的手写汉字输入。
三、研究方法及技术路线本研究的技术路线如下:1. 数据预处理:对手写汉字数据进行预处理,包括数据采集、数据清洗、数据预处理等。
2. 特征提取:对手写汉字进行特征提取,挖掘其时间序列特征,提取出代表汉字的主要特征。
3. HMM模型建立:根据手写汉字特征,建立HMM模型。
《基于深度学习的联机蒙古文手写识别系统研究》范文

《基于深度学习的联机蒙古文手写识别系统研究》篇一一、引言随着信息技术的快速发展,手写识别技术已经成为一项重要的研究领域。
作为多元文化的一部分,蒙古文手写识别技术的发展显得尤为重要。
联机手写识别技术能够实时地将手写输入转化为计算机可识别的文字信息,具有广泛的应用前景。
本文旨在研究基于深度学习的联机蒙古文手写识别系统,以提高蒙古文手写识别的准确性和效率。
二、蒙古文手写识别的现状与挑战蒙古文作为一种独特的文字系统,其手写识别具有一定的难度。
目前,蒙古文手写识别主要面临以下挑战:一是蒙古文字符的形态多样,结构复杂,导致识别难度大;二是手写输入的随意性大,同一字符的书写方式可能多种多样;三是受书写工具、纸张等因素的影响,手写输入的图像质量差异较大。
三、深度学习在蒙古文手写识别中的应用深度学习在图像识别领域取得了显著的成果,为蒙古文手写识别提供了新的思路。
基于深度学习的联机蒙古文手写识别系统,通过训练深度神经网络模型,能够自动提取手写图像中的特征,提高识别的准确性和鲁棒性。
此外,深度学习还能够处理复杂的时空数据,适应联机手写识别的实时性要求。
四、系统设计与实现本文设计了一种基于深度学习的联机蒙古文手写识别系统,包括数据预处理、特征提取、模型训练和识别等模块。
首先,对手写图像进行预处理,包括去噪、归一化等操作,以提高图像质量。
然后,利用深度神经网络模型提取手写图像中的特征。
在模型训练阶段,采用大量标注的蒙古文手写数据集进行训练,优化模型参数。
最后,通过实时获取手写轨迹数据,进行在线识别。
五、实验与分析为了验证基于深度学习的联机蒙古文手写识别系统的性能,我们进行了大量的实验。
实验结果表明,该系统能够有效地提取手写图像中的特征,提高识别的准确率和鲁棒性。
与传统的蒙古文手写识别方法相比,该系统具有更高的识别率和更低的误识率。
此外,该系统还能够适应不同的书写工具和纸张,具有较好的泛化能力。
六、结论与展望本文研究了基于深度学习的联机蒙古文手写识别系统,提高了蒙古文手写识别的准确性和效率。
手写识别模式识别实验论文

手写数字识别系统的设计与实现摘要手写体数字识别是文字识别中的一个研究课题,是多年来的研究热点,也是模式识别领域中最成功的应用之一。
主要功能是通过在点击手写数字识别菜单下的绘制数字标签弹出的绘制数字窗口中完成数字的手写,在此窗口中可以进行数字的保存及清屏,然后通过文件菜单中的打开标签打开所绘制的数字,从而进行数字的预处理,其中包括灰度化及二值化处理,然后进行特征提取,最后实现数字的识别。
利用Matlab程序设计的相关知识,运用模块设计等相关技术,最终完成手写体识别综合设计。
实验结果表明,本系统具有较高的识别率。
关键词:绘制数字;预处理;特征提取;特征库;数字识别1前言自上世纪六十年代以来,计算机视觉与图像处理越来越受到人们的关注,并逐渐成为一门重要的学科领域。
而作为它们的研究对象的数字图像,也因为它含有研究目标的丰富信息而成为越来越重要的研究对象。
图像识别的目标是用计算机自动完成某些信息的处理,用来替代人工去处理图像分类及识别的任务。
手写数字识别是图像识别学科下的一个分支,是图像处理和模式识别领域研究的课题之一,由于其具有很强的实用性一直是多年来的研究热点。
由于手写体数字的随意性很大,例如,笔画的粗细,字体的大小,倾斜等等都直接影响到字符的正确识别,所以手写体数字识别是一个很有挑战性的课题。
在过去的数十年中,研究者们提出了许多的识别方法,取得了较大的成果。
手写体数字识别实用性很强,在大规模数据统计(如例行年检,人口普查),财务,税务,邮件分拣等等应用领域中都有广阔的应用前景。
本课题拟研究手写体数字识别的理论和方法,开发一个小型的手写体数字识别系统。
在研究手写体数字识别理论和方法的基础上,开发这样一个小型的手写体数字识别系统需要完成以下主要方面的研究与设计工作:手写数字绘制的问题、数字的预处理问题、特征提取问题、特征库的建立问题、数字识别问2课题的背景2.1手写数字识别的发展模式识别是六十年代初迅速发展起来的一门学科。
手写体数字识别实验报告

软件学院12-13-2学期《人工智能》课程项目报告题目:使用SMO方法进行手写体数字识别目录软件学院12-13-2学期《人工智能》课程项目报告 (1)1 问题描述 (2)2 二值化处理 (2)2.1 思想: (2)2.2 OSTU算法: (2)2.3 OTSU算法伪代码: (2)3 降维处理 (2)4.半监督算法 (4)4.1半监督算法流程: (4)4.2半监督算法的主要算法: (4)1)self-Training models: (4)2)Propagating-1-nearest-neighbor: (4)3)CLUSTER-THEN-LABELMETHODS (4)4)Co_Training: (4)5)基于图的算法(Graph based Learning): (5)4.4半监督学习分类算法的现实价值: (5)5 我使用SVM的SMO算法 (5)5.1 SMO算法基本思想: (5)5.2 应用SMO算法的流程: (5)6 性能分析 (6)6.1.监督学习 (6)6.2.半监督学习(Tri-training) (6)6.3 我们用J48,SMO, NaiveBayes以及BayesNet四种算法对降维后的算法进行训练并求出其准确性,得到如下数据 (7)7 思考总结 (7)1 问题描述手写体数字识别问题,简而言之就是识别出10个阿拉伯数字,由于数字的清晰程度或者是个人的写字习惯抑或是其他,往往手写体数字的形状,大小,深浅,位置会不大一样。
现在我们拥有3006个带标记的数据以及56994的未带标记的数据,而我们的目标就是正确识别出这些手写体数字。
因此我们可以把这些带标记的数据看作经验值,运用一定算法来学习,预测出这些未带标记的数据。
对问题的分析如下:1 考虑到每个值都是0-255之间的一个整型值,对于算法的分析操作会影响性能,我将每个值进行了二值化,变成0,1。
2 考虑到这些数据都是28×28=784维的,维数太大,在后续的学习过程中效率会很低,我对它进行了降维处理。
实验一--手写数字识别

大数据应用实例1、下面我们来做个大数据人工智能实例:手写数字识别2、我们使用python语言进行代码的编写,使用pycharm开发工具对其实例进行编写,3、下面我们首先来看我们的样本数据:4、我们使用python语言来对其数据进行机器学习和识别代码如下:import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.neighbors import KNeighborsClassifier# 1、数据读取data = plt.imread('./data/0/0_1.bmp')# plt.imshow(data)# plt.show()# x_tain=[]# for i in range(1,501):# x_tain.append(plt.imread('./data/0/0_%d.bmp'%(i)))x_tain =[]x_test =[]y_tain=[]y_test=[]for i in range(0,10):for j in range(1,501):if j < 451: #将数据保存到训练数据中x_tain.append(plt.imread('./data/%d/%d_%d.bmp'%(i,i,j)).reshape(-1) ) #reshape 可以降维也就是矩阵变化y_tain.append(i) #append 是读进来的数据进行存储的意思else: #保存到预测数据中x_test.append(plt.imread('./data/%d/%d_%d.bmp'%(i,i,j)).reshape(-1)) y_test.append(i)# 2、数据转换成x_tain,y_tain= np.array(x_tain),np.array(y_tain)# print(x_tain.shape,len(y_tain),len(x_test))# 3、机器学习knn = KNeighborsClassifier() #构造分类器knn.fit(x_tain,y_tain)y_ = knn.predict(x_test) #进行预测的结果# print(len(y_[::10]),'\n',y_test[::10])gl=knn.score(x_test,y_test)print('准确率为:',gl)# 3、图片绘制plt.figure(figsize=(13,15))img = x_test[::10]img1 = y_test[::10]yimg = y_[::10]for i in range(50):plt.subplot(5,10,i+1)plt.imshow(img[i].reshape(28,28))plt.title('预测数据:%d'%(yimg[i])+'\n真实数据:%d'%(img1[i]))plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为SimHei显示中文plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号plt.show()'''import matplotlib.ticker as tickerfig=plt.figure()ax = fig.add_subplot(111)ax.yaxis.set_major_locator(ticker.NullLocator())'''5、结果展示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
联机手写数字识别设计一、设计论述模式识别是六十年代初迅速发展起来的一门学科。
由于它研究的是如何用机器来实现人(及某些动物)对事物的学习、识别和判断能力,因而受到了很多科技领域研究人员的注意,成为人工智能研究的一个重要方面。
字符识别是模式识别的一个传统研究领域。
从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中笔划的方向处理,在得到方向序列后,我们还要计算几个特征,即节点的分支数、尾点距交点的距离、首点距交点的距离、首点和尾点的距离。