马飞终稿 指纹识别算法的matlab实现 - 图文

更新时间:2024-06-02 00:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

指纹识别算法的matlab实现

专业:电子信息工程 姓名:马飞 指导老师:刘文博

摘 要 由于指纹所具有的普遍性,唯一性和不变性,以及指纹识别技术具有很高的可行性和实用性,使之成为目前最流行、也最可靠的个人身份认证技术之一。

本文主要对指纹图像进行三方面处理:图像预处理、特征提取和特征匹配。图像预处理包括四个步骤:图像分割、滤波增强、二值化、细化,对指纹图像进行预处理后,去除了原图像的冗余部分,方便后续的识别处理;特征提取主要是提取指纹图像细化后的端点和分叉点;特征匹配是利用两个指纹的图像进行特征点比较,来确定两幅图像是否来自于同一手指。

本文给出了指纹图像预处理、特征提取、特征匹配的matlab程序及处理结果。该结果证明,用matlab实现的这些算法的处理结果比较理想,满足识别的可行性和应用性。

关键词 分割,二值化,细化,特征点提取,匹配,Matlab

1

Abstract

Because of the universality, uniqueness and constantness of a fingerprint, and fingerprint identification technology has very high feasibility and practical applicability, make it to be one of the most popular, and most reliable personal identity authentication technology.

This paper focuses on three aspects of the fingerprint image processing:image preprocessing, feature extraction, feature matching. Image preprocessing including four steps: image segmentation, filtering, binary, Refining, after The fingerprint image preprocessing, in addition to the original image of redundancy part, convenient subsequent identification processing; The main feature extraction is extracted from the end of the fingerprint image after thinning and bifurcation point; Feature matching is use two fingerprint image feature point is to determine whether the two images from the same finger.

This paper provides the fingerprint image preprocessing, feature extraction, feature matching use matlab and handling results, The results prove that these algorithms had ideal results be used by matlab,, Be satisfied with the recognition and feasibility of the application.

Key Words: Segmentation, Binary, Refining, Feature point extracting, Matching,

Matlab

2

目录

第1章 绪论 ................................................................................................................................ 4

1.1 指纹识别概述 ................................................................................................................ 4

1.1.1 研究背景及意义 .................................................................................................. 4 1.1.2 国内外研究状况 .................................................................................................. 4 1.2指纹识别的原理和方法 ................................................................................................. 5

1.2.1 指纹的基本知识 .................................................................................................. 5 1.2.2 指纹识别的原理及应用 ...................................................................................... 7 1.3 Matlab在指纹识别中的应用 ......................................................................................... 8 第2章 指纹图像预处理 ............................................................................................................ 9

2.1图像的分割 ..................................................................................................................... 9

2.1.1 图像归一化 ........................................................................................................ 10 2.1.2 图像分割的方向法 ............................................................................................ 11 2.1.3 图像分割的方差法 ............................................................................................ 12 2.2 图像的二值化 .............................................................................................................. 13

2.2.1 方向图 ................................................................................................................ 13 2.2.2 指纹图像二值化 ................................................................................................ 14 2.2.3 静态阈值二值化 ................................................................................................ 15 2.2.4 基于方向场的二值化 ........................................................................................ 15 2.3 指纹图像的滤波 .......................................................................................................... 17 2.4 图像细化 ...................................................................................................................... 20

2.4.1 快速细化算法 .................................................................................................... 21 2.4.2 改进的OPTA算法 ............................................................................................ 21

第3章 图像特征提取和特征匹配 .......................................................................................... 25

3.1 特征点提取 .................................................................................................................. 25 3.2 找出特征点 .................................................................................................................. 25 3.3 特征点匹配 .................................................................................................................. 26 总结与展望 ................................................................................................................................ 30 致 谢 ...................................................................................................................................... 31 参考文献 .................................................................................................................................... 32 附录A 预处理代码 .................................................................................................................. 33 附录B 特征点提取代码 .......................................................................................................... 37 附录C 图像特征点代码 .......................................................................................................... 39 附录D 特征点匹配代码 .......................................................................................................... 42

3

第1章 绪论

1.1 指纹识别概述

21世纪是信息化时代,在这个特殊的时代,我们的生活中电子设备越来越多,比如,笔记本电脑,ATM取款机,考勤系统,门禁系统和各种智能卡,网络中的网上银行,人人网账号等,都需要验证身份。对个人身份识别技术的要求不断提高,如果没有安全可靠和快捷的身份识别技术,电子商务、网上购物等就存在重大隐患。目前许多身份验证系统都采用“用户名+密码”的方式来进行用户访问控制[1],但此方法存在诸多隐患,比如密码被窃取、破解或遗忘。因此我们在与机器交互时急需一种准确、安全快捷的识别技术来取代现有的身份验证。 1.1.1 研究背景及意义

因为人的一些特殊的生物特征,人们把身份认证技术的目光转向了生物特征的识别技术。生物识别技术是利用人体生物特征进行身份认证的一种技术,它主要有指纹、手形、脸形、声音、虹膜、视网膜、签名、掌纹、和脸部热谱图等,在生物识别技术中指纹识别技术是目前相对成熟的一种。 1.1.2 国内外研究状况

指纹是人特有的一种特征,在中国的研究也有近百年的历史,中国被认为是世界上最早应用指纹识别技术的国家,指纹识别技术从很早以前的人工比对到现如今采用先进的计算机技术实现指纹的识别,使得指纹对比比以前更加准确,识别效率得到了非常大的提高。

在国外,经过几十年的发展,指纹识别技术的软件和硬件相对来说都比

4

较成熟。在很多国家内,政府用法律强制性的规定来保证生物识别技术的应用。所以总体上来说,国外的指纹识别应用己经进入了正规的应用阶段。

但是在国内,经过了十多年的发展,指纹识别的一些关键算法是有了较大的提高和发展,但是距离国外的优秀算法仍然有非常大的差距,因此国内的应用现在处于发展的初期,应用主要集中在自发性的企业上。

指纹识别的应用前景是非常广阔的,它的应用将渗透到社会生活,经济贸易的每一个角落,将成为保护我们个人以及国家信息的重要手段。

1.2指纹识别的原理和方法

1.2.1 指纹的基本知识

指纹是我们各个手指的第一个指节的指头表面突起的脊线;而脊线是手指突起的花脊线条;谷线是两个脊线之间低凹下去的部分;指印是指纹在物体表面留下的痕迹;指纹的细节特征是指纹固有的自身特点。根据指纹中的细节特征我们常将指纹特点分为端点和分叉点,如图1-1所示。

图1-1 端点、分叉点

英国科学家Gallon在1892年的《Fingerprint》一书中提出了指纹的四条基本性质。

(1)确定性:指纹脊线的轮廓和细节特征是在人的一生中基本上保持

5

不变。自胚胎六个月到出生至死亡腐败之前,始终是没有很大变化的。指纹的确定性,还表现在它具有一定的复原性和难于毁灭的特性。

(2)唯一性:由于指纹脊线的连接关系千变万化,因此,即使两个不同的指纹有着相同的轮廓和相同数量的细节特征,它们的细节位置也是不可能完全相同的。

(3)可分类性:指纹可根据脊线和谷线的走向进行分类,一般可分为如图1-2所示的弓形、环形和螺旋形。

(a)弓形 (b) 环形 (c)螺旋形

图1-2 指纹类型

(4)留痕性:指纹接触物体后会留下痕迹。指纹的这个特点,是与手掌表面附着面的污垢的性能紧密相关的。

正是因为这些独特的性质,指纹被国内外的刑侦界称为“证据之首”。一切指纹的自动识别系统,都是根据这些独特的性质,进行身份的识别和确认的。

脊线是指纹的一个非常突出的特征,指纹的脊线一般由弓形线、环形线、箕形线、螺形线、曲形线和棒形线等脊线组成,每种脊线具有不同的细节和长度,如图1-3所示[2]。

6

(a)弓形线(b)环形线(c)箕形线(d)螺形线(e)曲形线(f)棒形线

图1-3 脊线的一般形态

1.2.2 指纹识别的原理及应用

在指纹识别的技术中, 一般都采用总体特征和局部特征来进行识别。总体特征是那些很容易就能看出来的非常明显的特征, 局部特征则是一小块指纹中的细节特征。指纹纹路一般都会有断点和分叉点, 因此会形成一些独特的节点。根据研究,两个指纹的总体特征有时候会很相似,但是局部特征是不会相同的,即没有两个指纹的纹路是相同的。英国学者E.G.Herry认为, 只要有13个特征点能重合, 就可以确认这两枚指纹是同一指纹[3]。指纹的面积虽然不大但却蕴含着大量的识别信息。这些皮肤的纹路会在交叉点,断点上有很大的区别。在指纹识别的过程中将其称为“特征点”,利用特征点的性质,我们可以把一个人的指纹同预先存储起来的指纹模版对比来验证他的真实身份。

指纹识别技术主要包括三大部分:指纹图像采集、指纹预处理、特征提取与匹配。如图1-4所示。

7

指纹预处理指纹图像采集增强滤波指纹特征提取指纹匹配匹配结果

分割二值化细化图1-4 指纹识别流程 指纹作为人类与生俱来的特征,因为其独有的特性而成为具有法律地位的有力证据。一切需要身份确认的场所,都有它的踪影,如金融证券类的ATM指纹终端、指纹保险箱等、IT类的计算机的系统密码验证、网络安全等、安防类的门禁系统等、医疗类的个人医疗档案验证等、福利类的医疗确认、福利确认等,因此指纹识别在许多行业的应用系统中都具有广阔的应用前景。

1.3 Matlab在指纹识别中的应用

Matlab是一种高级的计算机语言, 具有独特的数学运算能力是matlab语言最突出的优点。许多在其他语言中描述起来很复杂的问题在matlab语言编程中却只需要一条专用的指令就可以完成。Matlab语言的所有计算都是基于矩阵的,所以matlab中的所有变量都被定义为矩阵, 它是一种解释型语言, 因此几乎没有语法格式上的限制。基于matlab实现指纹图像算法及仿真验证不仅有较高的准确率, 而且减小了仿真难度。

8

第2章 指纹图像预处理

图像预处理是对原始图像进行的一种前期处理,方便后续的模块识别。无论采用何种方式获取的指纹图像, 都有一部分由于质量原因, 不能被系统直接识别,因此图像的预处理就显得非常有必要。

指纹图像的预处理目的就是将自己感兴趣的目标区域保留下来,去除背景区域和没有用的部分,同时根据指纹目标区域中脊线的结构特征,采取较好的滤波方法,提高指纹脊线清晰度,平滑脊线边缘的毛刺和空洞,抑制图像噪声,保证指纹特征的可靠提取,并使灰度图像转化成黑白的二值图像,最终得到脊线结构清晰的单像素宽的二值图像。本文预处理的主要流程如图2-1所示。

指纹分割二值化滤波增强细化 图2-1 预处理流程

2.1图像的分割

图像分割是从一幅图像中按一定规则将一些物体或区域加以分离,划分出我们感兴趣的部分或区域。经过分割后的图像更容易进行进一步的分类、分析和识别处理。图像分割要在指纹二值化和滤波及细化之前进行,如此可以减少计算的冗余量,提高指纹检测速度。

采集到的指纹内容分为目标区域和背景区域。在指纹图像中,由脊线和谷线组成的较清晰的部分,称之为目标区域;没有用的部分我们称之为背景

9

区域。指纹识别中的分割就是将有用的目标区域分割出来,去掉没用的背景区域,以避免背景区域的各种干扰。指纹图像可分为四类区域:背景区、不可恢复区、可恢复区、清晰区,如下图2.2所示。

背景区清晰目标区不可恢复区可恢复区

图2-2 指纹图像的四种区域

2.1.1 图像归一化

对指纹图像进行分割处理,消除剩下的背景区域前,首先要进行图像归一化。

对采集好的指纹图像进行归一化处理,是对指纹灰度图的灰度均值和方差做一次调整,使得不论用什么设备采集的指纹图像都可以有预期的方差和均值,从而屏蔽不必要的噪声。指纹归一化不改变指纹质量,只是方便指纹的后续处理并保证程序运行时收敛加快。

由于不同指纹区域的手指压力和强度不同,所以将指纹分为W*H小块,设图像中像素点的灰度值为I(i,j),归一化后的图像G(i,j)来表示,灰度平均值和方差分别用Mi和Vi来表示,则归一化算法如下[4]:

(1)先计算出图像灰度的平均值和方差:

1 Mi?WH ??I(i,j) (2-1)

i?0j?0H?1W?1 10

图 2-6 一个像素处的8个指纹脊线方向

我们先对分割后的图像进行了平均滤波,然后对图像的每一个像素,为确定在该像素处的脊线方向,在以该像素为中心的9*9窗口内,分别计算8个方向上的经过处理后的灰度值,即将图2-6中数字1到8的位置的像素灰度值去除其中最大summax和最小值summin,若满足最大的summax和最小的summin与 4*I(x,y))之和大于 (3*summ/8),则该像素点的脊线方向为summin,否则为summax.确定完脊线方向后再由该方向场对图像进行二值化。

二值化的matlab程序见附录A。结果如下:

图 2-7 指纹二值化

16

2.3 指纹图像的滤波

一个优秀的指纹识别系统不仅需要高的识别准确度,还需要高的识别速度,而影响识别速度的最主要因素就是指纹图像的滤波,而滤波的好坏直接因素是增强滤波的算法,当然跟所使用的软件和硬件也有很大的关系。

图像在当前的采集设备条件下,不可避免的会受到环境和自身因素的影响,指纹图像质量低的主要原因有:(1)存在擦伤或创伤的伤痕所引起的脊线中断或变的不清晰;(2)指纹干燥所引起指纹图像印痕模糊,导致脊线和谷线的对比度比较差;(3)污渍导致指纹图像的脊线或谷线粘连和断裂。

这些图像噪声对后续的指纹提取带来很大的困难,因此必须要在指纹二值化和细化之前进行图像增强滤波,图像增强的目的:减弱原始图像的噪声,增强脊线和谷线的对比度,即修补指纹图像脊线中断裂的部分,去除指纹图像中脊线或谷线的叉连部分,从这些原指纹图像中尽可能多的获取清晰的指纹纹路结构,以保证指纹提取的可靠性。指纹图像的增强滤波有很多的算法,本文就一种图像滤波器算法进行阐述。

上下文滤波器:

该算法也是基于脊线纹路和纹理的方向图的,但是这种算法比较简单且效果良好,使用时用的滤波器要根据具体的某一块指纹脊线的方向从一系列的滤波器中选择一个合理的滤波器来对要进行滤波的指纹进行滤波,其它块的指纹图像滤波则可以通过已用过的滤波器旋转得到。一个基本增强滤波器主要由可将脊线中的断点连接起来的平均滤波器和可将脊线分叉点去除的分离滤波器组成。

17

指纹图像中脊线的一个周期(即一脊一谷)可以决定增强滤波器的大小,一般地周期T=5,本文中选择5*5的滤波器,平均滤波器在水平方向上的权值可以用下图2-8来表示。

图 2-8 平均滤波器水平方向权值 图 2-9 分离滤波器水平方向权值

(其中A>B>C>=0;P+2Q+2R=0)。

二值化后的指纹图像通过平均滤波器的处理,其每一点灰度值由它临近的二十四个(因为是5*5的滤波器)像素的灰度值决定,因此可以用下式来对f(i,j)(第i行和第j列的灰度值)进行处理[9]:

f?i,j??m??2?C?f?i?2,j?m???B?f?i?1,j?m???A?f?i,j?m?

m??2m??22222 ??B?f?i?1,j?m??m??2m??2?C?f?i?2,j?m? (2-6)

2平均滤波的原理如下:对于脊线中的断点我们采用平均滤波器。断点处脊线的灰度值要比周围的灰度值小,经过平均滤波器的处理,它的灰度值就大约等于周围的灰度值,因此二值化后的指纹中断裂的脊线就会被连起来。

对于脊线中的分叉点我们采用分离滤波器。脊线中叉连点的两端灰度值比中间的要稍微大一些,经过分离滤波器的处理,叉连点处的灰度值就会降下来,脊线中的叉连点就会被去除了。脊线的断裂和叉连点如图2-10所示:

断裂脊线

原脊线18

叉连脊线原脊线

图2-10 断裂与叉连

因此选择增强滤波器的时候必须要具有类似平均滤波器和分离滤波器作用的增强滤波器,分离滤波器的权值可以用下图2-9来表示,并且可以得到一般滤波器的权值如图2-11。

图 2-11 上下文滤波器的权值

参数满足K =A+P,L =B+Q,M =C+R。

上下文滤波器中的平均滤波器起到了去除空洞的作用,分离滤波器起到了去除毛刺的作用。

算法实现的matlab程序见附录A。 结果如图2-12和图2-13:

图 2-12 去除毛刺

19

图 2-13 去除空洞

2.4 图像细化

分割和滤波后的指纹图像再进行二值化处理后,脊线仍然有一定的宽度,指纹识别的匹配是只利用图像的点或线的特征,这些点或者特征只与脊线的走向或者纹理有关系,有一定宽度的二值化图像显得有些多余,所以需要对二值化图像进行细化处理,指纹二值化图像经过细化处理即可得到一个单一像素宽度的脊线,经过上述的细化处理,在后续的指纹特征提取和特征匹配的算法中大大的减少了计算的冗余量和出错率,使得指纹识别的速度和准确度有了很大的提高。

细化目的是在不破坏指纹图像连通性的情况下去除掉多余的信息(即多余的像素点),将二值化的指纹图像的脊线采用逐层剥离的方法,将图像中的指纹脊线细化成单象素宽(实际为保存原图的骨架)。一个好的指纹细化算法必须在不破坏指纹纹理性和连通性的情况下细化成单像素脊线。总体来说,细化算法应满足(1)尽量保持原图像的基本机构特性(如脊线的形态);(2)尽量以脊线的中轴线或者指纹的中心为重心;(3)从指纹脊线的两面

20

(1)single_point函数

经过去除边缘端点的操作后进一步减少了指纹细化图像中的端点和交叉

点的个数。下面就需要找出一些在细化图像中比较独特的端点来作为识别的特征点。在一幅细化的指纹图像中,如果在一个像素(该像素为端点)的周围半径为r(r为像素的个数)的圆内没有任何的端点或者交叉点,那么随着r的逐渐增大,这样的点就会越来越少,因此该点也就越来越独特。于是我们设计了一single_point函数来找出这样独特的点。

(2)walk函数

为了进一步找出特征点,我们还需定义一walk函数,它的主要作用就是判断某一端点在num的距离内是否还有其他的端点。

(3)last1函数

single_point函数和walk函数都是找细化图像特征点的函数,因此可以设计另一个新的last1函数,通过执行

[pxy3,error2]=last1(thin,r,txy,num)

可以找出一端点以r为半径的像素内的任何端点和交叉点且沿着脊线走向的num内没有任何的其他端点和交叉点。

3.3 特征点匹配

由上文的函数可知,已经找出了指纹细化图像中的特征点,并画出了一段独特的脊线,在图像中用红色来标示。下面就是指纹匹配[12]的问题了。在此我们设置了三层匹配。

(1)脊线长度匹配

对于上面的函数即可找出细化图像中的特征点和一段脊线,沿着该段脊

26

线走向,每隔五个像素测量一下,看到到原始端点的距离,此段距离由一distance函数得到。

函数结果会得到一数组(内有脊线的长度信息)。如果两幅指纹细化图像中的纹路是相同的,则它们就包含相同的端点和交叉点及用distance函数找出的相同的一段脊,则这两个指纹图像中的长度数组对应的位置比例会基本相等(我们选择的指纹图像大小基本相等,因此该比例选1),因此函数最终定义了一个数f=(sum(abs((d1./d2)-1))),其中若f的值越接近于0,这两幅图像的匹配度就越高,在一定范围的阈值内我们可以认定为匹配。

(2)三角形边长匹配

找到一个指纹细化图像的特征点后,可以找出距离这个端点距离最近的两个端点或者交叉点,与这个指纹图像细化的特征点构成一个三角形,若两幅图像中的边长比例基本相等(原理同上,也选1),则说明这两幅图像匹配,越接近于1说明这两幅指纹图像越匹配。其中设置一find_point函数来找出距离最近的端点或交叉点。

函数最后定义了一个数ff=(sum(abs((dd1./dd2)-1))),因此ff值越接近于0,这两幅指纹图像的匹配度越高,在一定范围的阈值内我们可以认定为匹配。

(3)点类型匹配

找到一个指纹细化图像的特征点后,在该端点周围找到四十个端点或者交叉点,统计在这四十个特征点中端点的个数和交叉点的个数。若有两幅指纹细化图像中的端点所占的比例近似相同,则两幅图像相匹配,越近似,则越相同。函数最终定义了一个数fff=abs(f11-f21)/(f11+f12),所以fff值越接近

27

于0,这两幅指纹图像的匹配度就会越高。我们也设定一阈值,在此阈值内都可以认定为匹配。

本文中取r=8,num=60,经过试验,得到f的阈值为0.5,ff的阈值为1.5,fff的阈值为0.2。即两幅图像的f,ff,fff若均小于阈值,则两幅图匹配;若三个值中有至少一个值大于阈值,则不匹配。验证如下: 一、选择两幅图:zhiwen.bmp和zhiwen5.bmp来验证

图 3-1(a) 输出的时间

图 3-1(b) 特征匹配

通过以上的f,ff,fff和阈值的比较说明zhiwen.bmp和zhiwen5.bmp匹配,为同一手指的指纹,匹配时间为12.514525秒。 二、选择两幅图:zhiwen.bmp和zhiwen2.bmp来验证

28

图 3-2(a) 输出的时间

图 3-2(b) 特征匹配

通过以上的f,ff,fff和阈值的比较说明zhiwen.bmp和zhiwen2.bmp不匹配,为同一手指的指纹,匹配时间为12.728871秒。

29

总结与展望

该论文是在前人研究的基础上,参阅了部分资料,并在刘文博老师的指导下认真完成的,文中主要对指纹图像预处理的各个步骤做了较为详细的讨论,并用matlab加以仿真和验证。

论文中的算法基本上能够实现指纹识别的预期目的,但是由于毕业设计的时间较短以及我的知识面的限制,有许多问题的考虑还不全面,有待于进一步完善。

本文中主要对图像预处理进行了分析比较,最后得到了一套比较合适的算法,但通过实验验证可发现比对时间比较长,有待于进一步改进。在指纹特征点的提取和匹配的过程中,均设置了一个函数来实现算法,实现的过程的时间也相对较长,也可以用其他的语言来实现。

30

Im=zeros(m,n); for x=5:m-5; for y=5:n-5;

sum1=I(x,y-4)+I(x,y-2)+I(x,y+2)+I(x,y+4);

sum2=I(x-2,y+4)+I(x-1,y+2)+I(x+1,y-2)+I(x+2,y-4); sum3=I(x-2,y+2)+I(x-4,y+4)+I(x+2,y-2)+I(x+4,y-4); sum4=I(x-2,y+1)+I(x-4,y+2)+I(x+2,y-1)+I(x+4,y-2); sum5=I(x-2,y)+I(x-4,y)+I(x+2,y)+I(x+4,y);

sum6=I(x-4,y-2)+I(x-2,y-1)+I(x+2,y+1)+I(x+4,y+2); sum7=I(x-4,y-4)+I(x-2,y-2)+I(x+2,y+2)+I(x+4,y+4); sum8=I(x-2,y-4)+I(x-1,y-2)+I(x+1,y+2)+I(x+2,y+4); sumi=[sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8]; summax=max(sumi); summin=min(sumi); summ=sum(sumi); b=summ/8;

if (summax+summin+ 4*I(x,y))> (3*summ/8) sumf = summin; else

sumf =summax; end

if sumf > b Im(x,y)=128; else

Im(x,y)=255; end end end for i=1:m

for j =1:n

Icc(i,j)=Icc(i,j)*Im(i,j); end end

for i=1:m for j =1:n

if (Icc(i,j)==128) Icc(i,j)=0; else

Icc(i,j)=1; end; end end

figure,imshow(double(Icc));title('二值化');

%************************************************************************

36

u=Icc;

[m,n]=size(u) %去空洞和毛刺 for x=2:m-1 for y=2:n-1 if u(x,y)==0

if u(x,y-1)+u(x-1,y)+u(x,y+1)+u(x+1,y)>=3 u(x,y)=1; end

else u(x,y)=u(x,y); end end end

figure,imshow(u) %title('去毛刺') for a=2:m-1 for b=2:n-1 if u(a,b)==1 if

abs(u(a,b+1)-u(a-1,b+1))+abs(u(a-1,b+1)-u(a-1,b))+abs(u(a-1,b)-u(a-1,b-1))+abs(u(a-1,b-1)-u(a,b-1))+abs(u(a,b-1)-u(a+1,b-1))+abs(u(a+1,b-1)-u(a+1,b))+abs(u(a+1,b)-u(a+1,b+1))+abs(u(a+1,b+1)-u(a,b+1))~=1 %去空洞

if(u(a,b+1)+u(a-1,b+1)+u(a-1,b))*(u(a,b-1)+u(a+1,b-1)+u(a+1,b))+(u(a-1,b)+u(a-1,b-1)+u(a,b-1))*(u(a+1,b)+u(a+1,b+1)+u(a,b+1))==0 %去毛刺 u(a,b)=0; end end end end end

figure,imshow(u) %title('去空洞')

%************************************************************************* v=~u;

se=strel('square',3); fo=imopen(v,se);

v=imclose(fo,se); %对图像开操作和闭操作 img=bwmorph(v,'thin',Inf); %对图像进行细化 figure,imshow(img) title('细化图')

附录B 特征点提取代码

function j = P (img, x, y, i) switch (i)

case {1, 9}

j = img(x+1, y);

37

case 2

j = img(x + 1, y-1); case 3

j = img(x, y - 1); case 4

j = img(x - 1, y - 1); case 5

j = img(x - 1, y); case 6

j = img(x - 1, y + 1); case 7

j = img(x, y + 1); case 8

j = img(x + 1, y + 1); end

%point函数

function txy=point(thin) count = 1;

txy(count, :) = [0,0,0];

siz=min(size(thin,1),size(thin,2)); for x=40:siz - 40

for y=40:siz - 40 if (thin(y, x) )

CN = 0; for i = 1:8

CN = CN + abs (P(thin, y, x, i) - P(thin, y, x, i + 1)); end if (CN == 2)

txy(count, :) = [x, y,2]; count = count + 1; end

if (CN == 6)

txy(count, :) = [x, y,6]; count = count + 1; end end end end

for i=1:count - 1 x(i) =txy(i, 1); y(i)= txy(i, 2);

38

end

imshow(double(thin)); hold on; plot(x,y,'.'); %cut函数

function txy=cut(thin,txy) s(8,8)=0; delta(8,8)=0; n=size(txy,1); for i=1:8 for j=1:8

mp{i,j}=thin(1+31*(i-1):31+31*(i-1),1+31*(j-1):31+31*(j-1)); s(i,j)=sum(sum(mp{i,j}))/(31*31); mp{i,j}=(mp{i,j}-s(i,j)).^2; delta(i,j)=sum(sum(mp{i,j})); if delta(i,j)<=70 for k=1:n if

(txy(k,1)>=1+31*(i-1)&&txy(k,1)<=31+31*(i-1)&&txy(k,2)>=1+31*(j-1)&&txy(k,2)<=31+31*(j-1)&&txy(k,3)==2)

txy(k,:)=[0,0,0]; end end

end end end

txy=txy(find(txy(:,1)),:); plot(txy(:,1),txy(:,2),'ro');

附录C 图像特征点代码

%single_point函数

function [pxy2,error]=single_point(txy,r) error=0; x=txy(:,1); y=txy(:,2); n=length(x); d(1:n,1:n)=0;

39

for j=1:n

for i=1:n if (i~=j)

d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2); else

d(i,j)=2*r; end end end

[a,b]=min(d); c=find(a>r);

pxy2=txy(c,:);

pxy2=pxy2(find(pxy2(:,3)==2),:); t=size(pxy2,1); if t==0

error=1 else

plot(x,y,'b.'); hold on

plot(pxy2(:,1),pxy2(:,2),'r.'); end

%walk函数

function [error,a,b]=walk(thin,x0,y0,num) error=0;

thin(y0,x0)=0; t1=0;

for n=1:num if error==1

break; else

x=x0; y=y0;

for x=x0-1:x0+1 if error==1 break; else

for y=y0-1:y0+1

t1=sum(sum(thin(y0-1:y0+1,x0-1:x0+1))); if (t1==0||t1>=2)

40

本文来源:https://www.bwwdw.com/article/43n6.html

Top