版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
合肥学院毕业设计(论文)设计(论文)题目基于模板匹配算法的字符识别系 统研究与实现院系名称计算机科学与技术系专业(班级)计算机科学与技术 姓名(学号)指导教师系负责人摘要自从计算机问世以来,让机器具有模式识别能力一直是计算机科学家们的努力方向。研究表明,对视觉和听觉信息的处理过程,不仅仅是一个感知过程,也是一个认知过程。因此,研究模式识别,是理解人类智能的本质的重要途径。字符识别是一个传统和典型的模式识别问题,脱机手写数字识别是一个典型的大类别的模式识别问题。手写体数字具有不同字符字型相差不大、相同字符有多种不同写法、数字没有上下文关系等等特点,使得脱机手写体数字识别成为识别领域最大的难题和最终的目标。在这种大类别识别的研究中,传统上大多采用模板匹配的方法来解决问题。而在模板匹配算法中,得计算其特征值。图像需要经过二值化,细化等预处理。关键字模板匹配;特征值;细化;二值化ABSTRACTSincecomputerappeared,ithasbeenaneffortdirectionforscientisttoletcomputerhastheabilityofpatternrecognition.Researchingindicatesthattheprocdealwithseeingandhearingnotonlyaprocedureofperceptionbutalsocognition.Therefore,studyingpatternrecognitionisanimportantwayinunderstandingthemankintelligenceandability.Characterrecognitionisatraditionalandtypicalpatternproblem,andHandwrittenNumeralRecognitionisatypicallargevocabularypatternrecognitionproblem.Differentcharactersdonotvarymuch,thesamecharactercanbewritteninmanyways,thereisnocontextbetweencharacters,andsoon.Becauseofsmanycharacteristics,HandwrittenNumeralRecognitionisaverydifficultproblemandcommonlyregardedasoneoftheultimategoalsofcharacterrecognitionresearch.Andtemplatematchingalgorithm,initscalculationofeigenvalues.Imagerequiretwovalue,thinningandotherpretreatment.引言手写数字识别(HandwrittenNumeralRecognition)是光学字符识别技术(OpticalCharacterRecognition,简称OCR)的一个分支,它研究的对象是:如何利用电子计算机自动辨认人手写在纸上的阿拉伯数字。在整个OCR领域中,最为困难的就是脱机手写字符的识别。到目前为止,尽管人们在脱机手写英文、汉字识别的研究中已取得很多可喜成就,但距实用还有一定距离。而在手写数字识别这个方向上,经过多年研究,研究工作者已经开始把它向各种实际应用推广,为手写数据的高速自动输入提供了一种解决方案。手写数字识别作为模式识别领域的一个重要问题,也有着重要的理论价值:(1).阿拉伯数字是唯一的被世界各国通用的符号,对手写数字识别的研究基本上与文化背景无关,这样就为各国,各地区的研究工作者提供了一个施展才智的大舞台。在这一领域大家可以探讨,比较各种研究方法。(2).由于数字识别的类别数较小,有助于做深入分析及验证一些新的理论。这方面最明显的例子就是人工神经网络相当一部分的ANN模型和算法都以手写数字识别作为具体的实验平台,验证理论的有效性,评价各种方法的优缺点。(3).尽管人们对手写数字的识别已从事了很长时间的研究,并已取得了很多成果,但到目前为止机器的识别本领还无法与人的认知能力相比,这仍是一个有难度的开放问题。(4).手写数字的识别方法很容易推广到其它一些相关问题棗一个直接的应用是对英文这样的拼音文字的识别。事实上,很多学者就是把数字和英文字母的识别放在一块儿研究的。人类认知事物的过程中,视觉起到了举足轻重的作用。视觉是人类最高级的感知器官,它不仅指对光信号的感受,还包括了对视觉信息的获取、传输、处理、存储与理解的全过程。随着工业自动化的发展,机器视觉作为一种应用系统逐渐得到完善和发展。机器视觉就是用机器代替人眼来做测量和判断。其特点是能够提高生产的柔性和自动化程度,在一些不适合人工作业的危险工作环境或人工视觉难以满足要求的场合,常用机器视觉来替代人工视觉;同时在大批量工业生产过程中,用人工视觉检查产品质量效率低且精度不高,用机器视觉检测方法可以大大提高生产效率和生产的自动化程度。而且机器视觉易于实现信息集成,是实现计算机制造的基础技术。在机器视觉中,常常需要从图像背景中把感兴趣的物体检测出来,模板匹配是最常用也是最基本的方法。随着信号处理技术和计算机技术的不断发展,模板匹配在工业检测、卫星遥感、半导体封装、文字识别、导航制导、医学X射线图片处理、气象云图分析、光学和雷达的图像模板跟踪、工业流水线的自动监控、工业仪表的自动监控、资源分析、交通管理、图像数据库检索以及景物分析中的变化检测等领域应用越来越广泛。可见,匹配技术己经成为机器视觉和众多领域中不可或缺的组成部分,对图像匹配技术进行探索研究势在必行。在下面各章我将以一个字符识别系统为例,就字符识别概述、模板匹配算法及改进、图像预处理、系统的具体实现等方面进行描述。第一章绪论。第二章模板匹配算法及改进。第三章图像的预处理。第四章系统的设计与实现。第五章系统运行及测试。结束语部分对本次毕业设计做出总结。目录摘要………………….2ABSTRACT………….3引言…………………4第一章绪论1.1课题研究背景意义…………71.2字符识别概述………………71.3字符识别分类………………81.4研究对象及目标……………81.4.1研究的对象 …………81.4.2研究的目标…………8第二章模板匹配算法及改进2.1模板匹配算法描述…………..92.2模板匹配算法的数学描述…………………..102.3算法的改进及图示……………11第三章图像的预处理3.1图像的平滑去噪……………..143.2BMP图像的存储结构……….153.3颜色处理……………………..173.4图像的二值化………………..173.5图像的细化…………………..183.5.1细化算法的定义………183.5.2细化的要求……………195.3Hilditch 算法描述………19第四章系统的设计与实现4.1VisualC++6.0介绍…………...214.1.1环境安装及选择的原因………………211.2MFC概述………………21系统界面按扭的生成………21模板计算的实现……………23模板计算设计思想…………………...23代码实现………………23样本测试的实现……………….25样本测试设计思想….…………………..…..25代码实现……………………25第五章系统运行及测试5.1系统的运行…………………….285.2系统的测试…………………….285.3系统的评价…………………….30结束语…………………..30参考文献………………..30致谢语…………………..31附录部分代码清单…………………..31 第一章字符识别概述1.1课题研究背景意义在机器视觉中,常常需要从图像背景中把感兴趣的物体检测出来,模板匹配是最常用也是最基本的方法。随着信号处理技术和计算机技术的不断发展,模板匹配在工业检测、卫星遥感、半导体封装、文字识别、导航制导、医学X射线图片处理、气象云图分析、光学和雷达的图像模板跟踪、工业流水线的自动监控、工业仪表的自动监控、资源分析、交通管理、图像数据库检索以及景物分析中的变化检测等领域应用越来越广泛。可见,匹配技术己经成为机器视觉和众多领域中不可或缺的组成部分,对图像匹配技术进行探索研究势在必行。手写数字识别有着极为广泛的应用前景,这也是受到研究者重视的一个主要原因。比如说在大规模的数据统计(如行业年鉴、人口普查等)中,在财务、税务、金融领域中,在邮件分拣中均有着应用。1.2字符识别概述计算机硬件的迅速发展以及计算机应用领域的不断开拓,急切地需要计算机能够更有效的感知诸如声音、文字、图像等人类赖以发展自身、改造环境所运用的信息资料。但就一般意义来说,目前计算机却无法感知他们,键盘,鼠标等输入设备,对于五花八门的外部世界显得无能为力。虽然电视摄象机、图文扫描仪、话筒等设备已解决了上述非电信号的转换,并与计算机联机,但这并不能使计算机真正知道所接受的究竟是什么信息。计算机对外部世界感知能力的低下,成为开拓计算机应用的瓶颈,也与其高超的运算能力形成强烈的对比。因此,着眼与提高计算机感知外部信息能力的学科模式识别得到了迅速的发展。在模式识别领域中,手写字符的识别是一个非常活跃的研究方向。但这方面的研究工作已有很多,其中不少成果得到了广泛的应用。但是由于手写字符拓扑结构的多样性,目前已有的手写字符识别体统在对无限制手写字符进行分类时,始终存在这样或那样的缺陷。字符识别是模式识别领域中的一个非常活跃的分支。这一方面是由于问题本身的难度使之成为一个极具挑战性的课题。另一方面,是因为字符识别不是一项孤立的应用技术,其中包含了模式识别领域中其它分之都会遇到的一些最基本的和共性的问题。也正是由于字符识别技术的飞速发展,才促使识别领域和图像分析发展为一个成熟的科学领域。字符识别技术的研究主要集中在特征抽取和模式匹配两个方面,这一直是光学字符识别(OCR)技术的两大关键所在。由扫描仪转化后的字符二值图像中各点的值,可以看成是该字符的一组特征。但由于这组特征的数量较大,而每个特征所含的信息量很少,因此有必要通过映射或变换的方法将信息集中到少量的特征中。这个过程就叫特征抽取。选择稳定的,分类能力强的特征是字符识别系统的核心。在识别过程中,对待识别的字符进行特征抽取后,就要将这些特征与特征库中的特征进行比较,进行分类,这个过程称为特征匹配。特征匹配方法可分为完全匹配法和近似匹配法。完全匹配法就是将为未知的字符的特征向量X与特征库中的所有特征向量(Yj,j=1,2,…n)逐一进行比较,若X=Yi,则Yi所对应的字符就是识别结果。否则,就拒识。近似匹配法可进一步分为相关性匹配法,驰豫匹配法和树搜索法。1.3字符识别的分类字符识别按输入方式的不同可分为联机识别(也称为在线识别)和脱机识别(也称为离线识别)。联机识别是对所书写的字符进行实时识别,即写即识。所以联机识别技术往往结合字符的笔划顺序来进行识别。脱机识别方法中,首先对已经写在纸上的字符通过扫描仪转化为二值图像,然后再对字符的二值图像进行识别。书写与识别可以分开进行。因此,脱机识别技术中不涉及字符的书写顺序。字符识别技术根据别识别的字符的类型通常可分为印刷体识别和手写体识别两大类,而手写体识别又可分为限制手写体识别和无限制手写体识别(也称为自由手写体识别)。印刷体识别是将印刷刊物上的字符扫描转化为二值图象并进行识别,是将已有刊物上的数据大量输入计算机的最有效的方法。1.4研究的对象及目标1.4.1研究的对象我们的研究对象是无限制手写数字和英文大写字母,这方面目前已经有大量的研究成果。但是,由于手写字符,特别是英文大写字母,拓扑结构变化的多样性,使得目前已有的一些字符识别系统在应用于无限制手写字符的分类时,始终存在这样或那样的缺陷。正因为如此,手写字符识别对于广大研究者来说,是一个充满魅力的领域。1.4.2研究的目标本文所要做的工作是:(1)建立一个无限制手写数字脱机识别系统,要求该系统具有至少90%以上的识别率,并且具备一定的稳定性。(2)建立一个无限制手写大写英文字母脱机识别系统,要求该系统作为手写字符识别系统中的脱机识别部分,要求该系统具有至少85%以上的识别率,并且具备一定的稳定性。 第二章模板匹配算法及改进2.1模板匹配算法的描述在机器识别事物的过程中,常需把不同传感器或同一传感器在不同时间、不同成像条件下对同一景物获取的两幅或多幅图像在空间上对准,或根据己知模式到另一幅图中寻找相应的模式,这就叫做匹配。若将已知模式的图像称为模板(如图2—1),在左侧的待匹配图像中找到对应于右侧模板图像的过程即为 待匹配图像模板图2—1待匹配图像和模板图像的示意图模板匹配。因为只有当同一场景的两幅图像在同一坐标系下时,才能进行相似性比较,所以模板匹配的过程实际上也就是把一幅图像变换到另一幅图像的坐标系过程。图像的模板匹配就是先给定一幅图像,然后到另一幅图像中去查找这幅图像,如果找到了,则匹配成功。这看起来好像很简单,因为我们一眼就能看出一幅图中是否包含另一幅图像,遗憾的是电脑并不具有人眼的强大的视觉的功能,因而需要电脑去判定一幅图片中是否包含另一幅图片是件不容易的事情。对于机器视觉系统而言,实现匹配首先要对图像进行预处理。先计算模板图片的特征值,并存储到计算机中。然后计算待测试样板图片的特征值,与计算机中模板进行比较,运用匹配算法实现匹配。整个过程如图2—2所示。模板图片预处理计算特征值存储搜索策略待测试图片预处理计算特征值匹配算法匹配结果显示结果图2—2图像匹配系统示意图从上述图像匹配系统结构图中可以看出实现匹配要考虑以下几方面内容:(1)图像的数据结构类型:即描述像素灰度值和像素光学特征值之间的信息。(2)图像的特征空间:由特征数据组成,这些特征数据可以是原始像素数据,也可以是经过处理后提取的图像特征数据。(3)存储:将图像处理的一些相关信息资料存储在计算机中,了解其在计算机中存储的结构。(4)匹配算法:是实现匹配的基本思想和方法,是解决匹配问题的关键所在。算法的实现涉及到相似性度量函数的正确选择,相似性度量函数是两幅图像相比较的相似性度量,直接影响着匹配的速度和精度。(5)搜索方法:即遍历图像时的查找策略,正确的选择搜索方法直接影响到匹配的速度。在基于图像处理的应用领域中,对于图像匹配的研究可以说一直都是数字图像处理技术和计算机视觉理解的重要研究内容。图像匹配在机器视觉、工业自动模式识别、医学图像的定位等方面都有着重要意义。2.2图像匹配的数学描述以传统的相关算法为例对图像匹配进行数学描述。如图2—3所示,搜索图即待匹配图像S为一方形区域,边长为N,模板图像T也是一个方形区域,边长为M。设模板T叠放在搜索图S上平移,模板覆盖下的那块搜索图(即图中的阴影部分)叫做子图Si,j,(i,j)为子图Si,j的左下角在搜索图S中的坐标为:1<i,j<N-M+1。)a(N—M+1M—1N—M+1M—1MMXX子图Sji,图2—3被搜索图(a)和模板(b)匹配过程如下所示:假设模板T从待匹配图像S的左下角开始逐点遍历图像,比较T和Si,j的内容。如果两者一致,则差值为零,可以用下面的测度来衡量T和Si,j的内容如果两者一致,则差值为零,可以用下面的测度来衡量T和Si,j的相似程度,如公式(1—1)所示。 D(i,j)=M M[Si,j(m,n)T(m,n)]2--公式(1—1)m1n1展开后有: D(i,j)=M M[Si,j(m,n)]22M MSi,j(m,n)T(m,n)M M[T(m,n)]2--公式(1—2) m1n1 m1n1 m1n1公式(1—2)右边第三项代表模板的总能量,与(i,j无关,) 是一个常数;第一项是子图能量,随(i,j而改变,) T和Si,j匹配时这一项的取值最大,可以用下面的互相关系作相似性测度:Si,j(m,n)T(m,n)D的第2项 R(i,j)= =mn --公式(1—3) D的第1项 [Si,j(m,n)]2m n或归一化为:Si,j(m,n)T(m,n) R(i,j)= m n --公式(1—4)([Si,j(m,n)]2)([T(m,n)]2) m n m n显然R(i,j)越大,模板T和子图Si,j就越相似,使得R(i,j)取得最大值的位置即为最佳匹配位置,(i,j也就是我们要搜索的匹配点。) 2.3算法的改进及图示根据以上对模板匹配的介绍,可以对字符图像进行识别。但是求相似性度量函数,求待匹配图像和模板之间的相似性映射关系均比较复杂。上一节知识的介绍中,也看到了其过程比较麻烦。本系统中识别的图像均为2036大小的。即模板图像和待测图像大小相同。即会从图像的左下角一直顺着搜索一直至全图结束。而且映射关系及相似性函数均比较复杂,不是数量级上的关系。此时识别效率就不明显。显得木讷不灵巧。并非像前面介绍的在待测图片中搜索,并返回得到匹配点。因此需要基于此模板匹配算法原理的基础上,对算法进行改进,才能更有效的去完成识别的功能及简化其识别的过程。提高识别速度。即将图片区域化。算法改进的思想:将图片(34)分为12块区域,具体区域的划分如图2—4所示。图2—4算法改进的图像示意图再加上5条交线。共记有17个特征值。模板训练时,将数字模板图片17个特征值的信息记下并存储在数组中。当进行样本训练的时候,用同样的算法计算图片中数字的17个特征值,并到计算机存储区中去匹配,直接利用象素灰度值的差异,找到特征值最接近的一个图片数字,便完成匹配识别的过程。得到匹配的结果。这样变简单多。算法改进后图像的17个特征值计算的程序代码,如附录中所示。先让计算机学习,先计算素材T中模板图片0~9总共10个数字的特征值,每一个特征值显示如下所示:数字0的特征值为:4.000000,9.000000,9.000000,4.000000,6.000000,0.000000,0.000000,6.000000,4.000000,9.000000,9.000000,4.000000,2.000000,2.000000,2.000000,2.000000,2.000000,数字1的特征值为:0.000000,1.000000,0.000000,0.000000,6.000000,9.000000,9.000000,5.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,2.000000,1.000000,1.000000,数字2的特征值为:2.000000,3.000000,0.000000,5.000000,6.000000,0.000000,8.000000,6.000000,4.000000,9.000000,1.000000,3.000000,4.000000,3.000000,2.000000,1.000000,1.000000,数字3的特征值为:3.000000,0.000000,0.000000,3.000000,7.000000,7.000000,0.000000,6.000000,2.000000,2.000000,9.000000,6.000000,2.000000,4.000000,1.000000,1.000000,2.000000,数字4的特征值为:0.000000,0.000000,8.000000,0.000000,0.000000,10.000000,1.000000,6.000000,5.000000,5.000000,9.000000,4.000000,3.000000,11.000000,1.000000,2.000000,6.000000,数字5的特征值为:5.000000,7.000000,0.000000,2.000000,6.000000,6.000000,0.000000,6.000000,2.000000,2.000000,9.000000,4.000000,3.000000,3.000000,1.000000,1.000000,1.000000,数字6的特征值为:3.000000,9.000000,9.000000,3.000000,6.000000,6.000000,0.000000,6.000000,3.000000,2.000000,9.000000,5.000000,3.000000,3.000000,1.000000,2.000000,2.000000,数字7的特征值为:3.000000,0.000000,0.000000,0.000000,6.000000,4.000000,9.000000,4.000000,5.000000,5.000000,0.000000,0.000000,1.000000,4.000000,1.000000,1.000000,1.000000,数字8的特征值为:3.000000,8.000000,8.000000,4.000000,6.000000,2.000000,5.000000,6.000000,3.000000,8.000000,9.000000,5.000000,4.000000,4.000000,2.000000,6.000000,2.000000,数字9的特征值为:6.000000,8.000000,0.000000,0.000000,6.000000,7.000000,4.000000,5.000000,3.000000,6.000000,5.000000,0.000000,2.000000,10.000000,2.000000,1.000000,1.000000,第三章图像的预处理一般说来,被观测的图像中含有这种各样的噪声和畸变,去掉这些噪声和畸变,并将图像变成某种标准形式进行加工,使得特征的提取和识别变的容易进行,这些处理称为字符识别预处理。预处理是识别字符前的重要的一步,预处理的好坏直接影响着识别方法的难易及识别结构的好坏。预处理工作做的好,使反映字符本质特征的部分得到保留甚至突出出来,识别就容易进行,识别率高且识别速度快。反之,就会使识别变的困难,甚至造成识别误识等不良后果。3.1图像的平滑去噪平滑处理:字符图像经过平滑处理,能够去掉孤立噪声干扰,平滑笔划边沿。可用平滑算法。设有33窗口如图3—1所示:图3—1平滑算法其中P为当前点,N0-N7为其8个邻接点,平滑准则为:(1)当P为白时,N0,N2,N4,N6中至少有三个元素为黑,则,将P改为黑,否则不变。(2)当P为黑时,如果:(a)N4,N3,N2中至少有1个为黑,同时N6,N7和N0中也至少有一个为黑;(b)N2,N1,N0中至少有一个为黑,同时N4,N5和N6中也至少有一个为黑,则P不变,否则改为白。噪声处理噪声处理是一个重要而复杂的工作,通过扫描得到的字符图像有时含有噪声,这些噪声可能是因为纸张质量,污点,扫描通道的碎物或其它干扰造成的。这些噪声的存在,增加了数字识别的难度,较容易导致误识,拒识。如能较好地滤除噪声,无疑会为正确识别带来方便。由于阿拉伯数字0~9和英文大写字母均为由连续笔划组成的字符,因此若检测到字符扫描图像中的笔划数超过1,则认为该字符图像中肯定存在噪声或者断笔,需加以去噪声或连断笔处理。将多余的噪声去掉,或将断笔连在主体笔划上。而噪声和断笔的区分则可通过设定阈值来实现。具体的方法如下:设F(i,j),0im,0jn,,为二值图象,令A为二值图象平面上的一个NN的窗口区域,令A为包含A的(N+2)(N+2)的窗口区域,若 F(i,j) =F(i,j)0 (i,j)A (i,j)A则我们认为窗口区域A中的笔划为噪声或断笔。通过让窗口A在图像平面上浮动,可检测到的笔划判断为噪声;另N=5,并将检测到的笔划判断为断笔。对于检测到的噪声,只需要对应的窗口区域A中所有的黑点变为白点,即可将噪声去除。3.2BMP图像的存储结构设备无关位图(Device-IndependentBitmap)DIB是标准的Windows位图格式,DIB自带颜色信息,因此调色板管理非常容易。任何运行Windows的计算机都可以处理DIB,它通常以BMP文件的形式被保存在磁盘中。BMP文件中包含了一个DIB,一个BPM文件大体上分成如下4个部分。如表3—1所示:文件信息头BITMAPFILEHEARDER位图信息头结构BITMAPINFOHEADER调色板Palette位图象素数据DIBPixels表3—1WindowsDIB的组成位图文件头:主要用于识别位图文件,下面是位图文件头结构定义:TypedefstructtagBITMAPFILEHEADER{UNITbfType;DWORDbfSize;UNITbfReserved1;UNITbfReserved2;DWORDbfOffbits;}BITMAPFILEHEADER;其中,bfType表示文件类型,必须是0X424D,即值应该是“BM”,标志该文件是BMP位图文件。bfSize的值是位图文件的大小。bfReserved1和bfReserved2为保留字,不用考虑。bfOffbits为从文件头到实际的位图的数据的偏移字节数。位图信息头:包含了单个象素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位图平面书、图像的压缩格式。以下是位图信息头结构的定义:TypedefstructtagBITMAPINFOHEADER{DWORSbiSize;LONGbiWidth;LONGbiHeight;WORDbiplanes;WORDbiBicCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER;表3—2是对上述结构体中各个成员的说明。 结构成员 说明bitSize 结构BITMAPINFOHEADER 的字节数,(40字节)biWidth 以象素为单位的图像宽度biHeight 以象素为单位的图像的高度biplanes 目标设备的位平面数,必须是1,不用考虑biBitCount 每个象素的位数biCompression 图像压缩格式biSizeImage 以字节为单位的图像数据的大小biXPelsPermeter 表示目标设备的水平分辨率biYpelsPerMeter 表示目标设备的垂直分辨率biClrused 调色板中实际使用的颜色数biClrImportant 实现位图时必须的颜色数表3—2其中,biBitCount分别有如下的意义:0:用在JPEG格式中。1:单色图,调色板中含有两种颜色,通常说的黑白二色图。4:16色图。8:256色图,通常说的灰度图。16:64K图,一般没有调色板,图像数据中每两个字节表示一个象素。24:16M真彩色图,没有调色板,图像数据中每3个字节表示一个象素。32:4G真彩色,一般没有调色板,每4个字表表示一个象素,相对24位真彩色图而言,加入了一个透明度,即RGBA模式。biClrused:这个值通常为0,表示使用biBitCount确定的全部颜色。biClrImportant:这个值通常为0,表示所有颜色都是必须的。调色板(Palette:有些位图需要调色板,有些位图,如真彩色图,不需要调色板,)它们的BITMAPINFOHEADER 后面直接是位图数据。调色板实际上是一个数组,调色板是由颜色表项组成的,调色板结构如下:TypedefstructtagRGBQUAD{BYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;}RGBQUAD; 需要注意的是,RGBQUARD 结构中的颜色顺序是BGR。位图数据:在位图头文件、位图信息头、调色板之后,便是位图的主体部分:位图数据。根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个象素,对于16位位图,每两个字节代表了一个象素,对于24位位图,每三个字节代表了1个象素,对于32位位图,每4个字节代表了一个象素。3.3图像的颜色处理在真彩色系统中,图像的颜色与真实世界中的颜色非常自然逼近,人眼难以区分他们的差别,通常使用RGB表示法来表现真彩色图像,每一个象素的值用24位表示,红、绿、蓝三原色的浓度分别用一个字节来表示。但对于仅能同时显示16色或者256色的系统,每一个象素仅能分别采用4位或者8位表示,象素值与真彩色的颜色值不能一一对应,这时就必须采用调色板技术。所谓调色板就是在16色或者256色的显示系统中,由图像出现的最频繁的16中颜色或者256种颜色所组成的频色表,颜色表中的值是某种颜色在颜色查找表中的索引值。当需要对颜色位数进行转换时,可用八叉树颜色量化算法进行转换。这种方法首先扫描所有的象素,每遇到一种新的颜色就把它放到八叉树中,并创建一个叶子节点,图像扫描结束后,如果叶节点的数量大于调色板所需的颜色数,就将某些叶节点合并到其上一层节点中(父节点)去,并将父节点变为叶节点,这样进行下去直到叶节点的数量等于或者小于调色板所需的颜色数,之后遍历八叉树,将叶节点的颜色填入调色板的颜色表中。3.4图像的二值化实际上在使用的图像处理系统中,处理的对象主要是二值图像。这是因为在使用的系统中,要求处理的速度高、成本低,所以信息量大的灰阶图像的处理占用太大的部分不是好办法。因此希望尽可能用二值图像的形式进行处理。图像信息和背景信息分别对应图像灰度直方图,因此可以通过灰度直方图选择一个阈值把整个图像分成图像信息和背景信息两部分,从而把灰度图像转化为黑白二值图像。图像的灰度直方图是将图像中的象素按其灰度值大小进行组合,所构成的象素数量随灰度级变化的函数的图形形式。通常,灰度直方图的横轴表示灰度值,纵轴用来表示频度。频度,是指具有某一灰度值的象素在图像中出现的次数或者在图像中占总象素的百分比。如图3—2所示。图3—2具有二值倾向的灰度直方图图像二值化可根据下面的阈值处理来进行:一般采用设定某一阈值,用阈值将图像的数据分成大于阈值和小于阈值的象素群。例如,输入的函数是f(x,y),输出的图像是f\(x,y。)如果用灰度变换的方法来研究f(x,y),其灰度变换函数为:1,当f(x,y)时 f\(x,y)= 其中:为阈值。0,当f(x,y)时输出的图像的灰度值大于阈值,其数据点值取1;反之取0。这种灰度变换的方法,成为图像的二值化。二值化处理就是把图像f(x,y)分为对象物和背景两个领域,然后求其阈值。在数字化的图像数据中,无用的背景数据和对象物的数据常常混在一起。除次之外,在图像中还含有其它的各种噪声。所以阈值选取必须根据实际情况进行调节。这里的关键问题是阈值的确定方法。因为灰度图像二值化后可能丢失掉原图像中的一些信息,如果阈值选择不当,二值化后的图像有可能与原图像相差很大,不能正确的反映原图像,这样,二值化就失去了意义/因为图像二值化的目的是要在尽可能多的保留原图像特征的前提下舍弃冗余信息。所以阈值的正确选择很重要。系统中二值化的代码实现如下:voidCDigitClass::BinaryDigit(BYTEthre){digitWidth=digitdib.GetWidth();digitHeight=digitdib.GetHeight();LONGx,y;for(x=0;x<digitWidth;x++){for(y=0;y<digitHeight;y++){if(digitarray[x][y]>=thre)digitarray[x][y]=(BYTE)1;elsedigitarray[x][y]=(BYTE)0;}}}3.5图像的细化3.5.1细化的定义经过预处理,待细化的图像是0,1二值图象。象素值为1的是需要细化的部分,象素值为0的是背景区域。一个图像的“骨架”是指图像的中央的骨骼部分,可以理解为图像的中轴。例如一个长方形的骨架是它的长方向上的中轴线;正方形的骨架是他的中心点;圆的骨架是他的圆心;直线的骨架是它自身;孤立点的骨架也是它自身。骨架是描述图像几何及拓扑性质的重要特征之一。求图像骨架的过程通常称为对图像“细化”的过程。3.5.2细化的要求在字符识别系统中,为减少数据量,准确提取特征,常常需要采用细化算法。不过字符经过细化后,将不可避免地丢失部分信息。因此是否细化应根据实际情况而定。但一旦决定对字符进行细化,则对细化结果的好坏,将直接影响着识别率。一般来说,细化有以下的基本的要求:(1)细化要保持原有字符的连续性,不能使本来相连的笔划断开。(2)要细化成1象素的骨架,骨架应接近原笔划的中心线。(3)不要产生严重的畸变,对噪声不敏感。(4)保留字符原有的拓扑,几何特征,特别是一些明显的拐角不应被光滑掉。3.5.3Hilditch算法描述Hilditch细化算法描述Hilditch提出了一种串行细化算法,由于该算法是Hilditch提出的,就叫做Hilditch算法。Hilditch详细讲述了该算法的思想,但没有给出这种算法地一个简洁的表达式。Hilditch细化算法是一种串行算法。这种方法需要对整幅图像作多次扫描,在每一次扫描过程中。一些满足给定条件的象素点将被标记,在本次扫描结束后,再将这些标记的象素点删除,然后开始下一次扫描,直到在某一次扫描过程中,再没有象素点被标记,整个细化过程结束。通常在二值图象中,象素点的值为1或者0,值为1的点,称为黑点,也是前景点,即图形象素;值为0的点,称为白点,也是背景点。在细化算法中,每一次扫描过程中,一个黑点,即图形象素点必须满足下面的条件才能被删除:(1)该点是一个边界点。(2)该点不是一个端点。(3)该点不是一个断点。(4)该点的删除不应该造成过度侵蚀。图像未经细化时模板训练的效果如图3—3所示图片3—3细化前的效果如图3—4所示,当前象素点P(值为1)的8领域,以及P为边界点、端点、断点时的一种表现形式。1)P的8领域2)P为边界点3)P为端点4)P为断点图3—4P的几种形式为了方便讨论,令B(P)为当前象素点P的8领域中的黑象素点,S4(P)为P的4领域之和,S8(P)为P的8领域之和。次算法在对二值图像的每一次扫描处理过程中,扫描顺序是从左到右,从上到下,一个黑象素点同时满足下列七个条件将被删除:(1)P=1。这个条件保证当前处理象素点P为黑点,即为图形信息点。(2)S4(P)<=3。这个条件保证P不是边界点。(3)S8(P)>=2。这个条件保证P不是端点。N(P)>=1。N(P)是P的8领域中没有被标记的黑象素的个数,这个条件是为了保证细线的两端不被删除。N(P)>=1。N(P)的定义为:X(P)为对bi的求和。(i=1,2,3,4),bi取值:当P(2i—1)值为0并且P(2i)的值为1或者P(2i+1)的值取为1,其他情况bi的值为0。Hilditch定义X(P)为交叉数,交叉数X(P)的取值总是0-4之间,可以从理论上证明可以删除的象素与交叉数为1的情况是一致的。(6)X4(P)=1或者P4没有被标志。X4(P)的定义为:假设P4为0时,求出交叉数X4(P)。(7)X8(P)=1或者P6没有被标志。同上一条。这两个条件都是为了防止过度腐蚀。在每一次扫描结束后,被标记的象素点被删除。在最后一次扫描过程中,若没有象素点被标记,整个细化算法结束。图片细化之后,模板训练的效果如图3—5所示图3—5细化后的效果第四章系统的设计与实现4.1VisualC++6.0简介是一种程序设计语言,也是一个集成开发软件,它提供自动生成软件代码和可视化资源编辑的功能。与Win32紧密相连。可灵活的开发底层软件到上层直接面向用户的软件。4.1.1运行环境安装:(a)安装MICROSOFT公司的VisualC++6.0开发工具。(b)安装VisualAssistV6编程助手。(c)安装MSDNLibrary。选择VisualC++6.0的原因:(1)它是C和C++的混合编译器,使得VisualC++6.0开发的程序具备了C和C++的高效、简洁的特点。(2)它是一种面向对象的语言,使得软件能够在编码级、类级、控件级等多个级别上的重用,软件的开发效率大为提高。(3)借助于Microsoft基本类库(MicrosoftFoundationClassLibrary,简称MFC)和应用程序框架,能够轻松的开发出Windows标准界面的应用程序。可使用AppWizard生成完整的基于MFC类库的源文件和资源文件;可使用MFCActiveXControlWizard生成创建ActiveX空间所需的开始文件;还可使用ClassWizard来创建新类(Class),定义消息处理函数(MessageHander,)覆盖虚拟函数(VirtualFunction),从对话框(DialogBox的)空间中获取数据并验证数据的合法性等。其界面更友好,便于操作。4.1.2MFC概述微软基础类库(MFC,MicrosoftFoundationClass)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人的肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。MFC类库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到用户自己开发的应用程序中去。4.2系统界面按扭的生成可以使用上图的控件调色板,直接把控件从调色板上拖到新的对话框中,然后放到合适的位置。并且加以命名。各个按扭的具体情况如表4—1所示。IDIDPropertiesCaptionIDC_PIC_TESTPicturePropertieIDC_EDIT_RESULTEditPropertiesIDC_BUTTON_INPUT_EQUIPPushButtonProperties 模板计算IDC_BUTTON_INPUT_TESTPushButtonProperties 样本测试表4—1按扭的详细定义选中对话框,点击右键点击类向导(ClassWizard),根据上述介绍的原理,打开类向导。或者选择“VIEW”菜单中的“ClassWizard”菜单项,弹出“MFCClassWizard”对话框。选择“MessageMaps”选项卡。在“Classname”列表框中选择类CDigitRecogDlg,在“ObjectIDs”列表框中选择“IDC_BUTTON_INPUT_EQUIP”,在对应的“Messages”列表中选择“BN_CLICKED”。然后单击“AddFunction”按扭,添加对鼠标点击左键的响应,点确认键。在“Memberfunctions”栏中,将会增加一个OnButtonInputEquip函数。如图4—1所示:图4—1使用类向导自动生成代码双击“OnButtonInputEquip”函数或者在选种函数的情况下点击“EditCode”按扭,在出现下面的函数代码,如图4—2所示。voidCDigitRecogDlg::OnButtonInputEquip()voidCDigitRecogDlg::OnButtonInputEquip(){//TODO:Addyourcontrolnotificationhandlercodehere}图4—2类向导自动生成的部分代码4.3模板计算的过程4.3.1模板计算设计思想函数调用关系如图4—3所示CDigitRecogDlg::OnButtonInputEquip()CDigitRecogDlg::OnButtonInputEquip()调用arTrainSetFilePath.RemoveAll()j=0strFile=FileDlg.GetNextPathName(pos)digitTrain.digitdib.Load(strFile)digitTrain.CopyBitmapToAr()digitTrain.BinaryDigit(120)digitTrain.ThinDigit()digitTrain.GetFeature()j++strInfo.Format("模板计算图片:\r\n")J>9计算完图片图4—3模板计算函数调用关系图4.3.2代码实现voidCDigitRecogDlg::OnButtonInputEquip()//模板计算按扭被按时的处理函数{//TODO:AddyourcontrolnotificationhandlercodehereCStringFilePathName;//产生添加文件对话框对象AddSampleDlgFileDlg(TRUE,"",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, "BMP格式字符图像(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd());if(FileDlg.DoModal()!=IDOK)return;CStringstrFile;CStringstrInfo;arTrainSetFilePath.RemoveAll();//清除路径记录,重新记录新的路径POSITIONpos=FileDlg.GetStartPosition();//指向所加载的文件位置pEditResult->SetSel(0,-1);//选中控件变量中的所有内容pEditResult->ReplaceSel("");//清空控件变量peditresult所对应的控件strInfo.Format("模板计算图片:\r\n");//读取文件的路径并显示在peditresult所对应的控件上intj=0;while(pos){m_nDigitTemp=j;//给对应的模板图片赋值strFile=FileDlg.GetNextPathName(pos);//获取文件名arTrainSetFilePath.Add(strFile);strInfo+=strFile;//加载路径strInfo+="\r\n";//输出路径pEditResult->SetSel(0,-1);//选中控件中的所有内容pEditResult->ReplaceSel(strInfo);//用新的控件变量pEditResult替换原来的内容digitTrain.digitdib.Load(strFile);digitTrain.CopyBitmapToAr();//把图片信息存入数组中digitTrain.BinaryDigit(120);//设置阈值为120,并进行二值化digitTrain.ThinDigit();//调用细化函数digitTrain.GetFeature();//调用计算特征值的函数CStringstrtmp;for(inti=0;i<17;i++){digitTemplate[j].feature[i]=digitTrain.feature[i];//strtmp.Format("%f,",digitTrain.feature[i]);//strInfo+=strtmp;}//strInfo+=strFile;strInfo+="\r\n";pEditResult->SetSel(0,-1);//选中控件中的所有内容pEditResult->ReplaceSel(strInfo);//用新的控件变量pEditResult替换原来的内容digitTemplate[j].trueClass=j;j++;}}4.4样本测试的实现 4.4.1样本测试设计思想 函数调用关系如图4—4所示:CDigitRecogDCDigitRecogDlg::OnButtonInputTest()调用AddSampleDlgFileDlgstrFile=FileDlg.GetNextPathName(pos)digitTrain.digitdib.Load(strFile)digitTrain.CopyBitmapToAr()digitTrain.digitdib.Display(pDCOrig,30,30)digitTest.BinaryDigit(120)digitTest.ThinDigit()digitTest.GetFeature()strInfo+="\n\r识别结果为:";strInfo.Format("")图4—4样本测试函数调用关系图4.4.2代码实现voidCDigitRecogDlg::OnButtonInputTest()//样本测试按扭被按时对应的处理函数{//TODO:AddyourcontrolnotificationhandlercodehereCStringFilePathName;//产生添加文件对话框对象AddSampleDlgFileDlg(TRUE,"",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, "BMP格式字符测试样本图象(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd());if(FileDlg.DoModal()!=IDOK)return;CStringstrFile;CStringstrInfo;arTestSetFilePath.RemoveAll();//清除路径记录,重新记录新的路径POSITIONpos=FileDlg.GetStartPosition();//指向所加载的文件位置pEditResult->SetSel(0,-1);//选中控件变量中的所有内容pEditResult->ReplaceSel("");//用新的控件变量pEditResult替换原来的内容//清空控件变量peditresult所对应的控件//strInfo.Format("测试样本集:\r\n");//读取文件的路径并显示在peditresult所对应的控件上while(pos){strFile=FileDlg.GetNextPathName(pos);//获取文件名arTestSetFilePath.Add(strFile);strInfo+=strFile;//加载路径strInfo+="\r\n";//输出路径pEditResult->SetSel(0,-1);//选中控件中的所有内容pEditResult->ReplaceSel(strInfo);//用新的控件变量pEditResult替换原来的内容}if((iTotalTestNum=arTestSetFilePath.GetSize())>0){//判断是否有输入的待测试图片iCurTestNum=0;strFile=arTestSetFilePath.GetAt(0);digitTest.digitdib.Load(strFile);//加载位图digitTest.digitdib.Display(pDCTest,30,30);//在pdctest对应的控件上显示图片信息digitTest.CopyBitmapToAr();//图片信息存入对应的缓冲中(数组)}digitTest.BinaryDigit(120);//设置阈值为120,并且进行二值化digitTest.ThinDigit();//调用预处理中的细化函数pEditResult->SetSel(0,-1);//选中控件中的所有内容pEditResult->ReplaceSel("");//用新控件pEditResult来替换原来的内容CStringstrTemp;strInfo.Format("");//读取文件的路径并显示在peditresult所对应的控件上inti,j;for(i=0;i<digitTest.digitHeight;i++){for(j=0;j<digitTest.digitWidth;j++){if(digitTest.digitarray[j][i]==1)strInfo+="■";elsestrInfo+="";}strInfo+="\r\n";}//用"■"显示出图像中的数字pEditResult->SetSel(0,-1);pEditResult->ReplaceSel(strInfo);digitTest.GetFeature();doublemin=100000.0;intclassResult=-1;//从模板中找和当前待测试图片的特征值信息最接近的模板for(i=0;i<10;i++){doublediff=0.0;for(j=0;j<12;j++){diff+=fabs(digitTest.feature[j]-digitTemplate[i].feature[j]);//与模板计算中所存的摸板中对应的12块区域的特征值做比较}for(j=12;j<17;j++){diff+=fabs(digitTest.feature[j]-digitTemplate[i].feature[j])*9;//与模板计算中所存的模板中对应的5个方向交点上的特征值做比较}if(diff<min){min=diff;classResult=i;//得到匹配的结果}}strTemp.Format("%d",classResult);//读取文件的输出并显示在classresult所对应的控件上strInfo+="\n\r识别结果为:";strInfo+=strTemp;//加载输出结果pEditResult->SetSel(0,-1);//选中控件pEditResult中的所有内容pEditResult->ReplaceSel(strInfo);//用新的控件来替换原来的内容}第五章系统运行及测试5.1系统的运行运行的界面如图5—1所示。图5—1运行界面图5.2系统的测试系统的测试,检查程序中的代码以及最终的总体测试。看系统识别出的数字的结果是否与我们所期望的值相同。以及通过一定的数据测试,估算出系统的识别率。以素材文件夹中T文件夹里的10个BMP文件格式的数字图像为模板,以素材里其他图像为测试对象。每个数字均有很多图片。分以下两组数据比较从0~9的10个数字中的图片中随机性测试各5次。共50组图片。如下图所示:在手写数字识别系统中,可以用(正确)识别率、误识率(替代率)、拒识率三个指标来标识系统的性能。具体定义如下面所示:识别率=正确识别样本数/全部样本数*100%误识率=错误识别样本数/全部样本数*100%拒识率=拒识样本数/全部样本数*100%而本系统测试数字样本图片时,只有正确识别和错误识别两种结果,因此拒识率为零。就不画在下面的表中了。全部样本总数为50。系统分成9块区域时,细化后上述50张待测试图片依次识别的结果为:00000111112222233333876643555569285779578888899999系统分成12块区域时,细化后上述50张待测试图片依次识别的结果为:00000111112222233533444445555566606717778868899999计算得到的数据如表5—1所示:系统系统(细化后)识别率误识率9块区域78%22%12块区域92%8%表5—1细化前后识别率对比1由此可见,适当的改进算法也可以提高识别率。系统分成12块区域时,细化前上述50张待测试图片依次识别的结果为:00008111117222233333444445553380666777678888899999对比计算得到数据如表5—2所示:系统系统(分12块区域)识别率误识率细化前86%14%细化后92%8%表5—2模块分割区域的对比由此可见,加强对图像的预处理可以提高识别率。系统分9块区域时,细化前上述50张待测试图片依次识别的结果为:000801111125222624332444485658452266777478688899999计算得到数据如表5—3所示:系统系统(分9块区域)识别率误识率细化前72%28%细化后78%22%表5—3细化前后对比识别率25.3系统的评价本系统基本能完成对数字图像的识别功能。虽然有一定的误识率。但是在这一领域里,应该知道没有“最好”研究识别率达到100%是我们的理想,只有更好通过我们的研究可以不断地将字符识别技术推向前进。结束语字符识别是传统和典型的模式识别问题,手写数字识别是字符识别领域中最大的难题之一,攻克这一难题已经成为众多科技工作者的目标。本文主要研究了字符识别中的预处理的一些情况,以及模板匹配识别的过程。以后,要使手写数字图像的识别率能够再有进一步的提高,一方面可以从预处理方面着手。另一方面可以改进更好的算法。参考文献黄维通编著,《VisualC++面向对象与可视化程序设计》(第2版),清华大学出版社,2003年12月宋辉,曲向丽,宋振龙编著,《VisualC++实用培训教程》,人民邮电出版社,2002年12月李博轩编著,《VisualC++图形用户界面开发指南》清华大学出版社,2000年11月ChrisH.Pappas,Williamh.Murray,III著《VisualC++参考大全》,希望图书创作室译,1999侯捷主编,《深入浅出WindowsMFC程序设计》,华中理工大学出版社,1998年4月钟志光,卢君,刘伟荣编著,《VisualC++.NET数字图象处理实例与解析》,清华大学出版社,北京,2003年6月何斌,马天予,王运坚,朱红莲编著,《VisualC++数字图象处理》,第二版,北京,人民邮电出版社。2002夏良正编著,《数字图象处理》,东南大学出版社,南京,1999年9月中国学术期刊网万方数据库资源系统中国图象图形网致谢语首先我要感谢合肥学院计算机科学与技术系的全体老师对我的关怀。在本次毕业设计与毕业论文写作过程中得到赵大政指导老师的悉心指导。通过这次毕业设计,启发了我的思维,提高了我的动手能力,学到了很多书本上学不到的东西,这些为我在今后工作岗位上发挥自己的才能奠定了坚实基础。我还要感谢我的家人,是他们的无私支持是我能顺利完成大学几年的学习,是他们在我遇到难题时给我及时的帮助与无限的动力,所以,我以此毕业论文作为我的学习成果向父母汇报,感谢你们。最后,我要再次向给予我帮助的所有老师和同学表示深深的谢意,感谢大家在学习、生活中对我的帮助,谢谢大家!附录附录一:以下是按扭的部分代码清单://输入测试按扭被按时对应的处理函数voidCDigitRecogDlg::OnButtonInputTest(){//TODO:AddyourcontrolnotificationhandlercodehereCStringFilePathName;//产生添加文件对话框对象AddSampleDlgFileDlg(TRUE,"",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, "BMP格式字符测试样本图像(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd());if(FileDlg.DoModal()!=IDOK)return;CStringstrFile;CStringstrInfo;arTestSetFilePath.RemoveAll();//清除路径记录,重新记录新的路径POSITIONpos=FileDlg.GetStar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某汽车制造装配制度
- 食品和饮料用氮气发生器全球市场总体规模
- 2026电网会计面试题目及答案
- 2026耕地抛荒面试题及答案
- 人工智能在金融衍生品定价中的作用
- 2026宏观量化面试题及答案
- 2026监测岗位面试题及答案
- 光机电一体化公司项目经理述职报告
- 软件开发工程师年度述职总结
- 泰安地坪施工方案
- GB 20052-2024电力变压器能效限定值及能效等级
- GB/T 43632-2024供应链安全管理体系供应链韧性的开发要求及使用指南
- (4059题)2023年学习强国挑战赛答题题库附答案(最全版)
- 体育与健康六年级上期教案
- 首营企业、品种、客户审批表
- 软件公司绩效考核指标表
- 深入浅出Oracle EBS之OAF学习笔记-Oracle EBS技术文档
- 中学历史 核心素养视阈下的课堂教学 课件
- TCDZX 003-2022 多矿物质营养茶
- 外科学教学课件:胃十二指肠疾病
- LS 8010-2014植物油库设计规范
评论
0/150
提交评论