模式识别——冯军美(共46页)_第1页
模式识别——冯军美(共46页)_第2页
模式识别——冯军美(共46页)_第3页
模式识别——冯军美(共46页)_第4页
模式识别——冯军美(共46页)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西北工业大学研究生院学 位 研 究 生 课 程 考 试 试 题考试科目:模式识别 课程编号:086021 共 44 页 第 页研究生专业课程考试(kosh)答题册得分:学号 姓名冯军美考试课程模式识别考试日期 2014.7.10西北工业大学研究生院一、研究(ynji)论述题(60分) 识别检测印刷电路板上圆形或方形焊盘上锡膏的边缘(binyun),要求: 显示每个焊盘上锡膏图像的单像素边缘(binyun)轮廓; 精确求解每个焊盘上锡膏图像的几何中心,并显示中心坐标值。具体(jt)包括:1(10分)论述你所采用的识别检测算法所属研究领域的技术研究现状及热点研究方向。2(10分)论述上述研究领域中

2、,目前的主要算法/方法。3(10分)论述你的算法中涉及到的图像预处理技术。4(15分)阐述你的算法/方法所依据的基本原理和设计思路。若有改进之处,详细论述改进部分所要解决的主要问题是什么,以及所研究的解决方法的理论依据。5(15分)描述算法/方法的具体实现步骤,对所使用的变量、参数等应进行说明。绘制识别过程的算法/方法流程图。要求:用word文档,A4纸打印。排版格式如下:(1)题目标题:小四黑体;题目内容:小四号宋体。子题目标题:小四黑体;正文及参考文献:五号宋体。(2)参考文献:按正文中引用顺序排序,在正文中用上标标明参考文献的引用处。(3)正文行间距取1.3行距。(4)英文、数字用Tim

3、es New Roman字体。二、算法编程(40分)利用C/C+语言编程实现所设计的算法/方法。要求:(1)程序编制应具有规范性,程序中的变量、自编函数/子程序、各功能模块及关键命令行应有注释说明。(2)附源程序及程序运行的结果截图。一、研究(ynji)论述题(60分) 识别(shbi)检测印刷电路板上圆形或方形焊盘上锡膏的边缘(binyun),要求: 显示每个焊盘上锡膏图像的单像素边缘轮廓; 精确求解每个焊盘上锡膏图像的几何中心,并显示中心坐标值。具体包括:(10分)论述你所采用的识别检测算法所属研究领域的技术研究现状及热点研究方向。目标轮廓提取是图像分割重要研究内容。现有的图像分割方法主要

4、分以下几类:基于 HYPERLINK /view/409216.htm t _blank 阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。 图像分割技术的研究现状: 图像分割在图像工程中起着承上启下的作用,是介于低层次处理和高层次处理的中间层次。早在1965年就有人提出了检测边缘算子边缘检测方法,边缘检测已产生了不少经典算法1。目前越来越多的学者开始将数学形态学、模糊理论、遗传算法理论、分形理论和小波变化理论等研究成果运用到图像分割中,产生了结合特定数学方法和针对特殊图像分割的先进图像分割技术。 图像分割技术发展趋势: 1.多种特征融合的分割方法。 除利用图

5、像的原始灰度特征外,我们还可以利用图像的梯度特征、几何特征(形态、坐标、距离、方向、曲率等)、变换特征(傅立叶谱、小波特征、分形特征等)及统计学特征(纹理、不变矩、灰度均值等)等高层次特征,对于每个待分割的像素,将所提取的特征值组成一个多维特征矢量,再进行多维特征分析。通过多种特征的融合,图像像素能被全面描述,从而获得更好的分割结果2。 2. 多种分割方法结合的分割方法。 由于目标成像的不确定性以及目标的多样性,单一的分割方法很难对含复杂目标的图像取得理想的分割结果。此时,除需要利用多种特征融合外,还需将多种分割方法结合,使这些方法充分发挥各自的优势,并避免各自的缺点。采用哪种方式结合以获得良

6、好的分割效果是这种方法研究的重点。K均值聚类属于数据挖掘技术。数据挖掘主要的算法有分类模式、关联规则、决策树、序列模式、聚类模式分析、神经网络算法等等。聚类是数据挖掘中的一个非常重要的研究课题。 数据挖掘研究现状3: 目前,国外数据挖掘的最新发展主要有对发现知识的方法的进一步研究,如近年来注重对Bayes(贝叶斯)方法以及Boosting方法的研究和改进提高;KDD与数据库的紧密结合;传统的统计学回归方法在KDD中的应用。 数据挖掘的热点研究方向4: 网站的数据挖掘(Web site data mining)、生物信息或基因(Bioinformatics/genomics)的数据挖掘及其文本的

7、数据挖掘(Textual mining)、空间地理数据挖掘和视频数据挖掘。2. (10分)论述上述研究(ynji)领域中,目前的主要(zhyo)算法/方法(fngf)。图像分割领域目前的主要方法: 1. 基于边缘的分割方法 基于边缘的分割方法是一种利用图像不同区域间的像素灰度不连续的特点检测出区域间的边缘,从而实现图像分割的方法。边缘检测是所有基于边缘分割方法的第一步。边缘检测可以根据处理的顺序分为并行边缘检测和串行边缘检测。 2. 基于区域的分割方法 基于区域的分割方法主要包括阈值法和区域分割算法两种。 阈值法:常用的阈值选取法有利用图像灰度直方图的双峰法、最大类间方差法、迭代法、灰度拉伸法

8、、最小误差法等。现有的大部分算法的关键都集中在阈值确定的研究上。 区域分割算法:其实质就是把具有某种相似性质的像素连通,从而构成最终的分割区域。 3. 结合特定理论工具的分割方法 基于人工神经网络的分割方法、基于小波分析和变换的分割方法和基于数学形态学的分割技术。 数据挖掘领域的主要算法3: 神经网络法、决策树法、遗传算法、粗糙集法、模糊集法、关联规则法和聚类模式分析。 3(10分)论述你的算法中涉及到的图像预处理技术。图像预处理技术:灰度变换。由于原图像为24位的彩色图像,为了提高处理速度并方便后续处理,在图像预处理阶段将彩色图像转换成了灰度图像。本文所采用的灰度化方法是采用加权方法进行的,

9、灰度值同RGB颜色对应关系:I=0.299R+0.585G+0.114B,R,G,B为彩色图像的三个颜色分量值。改进的大津二值化方法。由于图像的背景较为复杂,从直方图中可看出,仅用一个大津法求出的全局阈值无法有效的处理焊盘图片。为了尽可能多的保留感兴趣区域,去除噪声区域,所以,在二值化采用改进的大津二值化方法。平滑滤波。由于图像中的噪声多数是随机的,为了适应不同的二值化图片对不同噪声的滤除要求,算法中邻域的大小是可变的,大小为(2*x+1)*( 2*x+1),x可根据需要选择,在去噪的同时对边缘也起到了平滑作用。腐蚀(fsh)与膨胀。在二值图像(t xin)中腐蚀可消除细小的点或线,膨胀可填充

10、边缘或像素内部的孔。结构元素的选择不同,产生的图像(t xin)效果不同。腐蚀、膨胀使用顺序不同,可形成不同的运算类型,如开运算、闭运算。投影法定位。对处理后的二值图像进行水平、垂直投影,可确定焊盘区域的大概位置,只对定位后的区域进行处理,不仅减少去噪的工作量,而且使边缘提取效果更加准确。区域填充。由于焊锡区域灰度变化范围比较大,二值化之后,焊锡区域是一些离散的点,去噪之后如果直接进行边缘检测,不仅边缘变化比较剧烈,而且边缘提取的难度比较大。如果采用闭运算使焊锡区域保持一致,则边缘的位置会发生移动,最终使边缘不准确。尝试过两种方案后,最终采用水平分块填充和垂直分块填充。4(15分)阐述你的算法

11、/方法所依据的基本原理和设计思路。若有改进之处,详细论述改进部分所要解决的主要问题是什么,以及所研究的解决方法的理论依据。改进的大津二值化方法。该算法是依据大津二值化法设计的,利用直方图来计算类间方差的方法。基本原理:类间方差越大,表示两个类的差别越大。设使用某一个阈值将灰度图像根据灰度大小,分成目标部分和背景部分两类,在这两类的类内方差最小和类间方差最大的时候,得到的阈值是最优的二值化阈值。设计思路:对一幅NM个像素的图像来说。1.首先计算图像的平均灰度u,计算如下:对于一张大小MN的图像,统计得到全部图像中灰度为i对应的像素个数n(i),于是该图像的平均灰度值u=i*n(i)/(M*N);

12、2.列出求解最佳阀值t的相关变量; 记t为目标与背景的分割阈值,记目标像素(灰度大于t)占图像的比例为w1,记目标像素的平均灰度为u1:w1= W1/(M*N),其中的W1是灰度值大于t的统计数u1= i*n(i)/W1, it.同理,得到背景像素占图像的比例w2,背景像素的平均灰度u2;3.求解最佳阀值t是类差别最大遍历2中的t,使得G=w1*(u1-u)*(u1-u)+w2*(u2-u)*(u2-u)最大。G最大时,即得到了最佳阈值。焊盘区域定位之前的二值化改进之处:由灰度图像的直方图可以看出,直方图有三个波峰,第一个波峰之前的灰度值所对应像素点绝大部分是焊锡边缘之外、焊盘之内的黄色涂层区

13、域,而最后一个波峰对应横跨整幅图的白色焊锡区域,所以,我们感兴趣的焊锡区域所对应的像素点的灰度值在这两个波峰之间。我们只需要在第二个波峰附近的灰度直方图附近求一个大津二值化阈值即可。解决的主要问题:尽可能多的保留焊锡区域,过滤(gul)噪声。理论依据:第一个波峰(bfng)之前的灰度值主要对应黄色涂层区域,后一个波峰之后的灰度值主要对应横跨(hn ku)整幅图的白色焊锡区域,对整幅图求大津二值化阈值很可能将这两块区域的噪声视为感兴趣区域,加大噪声处理难度和感兴趣区域的定位。只对第二个波峰附近求阈值,求类间最大方差,用先验知识保证了二值化的准确度。焊盘区域定位后的二值化改进之处:焊盘区域定位之后

14、,每个焊盘的位置已经确定,由于光照不均,为了全局二值化使焊锡区域信息保留的不完整,在这里,我们把每个焊盘区域都看作一幅完整的图像,分别用大津二值化求阈值,进行二值化。解决的主要问题:由于光照不均,全局二值化会导致焊锡区域边缘信息保留不完整。理论依据:小范围区域光照变化不会太剧烈,将每个焊盘区域看作一幅光照均匀的图片进行处理,所以整幅图像采用局部二值化方法。平滑滤波基本原理:邻域内白点数少于规定的阈值邻域内所有像素点的值赋为0。设计思路:以像素点(x,y)为中心,建立(2n+1)*(2n+1)的邻域,设定阈值T。统计邻域内的所有像素值为1的像素点的个数sum,如果sumT,此邻域视为感兴趣区域,

15、不处理。改进之处:邻域的大小和阈值是可变的,不同的图像可以根据需要自行设定。解决的主要问题:滤除图像中的小噪声或用来产生背景图像。理论依据:T较小时,可以除去图像中的小噪点,T较大时,焊锡区域被去除掉了,剩下的图像作为背景区域。“减”运算a) 基本原理:原图像中去除图像中不需要的加性图像或固定的背景信息,可得到感兴趣的区域。b) 设计思路:由于焊锡区域为一些离散的点集,将二值化图形进行腐蚀,得到大区域噪声信息,用原二值化图像减去噪声信息,得到感兴趣的焊锡区域。c) 改进之处:由于腐蚀过程中,噪声区域一些信息也被腐蚀掉了,所以,在进行减运算之前,对噪声区域进行膨胀操作。解决的主要问题:去除了大范

16、围的噪声,有利于焊盘区域的定位。理论依据:焊锡区域灰度值变化范围较大,二值化之后有用的信息点较为离散。投影法定位基本原理:有焊盘的区域像素值为1的像素点比较密集,其他区域像素值为0。设计思路:1.整幅图像(t xin)水平投影,rowi存放第i行像素值为1的像素点的个数,rowi=0&rowi+1!=0作为上边界(binji)的判断条件,rowi!=0&rowi+1=0作为下边界的判断(pndun)条件;2.将上下两排焊盘分别进行垂直投影,coli存放第i列像素值为1的像素点的个数coli=0&coli+1!=0作为焊盘左边界的判断条件,coli!=0&coli+1=0作为焊盘右边界的判断条件

17、;3.对每个焊盘区域重新进行水平投影和垂直投影,精确确定焊盘的边界;4.对每个焊盘区域边界进行放宽,避免焊锡超出焊盘区域的情况。解决的主要问题:焊盘区域定位以后,只需对焊盘区域进行处理,大大减少了去噪的工作量,使焊盘边缘确定更准确。区域填充基本原理:焊锡区域虽然是一些离散度,但焊锡的边界点绝大部分是白点,将边缘点进行水平填充和垂直填充,再进行滤波,可以使边缘更平滑、准确。设计思路:1.将去噪后的每个焊锡区域的二值化图像分为上、中、下三部分进行水平填充。由于焊锡的形状未知,为避免破坏焊锡的轮廓,在填充焊锡区域上、下部分时,只填充其中的一部分区域。填充的起点判别条件为填充小区域每行第一个不为0的像

18、素点,终点为填充小区域每行最后一个不为0 的像素点。填充之后,进行滤波;2.将每个焊锡区域的二值化图像分为上、中、下三部分进行垂直填充。填充起点的判别条件为填充小区域每列第一个不为0的像素点,终点为每列最后一个不为0的像素点。填充之后,进行滤波;3.按此方法,继续填充左上部分、坐下部分、右上部分和右下部分。填充之后,滤波。改进之处:代替了闭运算的功能,但效果更好。由于进行闭运算时,虽然对焊锡区域进行了很好的填充,但是,同时也改变了焊锡轮廓的位置,使得轮廓位置发生了移动。解决的主要问题:填充焊锡区域的同时,不改变焊锡边缘轮廓的位置,这是闭运算不能替代的。理论依据:焊锡区域是连续的,在焊锡边缘点之

19、内的区域必定为焊锡区域。K均值算法基本原理:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。设计思路: 1.从 n个数据对象任意选择 k 个对象作为初始聚类中心;2.循环3到4直到每个聚类不再发生变化为止;3.根据每个聚类对象的均值,计算每个对象与这些中心对象的距离。并根据最小距离重新对相应对象进行划分;4.重新计算每个有变化聚类的均值。解决的主要问题:较为准确地找到了聚类中心。5(15分)描述(mio sh)算法/方法(fngf)的具体实现步骤,对所使用的变量、参数等应进行(jnxng)说明。绘制识别过程的算法/方法流程图。灰度变换本文所采用的灰度化方法是采用加权方法进行的,灰度值

20、同RGB颜色对应关系:I=0.299R+0.587G+0.114B,其中0.299、0.587、0.114是根据人眼对于红绿蓝三个颜色分量的敏感度、经由学者们实验得出的三个系数,R,G,B为彩色图像的三个颜色分量值。焊盘定位之前二值化方法1.根据图像的灰度图建立对应的灰度直方图,在灰度直方图中求出像素点最多的灰度值T,求出第一个波峰与第二个波峰之间的波谷处的灰度值T3,求出第二个波峰与第三个波峰之间的波谷处的灰度值T1;2.用大津二值化方法求T3与T1之间的阈值T2,大津二值化方法步骤如上题所述;3.对灰度图进行二值化,如果灰度值在T3与T1之间,视此点为感兴趣区域的点,灰度值赋为1,其余的灰

21、度值处赋为0,视为噪声点。焊盘定位之后的局部二值化方法1.把第一个焊盘区域看作一幅完整的图片,用大津法进行二值化,求出阈值为Threshold;2.对此焊盘区域进行二值化,将灰度值在T3与Threshold之间的赋值为1,其他灰度值处赋值为0;3.对其余的焊盘区域重复1和2步骤,直到所有的焊盘区域均进行二值化完成为止。邻域去噪算法1.以像素点(x,y)为中心,建立邻域大小为(2n+1)*(2n+1)的模板,n的值由实参确定;2.统计邻域中像素值为1的像素点的个数sum,若sumThreshold,则邻域内的像素值保持不变,否则邻域清0。其中,Threshold为阈值,其大小由实参确定。投影法定

22、位1.整幅图像水平投影,rowi存放第i行像素值为1的像素点的个rowi=0&rowi+1!=0作为上边界的判断条件,其中,y=i作为上边界,rowi!=0&rowi+1=0作为下边界的判断条件,其中,y=i+1作为下边界;2.将上下两排焊盘分别进行垂直投影,coli存放第i列像素值为1的像素点的个数coli=0&coli+1!=0作为焊盘左边界的判断条件,其中x=作为左边界,coli!=0&coli+1=0作为焊盘右边界的判断条件,其中,x=i+1作为右边界;3.对每个焊盘区域重新进行水平投影和垂直投影,精确确定焊盘的边界;4.对每个焊盘区域边界进行放宽,避免焊锡超出焊盘区域的情况。6)区域

23、填充1.将去噪后的每个焊锡区域的二值化图像分为上、中、下三部分进行水平填充。由于焊锡的形状未知,为避免破坏焊锡的轮廓,在填充焊锡区域上、下部分时,只填充其中的一部分区域。填充的起点判别条件为填充小区域每行第一个不为0的像素点,终点为填充小区域每行最后一个不为0 的像素点。填充之后,进行滤波,其中,滤波参数根据二值化图像具体情况自行确定;2.将每个焊锡(hnx)区域的二值化图像分为上、中、下三部分进行垂直填充。填充起点的判别条件为填充小区域每列第一个不为0的像素点,终点为每列最后一个不为0的像素点。填充之后,进行滤波;3.按此方法,继续填充(tinchng)左上部分、坐下部分、右上部分和右下部分

24、。填充之后,滤波。提取轮廓(lnku)算法方法一:用opencv提供的cvFindContours函数寻找焊锡轮廓,轮廓数据存储在contour中,再用cvDrawContours函数再原图中画出提取的轮廓。方法二:1.建立矩阵类型的图像ImgMat,并初始化为0。在填充后的焊锡二值化图像中,对所有的像素点,如果任一像素点(x,y)处四邻域(x+1,y)、(x-1,y)、(x,y-1)、(x,y+1)的像素值均为1的,则在ImgMat中标记对应的 (x,y)处的像素值为1;2. 在焊锡二值化图像中,如果像素点(x,y)满足: eq oac(,1)此处的像素值为1; eq oac(,2)ImgM

25、at在(x,y)处的像素值为0,则此点为边缘轮廓点,并在坐标数组中记录下此点的位置。几何中心的计算方法一:轮廓区域所有点求平均在焊锡二值化图像中,对每个焊盘区域,对焊盘区域的所有像素为1的像素点求坐标的平均值,此平均值即认为几何中心。方法二:轮廓点求平均对7)每个焊盘区域提取的边缘点求坐标的平均值,此平均值即认为几何中心。方法三:K均值聚类算法1.从 n个数据对象任意选择 k 个对象作为初始聚类中心;2.循环3到4直到每个聚类不再发生变化为止;3.根据每个聚类对象的均值,计算每个对象与这些中心对象的距离。并根据最小距离重新对相应对象进行划分;4.重新计算每个有变化聚类的均值。输入图像流程图:改

26、进的大津二值化去噪,投影焊盘定位局部二值化去噪,填充提取轮廓三种方法确定几何中心二、算法(sun f)编程(40分)利用(lyng)C/C+语言(yyn)编程实现所设计的算法/方法。要求:(1)程序编制应具有规范性,程序中的变量、自编函数/子程序、各功能模块及关键命令行应有注释说明。(2)附源程序及程序运行的结果截图。(1) 源程序头文件Pretreatment.h#include #include #include #include#include#include#include#include #include #include #include using namespace std;

27、/*大津二值化*/大津二值化/Image:输入图像int OtsuTrans(IplImage * Image)/*不同像素值的概率值*/float p256=0,w0256=0,w1256=0,u0256=0,u1256=0,u256=0,Variance256=0;int T,i,j;/变量int H; /行int W; /列int Threshold;/阈值(y zh)int height=Image-height;/图像(t xin)的高度int width =Image-width; /图像(t xin)的宽度float matSize=(float)height*width;/矩阵

28、大小CvMat * srcMat=cvCreateMat(height,width,CV_32FC1);/存放图像数据的矩阵cvConvert(Image,srcMat);/图像类型转换 /得到不同灰度值的概率for( H=0;Hheight;H+)for ( W=0;Wwidth;W+)p(int)cvmGet(srcMat,H,W)+;for(i=0;i256;i+)pi/=matSize;for (T=0;T256;T+) /阈值为T时,第一组的概率总值for (i=0;iT;i+)w0T+=pi;/阈值为T时,第一组灰度平均值for (i=0;iT;i+)u0T+=i*pi/w0T;/

29、阈值为T时,第二组的概率总值w1T=1-w0T;/阈值为T时,第二组灰度平均值for(T=0;T256;T+)for (i=T;i256;i+)u1T+=i*pi/w1T;/得到全部采样的灰度平均值for (T=0;T256;T+)uT=w0T*u0T+w1T*u1T;/求方差for (i=0;i256;i+)Variancei=w0i*(u0i-ui)*(u0i-ui)+w1i*(u1i-ui)*(u1i-ui);/寻找最大方差,并得到阈值ThresholdmatSize=0;for (i=0;i=matSize)matSize=Variancei;Threshold=i;return Th

30、reshold;/*/*滤波(lb)函数*/srcMat:图像的矩阵(j zhn)类型,/changshu:决定邻域滤波(lb)模板的大小/Threshold:阈值void LocalPossible3(CvMat* srcMat,int changshu,int Threshold) int height=srcMat-height;/图像的高度int width =srcMat-width ;/图像的高度CvMat * tmpMat=cvCreateMat(height,width,CV_32FC1);/存放图像数据的临时矩阵cvZero(tmpMat);/矩阵初始化为0int i,j,h

31、,w;/变量/计算邻域范围的概率for(i=5;iheight-5;i+)for (j=5;jwidth-5;j+)/概率密度应该要考虑所有的点double sum=0;/邻域内白点个数for ( h=-changshu;h=changshu;h+)for( w=-changshu;wThreshold)for ( h=-changshu;h=changshu;h+)for( w=-changshu;wheight;/图像的高度int width =Image-width ;/图像的宽度CvMat * tmpMat=cvCreateMat(height,width,CV_32FC1);/存放图

32、像数据的临时矩阵cvZero(tmpMat);/数据初始化为0cvConvert(Image,tmpMat);for(i=0;iheight;i+)for(j=0;jwidth;j+)if(cvmGet(tmpMat,i,j)=1)cvmSet(tmpMat,i,j,255);cvConvert(tmpMat,Image);/*/*K均值滤波自定义函数*/存放元组的属性信息struct Tuple int attr1; int attr2;/计算两个元组间的欧几里距离float getDistXY(Tuple t1, Tuple t2) return sqrt(t1.attr1 - t2.at

33、tr1) * (t1.attr1 - t2.attr1) + (t1.attr2 - t2.attr2) * (t1.attr2 - t2.attr2);/根据质心(zh xn),决定当前元组属于哪个簇int clusterOfTuple(Tuple means,Tuple tuple,int k)float dist=getDistXY(means0,tuple);/距离(jl)float tmp;/临时(ln sh)变量int label=0;/标示属于哪一个簇for(int i=0;ik;i+)tmp=getDistXY(meansi,tuple);if(tmpdist) dist=tm

34、p;label=i;return label;/获得给定簇集的平方误差float getVar(vector clusters,Tuple means,int k)float var = 0;/存放平方误差的总和for (int i = 0; i k; i+)vector t = clustersi;/给定簇集for (int j = 0; j t.size(); j+)var += getDistXY(tj,meansi);return var;/获得当前簇的均值(质心)Tuple getMeans(vector cluster)int num = cluster.size();/簇的大小d

35、ouble meansX = 0, meansY = 0;/元组中元素分量的总和Tuple t;for (int i = 0; i num; i+)meansX += clusteri.attr1;meansY += clusteri.attr2;/均值(jn zh)t.attr1 = meansX / num;t.attr2 = meansY / num;return t;/获得(hud)聚类中心/k为聚类的数目(shm)void KMeans(vector tuples,int k)vector *clusters=new vectork; Tuple *means=new Tuplek;

36、/存放均值int i=0;/变量/默认一开始将前K个元组的值作为k个簇的质心(均值)for(i=0;ik;i+)meansi.attr1=tuplesi.attr1;meansi.attr2=tuplesi.attr2;int lable=0;/变量/根据默认的质心给簇赋值for(i=0;i!=tuples.size();+i)lable=clusterOfTuple(means,tuplesi,k);clusterslable.push_back(tuplesi);/输出刚开始的簇for(lable=0;lablek;lable+)vector t = clusterslable;float

37、 oldVar=-1;/旧的平方误差的初始值float newVar=getVar(clusters,means,k);/新的平方误差while(abs(newVar - oldVar)=1) /当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止for (i = 0; i k; i+) /更新每个簇的中心点meansi = getMeans(clustersi);oldVar = newVar;newVar = getVar(clusters,means,k); /计算新的准则函数值for (i = 0; i k; i+) /清空(qn kn)每个簇clustersi.clear()

38、;/根据新的质心(zh xn)获得新的簇for(i=0;i!=tuples.size();+i)lable=clusterOfTuple(means,tuplesi,k);clusterslable.push_back(tuplesi);/输出(shch)当前的簇for(lable=0;lablek;lable+)vector t = clusterslable;/IplImage *Timag = cvLoadImage(2 方形.jpg);/原图像备份IplImage *Timag = cvLoadImage(10、方法三确定的几何中心.jpg);/轮廓图像备份IplImage *Tima

39、g1 = cvLoadImage(12、三种方法确定的几何中心对比.jpg);/原图像备份char c120,c220,c340;/存放字符,为显示坐标值做准备string s;/暂存坐标值for(i=0;ik;i+)/cvCircle(Timag,cvPoint(meansi.attr1,meansi.attr2),3,cvScalar(0,255,255),5);/cvCircle(Timag1,cvPoint(meansi.attr1,meansi.attr2),3,cvScalar(255,0,255),5);/初始化字符数组为0memset(c1,0,20);memset(c2,0,

40、20);memset(c3,0,40);/初始化字符串为0s=;s+=(;sprintf(c1,%d,cvRound(meansi.attr1);s+=c1;s.append(,);sprintf(c2,%d,cvRound(meansi.attr2);s+=c2;s+=);for(int j=0;jheight; /图像的高度int width =imag-width; /图像的宽度int i,j,k; /变量int T=0,T1=250,T2=0,T3=0;/阈值int Lflag=0; /峰值int p256=0;/存放灰度直方图数据IplImage * temp=cvCreateIma

41、ge(cvSize(width,height),IPL_DEPTH_8U,1);/保存灰度图像IplImage * temp1=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);/灰度图像备份/保存图像时转换用的临时图像IplImage * temp2=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1); cvCvtColor(imag,temp,CV_BGR2GRAY);/灰度化CvMat * ImgMat=cvCreateMat(height,width,CV_32FC1);/保存图像数据

42、的临时矩阵CvMat * TemMat=cvCreateMat(height,width,CV_32FC1);/保存图像数据的临时矩阵cvConvert(temp,ImgMat);/图像类型转换cvCopy(ImgMat,TemMat,NULL);/复制(fzh)cvCopy(temp,temp1);/复制(fzh)/统计(tngj)所有灰度值所对应的像素点个数,for( j=0;jheight;j+)for ( i=0;iwidth;i+)p(int)cvmGet(ImgMat,j,i)+;/*灰度直方图显示*/*for(i=0;i256;i+)pi/=10;CvMat * tmp=cvCr

43、eateMat(width,256,CV_32FC1);cvZero(tmp); for(i=0;i255;i+)for(j=0;jpi;j+) cvmSet(tmp,j,i,1);cvNamedWindow(zhifangtu,1);cvShowImage(zhifangtu,tmp);cvReleaseMat(&tmp);tmp = NULL;*/*/ /寻找灰度直方图中像素点最多的灰度值 ,即波峰(阈值分割点) for(i=1;ipLflag)Lflag=i; /波峰位置 T3=Lflag; for(i=Lflag;i3*Lflag;i+) if(pipT3)T3=i; /最低点 /第一

44、个波谷位置Tfor(i=Lflag;ipi+1&pi+1pi+2)T=i;break;/求波谷(bg)位置if(pT3255/2;i-)if(pipT1)T1=i;/*大津法求阈值(y zh)*/int changshu=T1-T+1; /数组长度float matSize=0; /处理的像素总数for(i=T;i=T1;i+) matSize+=pi;/存放灰度概率的数组float *p1=new floatchangshu; float *w0=new floatchangshu;float *w1=new floatchangshu; float *u0=new floatchangsh

45、u; float *u1=new floatchangshu; float *u=new floatchangshu; float *Variance=new floatchangshu;for(i=0;ichangshu;i+) p1i=0; w0i=0; w1i=0; u0i=0; u1i=0; ui=0; Variancei=0;for(i=T;i=T1;i+)p1i-T=pi; for(i=0;ichangshu;i+)p1i/=matSize;for (T=0;Tchangshu;T+)/阈值(y zh)为T时,第一组的概率总值for (i=0;iT;i+)w0T+=p1i;/阈值(

46、y zh)为T时,第一组灰度平均值for (i=0;iT;i+)u0T+=i*p1i/w0T;/阈值(y zh)为T时,第二组的概率总值w1T=1-w0T;/阈值为T时,第二组灰度平均值for(T=0;Tchangshu;T+)for (i=T;ichangshu;i+)u1T+=i*p1i/w1T;/得到全部采样的灰度平均值for (T=0;Tchangshu;T+)uT=w0T*u0T+w1T*u1T;/求方差for (i=0;ichangshu;i+)Variancei=w0i*(u0i-ui)*(u0i-ui)+w1i*(u1i-ui)*(u1i-ui);/寻找最大方差,并得到阈值Th

47、resholdmatSize=0;for (i=0;i=matSize)matSize=Variancei;T2=i;/T2为大津法求得的阈值/*/二值化 for ( i=0;iheight;i+)for ( j=0;jT3&cvmGet(ImgMat,i,j)T2)cvmSet(ImgMat,i,j,1);else cvmSet(ImgMat,i,j,0); CvMat * erzhiMat=cvCreateMat(height,width,CV_32FC1);/保存(bocn)二值图像的临时矩阵cvCopy(ImgMat,erzhiMat,NULL);cvNamedWindow(1、二值化

48、图像:, 1);/创建(chungjin)显示窗口 cvShowImage(1、二值化图像:, ImgMat); /显示图像cvConvert(ImgMat,temp2);XianShi(temp2);char* filename=F:pattern recognation运行结果1、二值化图像.jpg; /保存图像的路径cvSaveImage(filename,temp2); /保存图像/*滤波*/二值化图像-噪声图像=焊盘位置图像CvMat * ImgMat1=cvCreateMat(height,width,CV_32FC1);/存放腐蚀后的二值图像cvZero(ImgMat1);Ipl

49、ConvKernel * element=cvCreateStructuringElementEx(11,11,0,0,CV_SHAPE_RECT);/膨胀的结构元素cvErode(ImgMat,ImgMat1,NULL,1); /腐蚀cvDilate(ImgMat1,ImgMat1,element,1);/膨胀 for ( i=0;iheight;i+)for ( j=0;j=cvmGet(ImgMat,i,j)cvmSet(ImgMat,i,j,0);/滤波LocalPossible3(ImgMat,5,43);cvNamedWindow(2、滤波后定位焊盘的二值化图像:, 1); cvS

50、howImage(2、滤波后定位焊盘的二值化图像:, ImgMat);cvConvert(ImgMat,temp2);XianShi(temp2);filename=F:pattern recognation运行结果2、滤波后定位焊盘的二值化图像.jpg;cvSaveImage(filename,temp2);/*/*投影(tuyng)初步确定焊盘的位置*/int a=0,b=0,num=0,c=0;/变量(binling)int flag=0; /标志(biozh)位int up8=0; /存放上边界的数组int down8=0; /下边界数组int left8=0; /左边界数组int r

51、ight8=0;/右边界数组int *row=new intheight;/存放水平投影数据for (i=0;iheight;i+)rowi=0;for (i=0;iheight;i+)for (j=0;jwidth;j+) rowi+=cvRound(cvmGet(ImgMat,i,j);/四舍五入/定位焊盘的上下边界for(i=0;iheight/2;i+)if(rowi!=0&rowi+1=0)a=i+1;/a为上排焊盘的下边缘for(i=height/2;iheight*2/3;i+)if(rowi=0&rowi+1!=0)b=i; /b为下排焊盘的上边缘/定位上排焊盘的左右边界 in

52、t *col=new intwidth;/存放垂直投影数据for(i=0;iwidth;i+)coli=0;for (i=0;iwidth;i+)for (j=0;j=a;j+) coli+=cvRound(cvmGet(ImgMat,j,i);/四舍五入for(i=0;i60)&coli!=0&coli+1=0)rightnum=i+1; /右边界(binji)flag=0;upnum=0; /上边界(binji)downnum=a;/下边界(binji)num+; /num记录找到的焊盘个数/寻找下排焊盘的左右边界for(i=0;iwidth;i+)coli=0;for (i=0;iwid

53、th;i+)for (j=b;jheight;j+) coli+=cvRound(cvmGet(ImgMat,j,i);/四舍五入for(i=0;i60)&coli!=0&coli+1=0)rightnum=i+1; /右边界 flag=0;upnum=b; /上边界downnum=height-1;/下边界num+; /num记录找到的焊盘个数/精确确定焊盘的上下边界for(i=0;inum;i+)for(j=0;jheight;j+)rowj=0;for(a=upi;a=downi;a+)for(b=lefti;b=righti;b+) rowa+=cvRound(cvmGet(ImgMa

54、t,a,b);/四舍五入/精确定位上下(shngxi)边界a=upi;while(rowa=0&aupi)b-;downi=b;/精确定位左右(zuyu)边界for(j=0;jwidth;j+)colj=0;for(a=lefti;a=righti;a+)for(b=upi;b=downi;b+)cola+=cvRound(cvmGet(ImgMat,b,a);/四舍五入(s sh w r)a=lefti;while(cola=0&alefti)b-;righti=b;/适当放宽焊盘区域,以便于精确确定焊锡边缘a=0;b=0;for(i=0;ia)a=downi-upi;if(righti-l

55、eftib)b=righti-lefti;/取定位区域中长、宽的最大值if(ab)b=a;a+=5;b+=15;elsea=b;a+=5;b+=15;for(i=0;inum;i+)/对上边界进行(jnxng)放宽if(upi(a-downi+upi)/2+6)upi=3;elseupi-=(a-downi+upi)/2;/对下边界进行(jnxng)放宽if(height-downi-1(a-downi+upi)/2+6)downi=height-3;elsedowni+=(a-downi+upi)/2;/对左边界进行(jnxng)放宽if(lefti(b-righti+lefti)/2+6)

56、lefti=5;elselefti-=(b-righti+lefti)/2;/对右边界进行放宽if(width-righti-1(b-righti+lefti)/2+16)righti=width-5;elserighti=righti+(b-righti+lefti)/2+10;/在彩色图像中用线宽为2的蓝线框出定位的焊盘区域for(i=0;inum;i+)cvRectangle(Timag,cvPoint(lefti,upi),cvPoint(righti,downi),cvScalar(255,255,0),2);cvNamedWindow(3、定位焊盘后的彩色图像:, 1); cvSh

57、owImage(3、定位焊盘后的彩色图像:, Timag);filename=F:pattern recognation运行结果3、定位焊盘后的彩色图像.jpg;cvSaveImage(filename,Timag);/临时矩阵,存放焊盘CvMat * tmpMat=cvCreateMat(height,width,CV_32FC1);cvZero(tmpMat);/将定位后焊盘位置区域(qy)的数据存放到tmpMat中for(i=0;inum;i+)for ( a=upi;adowni;a+)for( b=lefti;b=righti;b+)cvmSet(tmpMat,a,b,cvmGet(

58、TemMat,a,b);cvConvert(tmpMat,temp); cvNamedWindow(4、定位(dngwi)区域的灰度图:, 1); cvShowImage(4、定位(dngwi)区域的灰度图:, temp);filename=F:pattern recognation运行结果4、定位区域的灰度图.jpg;cvSaveImage(filename,temp);/*/*对定位出的焊盘局部二值化*/IplImage * ImageArray8;/存放焊盘灰度图int Threshold;/阈值for(i=0;inum;i+)ImageArrayi=NULL;for(i=0;inum;

59、i+)CvRect ROI_extract; /创建感兴趣区域ROI_extract.x=lefti;/区域左上角X坐标ROI_extract.y=upi; /区域左上角Y坐标ROI_extract.width=righti-lefti;/区域的宽度ROI_extract.height=downi-upi; /区域的高度/存放感兴趣区域的临时图像IplImage * extractimage=cvCreateImage(cvSize(ROI_extract.width,ROI_extract.height),IPL_DEPTH_8U,1);cvSetImageROI(temp1,ROI_ext

60、ract);cvCopy(temp1,extractimage,NULL);/cvNamedWindow(huidutu,1);/cvShowImage(huidutu,extractimage);/局部大津二值化Threshold=OtsuTrans(extractimage);/大津二值化阈值/二值化for(k=upi;k=downi;k+)for(j=lefti;j=righti;j+)if(cvmGet(tmpMat,k,j)T3)cvmSet(tmpMat,k,j,1);elsecvmSet(tmpMat,k,j,0);cvNamedWindow(5、焊盘区域(qy)的二值化图像:,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论