赞
踩
-----------------------------------------------------------------------
指纹图像预处理是指纹识别的前提,它的好坏直接影响到指纹识别的成败,但由于指纹图像降质带来的困难,并根据指纹图像的特征提出了合理的假设,再根据假设提出了增强指纹图像对比度的算法、提取指纹有效区域的算法、根据方向信息分割图像的算法以及去除图像中气泡噪声的算法,这些算法处理效果好,能有效地解决指纹图像的预处理问题。
用Matlab实现这种方法,既能分步对指纹图像预处理算法进行仿真测试,又可以很直观地看到图像预处理算法的效果。实验证明,用Matlab实现的处理结果比较理想,满足识别的应用性。本文介绍用matlab实现了指纹图像的对比度增强、有效区域的选取、指纹图像的二值化、指纹的特征值提取等。并选取较好的处理步骤和算法参数解决指纹图像预处理的问题。
指纹是人类手指末端指腹上由凹凸的皮肤所形成的纹路。指纹能使手在接触物件时增加摩擦力,从而更容易发力及抓紧物件。是人类进化过程式中自然形成的。目前尚未发现有不同的人拥有相同的指纹,所以每个人的指纹也是独一无二[1]。由于指纹是每个人独有的标记,近几百年来,罪犯在犯案现场留下的指纹,均成为警方追捕疑犯的重要线索[2],使得指纹识别技术得到了飞快的发展。现今鉴别指纹方法已经电脑化,使鉴别程序更快更准。
指纹识别技术源于19世纪初,科学家依靠指纹纹脊式样的唯一性和式样终生不改变的特性[7],把某个人同他的指纹对应起来,通过采集他的指纹并与预先保存的指纹进行比较来验证其真实身份。随着现代科技的不断进步与广泛应用,可靠高效的个人身份识别变得越来越需要,每个人的指纹具有惟一性,终身不变,难以伪造,因此指纹识别是替代传统身份识别手段的最安全、最可靠、最方便的方法[1]。指纹图像本身的信息量和数据量是很大的因此直接基于指纹图象的匹配识别是不可取的,而要采用专门高教的指纹识别与处理方法。
指纹识别的一般过程是指纹图象预处理、指纹特征提取和特征匹配。但由于采集设备噪声干扰、指纹采集时手指皮肤的干燥程度、汗渍、污渍等原因使待分析的指纹图像噪声较多并对细节点有较强干扰,影响指纹的特征提取[16]。指纹图像是通过将模拟信号采样量化后,以矩阵形式存入计算机,图像平滑处理指纹图像生成方向数组后,为了消除较强烈的局部噪声干扰,需要对生成的方向数组图像进行预处理。预处理是指纹识别的前提,也是整个工作的基础,因此指纹图象预处理工作的好坏直接关系到指纹特征提取的可行性和准确性。
指纹是手指末端正面皮肤上凹凸不平产生的纹路,这些纹路就是通常所说的脊和谷[4]。指纹虽小,但它蕴涵了大量信息。其中,包括纹型在内的全局特征,为指纹的分类提供了基础;同样,指纹还有许多局部特征(根据美国国家标准局规定,包括脊末梢、分岔点、复合特征和未定义四种),称为细节点(Minutia)。不同人的指纹的细节点是唯一的、稳定不变的,这为指纹识别提供了可能。目前,最常用的方法是用FBI提出的指纹细节点模型来做细节匹配[2]。而最常用的细节特征有脊末梢和分支点两种。
基于点模式匹配的自动指纹识别系统(AFIS)的基本流程一般由图像采集、图像预处理、细节点提取和指纹匹配几部分组成。
首先,指纹要通过指纹采集设备(常见的有光学取像设备、超声波扫描取像设备、晶体传感器,现在广泛使用的是晶体传感器)转化为计算机内的数字图像(一般为灰度图)。由于采集过程中难免因手指或仪器的原因而使图像存在较多的噪声,所以为了使图像更清晰以便于后续特征提取,必须对采集到的图像进行增强和滤波,并进一步二值化、细化[5]。
之后,在细化后的点线图上提取特征值,删除伪特征值,最终得到用于匹配的细节点。采集到的图像细节点与模板中的细节点进行比对,最终完成指纹匹配。各个环节环环相扣,对整个系统都起着十分重要的作用。本文着重研究了图像预处理和细节特征提取这两个关键部分。
而在指纹采集过程中,不可避免的会引入各种噪声,如图像中的叉连、断点等,这些噪声对指纹特征信息的提取造成一定的影响,甚至会产生许多伪特征点。因此在提取指纹特征之前,需要对指纹图像进行滤波处理,以去除无用信息,增强有用信息。在得到增强的灰度图后,需要将其进一步二值化,便于后续过程的处理。指纹图像预处理是去除指纹图像中的噪声,使指纹图像清晰、边缘明显,以便于提高提取和存储特征点的准确率。包括指纹区域检测、图像质量判断、方向图和频率估计、图像增强、指纹图像二值化和细化等[9]。
指纹图像获取是通过专门的指纹采集仪可以采集活体指纹图像。目前,指纹采集仪主要有活体光学式、电容式和压感式。对于分辨率和采集面积等技术指标,公安行业已经形成了国际和国内标准,但其他还缺少统一标准。根据采集指纹面积大体可以分为滚动捺印指纹和平面捺印指纹,公安行业普遍采用滚动捺印指纹。另外,也可以通过扫描仪、数字相机等获取指纹图像。
指纹图像只有脊和谷之分, 因此完全可以由二值图象来描述,也就是指纹图像的二值化。目前指纹的二值化不外乎两种方法[13], 一种是固定门限法, 另一种是动态门限法。固定门限法是对整幅图象用一个灰度门限值, 它对输入图象要求高, 要求整幅图象灰度分布均匀。因此我们把均衡增强后的图象作为它的输入图象。
动态门限法是根据不同区域取不同门限值,一般采用平均域值法。它对输入图象照射要求不高。因此我们把方向性滤波后图象作为输入图象。
指纹图像的细化是找出指纹纹线的轴心线来代替纹线的过程。目前采用的细化方法就是迭代一一轮廓剥离法。每次垒图象扫描迭代一次[8],就剥掉边界象素中不影响连通性的象素,直至纹线宽度为1个象素为止。这样一来,如果被细化的纹线宽度越厚,迭代次数就越多,细化时间就越长,这是我们不希望的。
指纹形态特征包括中心(上、下)和三角点(左、右)等,指纹的细节特征点主要包括纹线的起点、终点、结合点和分叉点。将这些点进行自动选择从而完成指纹形态和细节特征提取的工作[14]。
指纹比对是将可以根据指纹的纹形进行粗匹配,进而利用指纹形态和细节特征进行精确匹配,给出两枚指纹的相似性得分。根据应用的不同,对指纹的相似性得分进行排序或给出是否为同一指纹的判决结果。
在指纹图象处理的流程中,预处理是第一个处理环节.它对原始灰度图像进行平滑、锐化、增强、二值化等处理,从而使细化、特征抽取等操作能够有效进行。
在常见的图象处理技术中,通常按处理目的把预处理过程分为平滑、增强、二值化等步骤。每一步骤都有一些常用算法,如用于平滑的均值滤波法、中值滤波法、迭代加权法等,用于增强的规格化法、自适应算法、拉普拉斯法、Wdlis滤波、Lee滤波等[5]。
经过很长时间的深入研究和反复实践,发现这些常用的算法应用在指纹图象处理中有下列的问题:
(1)这些算法对于指纹图象处理的效果并不理想,尽管从视觉上有一定改善,但对于后续的细化和特征抽取处理效果来看,不能有效地提高特征的准确率。
(2)不能较好地处理指纹的背景部分,严重影响特征抽取和识别。
(3)不能根据指纹图象的质量差别进行特殊处理,通常获得的指纹图象,会有部分区域质量较差,无法抽取特征,在这些算法中,无法找到一个判别标准[5]。
对此,则需要我们对算法原理的进一步了解及改进。
方向图算法正是基于以上特点在80年代初期,就已经开始有把方向图引入到指纹图的一些成功的尝试。这时候所使用的方向图是从二值图中直接提取,得到的处理效果并不完全令人满意。
从1987年开始,B M.Mehtre等人成功地得到了在灰度图上直接获取方向图的有效算法,并陆续提出了一系列的预处理方法来处理指纹灰度图[15]。使用这些算法使指纹图象的处理效果达到了一个新的水平,从而使基于方向图的算法成为指纹图象处理方法研究中的一个热点 在以后的研究中,出现了很多改进和发展,如Kallen Karu等1996 年提出的把方向图用于纹型分类。Linghong等1998年提出的基于方向图的纹线增强等都取得了较好的效果[24]。这使得方向图成为指纹图象处理技术的关键技术之一。
目前的基于方向图的算法中,从灰度图中获取方向图的原理都大体相同,其基本原理是:从图象的灰度矩阵C(I,J)中计算在各个方向上的某个统计量如灰度差或灰度平均等,根据这些统计量在各个方向上的差异,确定在一个小临域内纹线的主方向。针对每象素得到的方向则形成点方向图[23]。为了保持点方向的有效性使用方便,对点方向在一小块内聚类则得到块方向图。
一个高质量的图像被拾取后,需要许多步骤将它的特征转换到一个复合的模板中,这个过程被称为特征拾取过程,它是手指扫描技术的核心。当一个高质量的图像被拾取后,它必须被转换成一个有用的格式。如果图像是灰度图像,相对较浅的部分会被删除,而相对较深的部分被变成了黑色。脊的像素有5~8个被缩细到一个像素,这样就能精确定位脊断点和分岔了。微小细节的图像便来自于这个经过处理的图像[18]。在这一点上,即便是十分精细的图像也存在着变形细节和错误细节,这些变形和错误细节都要被滤除。
除细节的定位和夹角方法的应用以外,也可通过细节的类型和质量来划分细节。这种方法的好处在于检索的速度有了较大的提高,一个显著的、特定的细节,它的惟一性更容易使匹配成功。还有一些生产商采用的方法是模式匹配方法,即通过推断一组特定脊的数据来处理指纹图像。
就应用方法而言,指纹识别技术可分为验证和辨识[20]。
验证就是通过把一个现场采集到的指纹与一个已经登记的指纹进行一对一的比对来确定身份的过程。指纹以一定的压缩格式存储,并与其姓名或其标识(ID,PIN)联系起来。随后在对比现场,先验证其标识,然后利用系统的指纹与现场采集的指纹比对来证明其标识是合法的。验证其实回答了这样一个问题:"他是他自称的这个人吗?"这是应用系统中使用得较多的方法。
辨识则是把现场采集到的指纹同指纹数据库中的指纹逐一对比,从中找出与现场指纹相匹配的指纹。这也叫"一对多匹配"[16]。辨识其实是回答了这样一个问题:"他是谁?"
指纹是人体独一无二的特征,其复杂度足以提供用于鉴别的特征。随着相关支持技术的逐步成熟,指纹识别技术经过多年的发展已成为目前最方便、可靠、非侵害和价格便宜的生物识别技术解决方案,对于广大市场的应用有着很大的发展潜力。
指纹识别键盘现在的计算机应用中,包括许多非常机密的文件保护,大都使用“用户ID+密码”的方法来进行用户的身份认证和访问控制。但是,如果一旦密码忘记,或被别人窃取,计算机系统以及文件的安全问题就受到了威胁[11]。
随着科技的进步,指纹识别技术已经开始慢慢进入计算机世界中。目前许多公司和研究机构都在指纹识别技术领域取得了很大突破性进展,推出许多指纹识别与传统IT技术完美结合的应用产品,这些产品已经被越来越多的用户所认可。指纹识别技术多用于对安全性要求比较高的商务领域,而在商务移动办公领域颇具建树的富士通、三星及IBM等国际知名品牌都拥有技术与应用较为成熟的指纹识别系统,下面就对指纹识别系统在笔记本电脑中的应用进行简单介绍。
众所周知,在两年前就有部分品牌的笔记本采用指纹识别技术用于用户登录时的身份鉴定第一代光学式指纹读取器,但是,当时推出的指纹系统属于光学识别系统,按照现在的说法,应该属于第一代指纹识别技术。光学指纹识别系统由于光不能穿透皮肤表层(死性皮肤层),所以只能够扫描手指皮肤的表面,或者扫描到死性皮肤层,但不能深入真皮层。
在这种情况下,手指表面的干净程度,直接影响到识别的效果。如果,用户手指上粘了较多的灰尘,可能就会出现识别出错的情况。并且,如果人们按照手指,做一个指纹手模,也可能通过识别系统,对于用户而言,使用起来不是很安全和稳定。
因此出现了第二代电容式传感器,电容传感器技术是采用了交替命令的并排列和传感器电板,交替板的第二代电容式传感器形式是两个电容板,以及指纹的山谷和山脊成为板之间的电介质。两者之间的恒量电介质的传感器检测变化来生成指纹图像。但是由于传感器表面是使用硅材料容易损坏,导致使用寿命降低,还有它是通过指纹的山谷和山脊之间的凹凸来形成指纹图像的,所以对脏手指、湿手指等困难手指识别率低。
发展到今天,出现第三代生物射频指纹识别技术,射频传感器技术是通过传感器本身发射出微量射频信号,穿透手指的表皮层去控测里层的纹路,来获得最佳的指纹图像。因此对干手指,汉手指等困难手指通过可高达99%,防伪指纹能力强,指纹敏感器的识别原理只对人的真皮皮肤有反应,从根本上杜绝了人造指纹的问题,宽温区:适合特别寒冷或特别酷热的地区。因为射频传感器产生高质量的图像,因此射频技术是最可靠,最有力有解决方案。除此之外,高质量图像还允许减小传感器,无需牺牲认证的可靠性,从而降低成本并使得射频传感器思想的应用到可移动和大小不受拘束的任何领域中。
指纹识别技术还可以通过几种方法应用到许多方面。可以想象如果计算机上的所有系统和应用程序都可以使用指纹验证的话,人们使用计算机就会非常方便和安全,用户不再讨厌必要的安全性检查,而IT开发商的售后服务工作也会减轻许多。IBM公司已经开发成功并广泛应用的Global Sign On软件通过定义唯一的口令,或者使用指纹,就可以在公司整个网络上畅行无阻。 把指纹识别技术同IC卡结合起来,是目前最有前景的一个方向之一[12]。该技术把卡的主人的指纹(加密后)存储在IC卡上,并在IC卡的读卡机上加装指纹识别系统,当读卡机阅读卡上的信息时,一并读入持卡者的指纹,通过比对卡上的指纹与持卡者的指纹就可以确认持卡者的是否卡的真正主人,从而进行下一步的交易。在更加严格的场合,还可以进一步同后端主机系统数据库上的指纹作比较。指纹IC卡可以广泛地运用于许多行业中,例如取代现行的ATM卡、制造防伪证件(签证或护照、公费医疗卡、会员卡、借书卡等)。目前ATM提款机加装指纹识别功能在美国已经开始使用。持卡人可以取消密码 (避免老人和孩子记忆密码的困难)或者仍旧保留密码,在操作上按指纹与密码的时间差不多。
近年来,自动发送信息的互联网络,带给人们的方便与利益,正在快速增长之中,但也因此产生了很多的问题,尤其在信息安全方面。无论是团体或者个人的信息,都害怕在四通八达的网络上传送而发生有损权益的事情。由于指纹特征数据可以通过电子邮件或其他传输方法在计算机网络上进行传输和验证,通过指纹识别技术,限定只有指定的人才能访问相关信息,可以极大地提高网上信息的安全性,这样,包括网上银行、网上贸易、电子商务的一系列网络商业行为,就有了安全性保障。在SFNB(Security First Network Bank安全第一网络银行)[22],就是通过互联网络来进行资金划算的,他们目前正在实施以指纹识别技术为基础的保障安全性的项目,以增强交易的安全性。
在医院里,指纹识别技术可以验证病人身份,例如输血管理。指纹识别技术也有助于证实寻求公共救援、医疗及其他政府福利或者保险金的人的身份确认。在这些应用中,指纹识别系统将会取代或者补充许多大量使用照片和ID的系统。 总之,随着许多指纹识别产品已经开发和生产,指纹识别技术的应用已经开始进入民用市场,并且发展迅猛,相信这一技术的普及应用已经指日可待。
如果在开始将D的值进行改变,将其变小为5时,可以得到更多的特征值,因为D的改变,将导致特征值点的取值改变,其得到的图像如下图3.10所示:
图3.10与图3.8相比,图3.10中绿色的交叉点跟红色的起始点与终结点都多了一些,而这些多是伪特征点,如3.11所示:
MATLAB实验主程序:
clear all,close all,clc
%% Load image
% The general shape of the fingerprint is generally used to pre-process the
% images, and reduce the search in large databases. This uses the general
% directions of the lines of the fingerprint, and the presence of the core
% and the delta. Several categories have been defined in the Henry system:
% whorl, right loop, left loop, arch, and tented arch. Ö¸ÎÆ·ÖÀàÓÐÖúÓÚ¼õÉÙËÑË÷ËÙ¶È
%
% Most algorithms are using minutiae, the specific points like ridges
% ending, bifurcation... Only the position£¨Î»Öã© and direction£¨·½Ïò£© of these features
% are stored in the signature for further comparison.
I=imread('Empreinte.bmp');
imshow(I)
set(gcf,'position',[1 1 600 600]);
%% EnhancementÖ¸ÎÆÔöÇ¿
% A critical step in automatic fingerprint matching is to automatically and
% reliably extract minutiae £¨Ï¸½ÚÌáÈ¡£©from the input fingerprint images. However, the
% performance£¨ÐÔÄÜ£© of a minutiae extraction algorithm relies heavily on the
% quality £¨ÓëÖ¸ÎÆÖÊÁ¿Óйأ©of the input fingerprint images. In order to ensure that the
% performance of an automatic fingerprint identification/verification system
% would be robust with respect to the quality of the fingerprint images, it
% should be essential to incorporate a fingerprint enhancement algorithm in the
% minutiae extraction module£¨ÐèÒªÔÚÖ¸ÎÆϸ½ÚÌáÈ¡Ä£¿é¼ÓÈëÒ»¸öÔöÇ¿Ëã·¨£©.
%
% In our case, the quality of the image is really good, and we wwon't need
% to enhance our image£¨´Ë´¦Ö¸ÎÆͼÏñ½ÏºÃ£¬¹ÊûÓÐÌí¼ÓÔöÇ¿Ëã·¨£©.
%% Binarize(¶þÖµ»¯)
% We binarize the image. After the operation, ridges in the fingerprint are
% highlighted with black color while furrow are white.¶þÖµ»¯ºó¼¹ÎªºÚÉ«,ÖåñÞΪ°×É«
J=I(:,:,1)>160;
imshow(J)
set(gcf,'position',[1 1 600 600]);
%% Thining(ϸ»¯)
% Ridge thining is to eliminate the redundant pixels of ridges till the
% ridges are just one pixel wide.
K=bwmorph(~J,'thin','inf');
imshow(~K)
set(gcf,'position',[1 1 600 600]);
%% Minutiae(ϸ½ÚÌáÈ¡Ä£°æ)
% We filter the thinned ridge map by the filter "minutie". "minutie"
% compute the number of one-value of each 3x3 window:
% * if the central is 1 and has only 1 one-value neighbor, then the central
% pixel is a termination(Åж϶˵ãµÄ·½·¨).
% * if the central is 1 and has 3 one-value neighbor, then the central
% pixel is a bifurcation(ÅжϷֲæµã·½·¨).
% * if the central is 1 and has 2 one-value neighbor, then the central
% pixel is a usual pixel.
fun=@minutie;
L = nlfilter(K,[3 3],fun);
%% Termination
LTerm=(L==1);%ÖÐÐĵãÅÔ±ßÓÐÒ»¸öµã
imshow(LTerm)
LTermLab=bwlabel(LTerm);
propTerm=regionprops(LTermLab,'Centroid');
CentroidTerm=round(cat(1,propTerm(:).Centroid));
imshow(~K)
set(gcf,'position',[1 1 600 600]);
hold on
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')
%% Bifurcation
LBif=(L==3);
LBifLab=bwlabel(LBif);
propBif=regionprops(LBifLab,'Centroid','Image');%Measure properties of image regions
CentroidBif=round(cat(1,propBif(:).Centroid));%Round to nearest integer
plot(CentroidBif(:,1),CentroidBif(:,2),'go')
%% Remarks
% We have a lot of spurious minutae.
% We are going to process them.
% process 1: if the distance between a termination and a biffurcation is
% smaller than D, we remove this minutiae
% process 2: if the distance between two biffurcations is
% smaller than D, we remove this minutia
% process 3: if the distance between two terminations is
% smaller than D, we remove this minutia
D=6;
%% Process 1
Distance=DistEuclidian(CentroidBif,CentroidTerm);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidBif(i,:)=[];
CentroidTerm(j,:)=[];
%% Process 2
Distance=DistEuclidian(CentroidBif);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidBif(i,:)=[];
%% Process 3
Distance=DistEuclidian(CentroidTerm);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidTerm(i,:)=[];
%%
hold off
imshow(~K)
hold on
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')
plot(CentroidBif(:,1),CentroidBif(:,2),'go')
hold off
%% ROI
% We have to determine a ROI. For that, we consider the binary image, and
% we aply an closing on this image and an erosion.
% With the GUI, I allow the use of ROI tools of MATLAB, to define manually
% the ROI.
Kopen=imclose(K,strel('square',7));
KopenClean= imfill(Kopen,'holes');
KopenClean=bwareaopen(KopenClean,5);
imshow(KopenClean)
KopenClean([1 end],:)=0;
KopenClean(:,[1 end])=0;
ROI=imerode(KopenClean,strel('disk',10));
imshow(ROI)
%%
imshow(I)
hold on
imshow(ROI)
alpha(0.5)
hold on
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')
plot(CentroidBif(:,1),CentroidBif(:,2),'go')
hold off
%% Suppress extrema minutiae
% Once we defined the ROI, we can suppress minutiae external to this ROI.
[m,n]=size(I(:,:,1));
indTerm=sub2ind([m,n],CentroidTerm(:,1),CentroidTerm(:,2));
Z=zeros(m,n);
Z(indTerm)=1;
ZTerm=Z.*ROI';
[CentroidTermX,CentroidTermY]=find(ZTerm);
indBif=sub2ind([m,n],CentroidBif(:,1),CentroidBif(:,2));
Z=zeros(m,n);
Z(indBif)=1;
ZBif=Z.*ROI';
[CentroidBifX,CentroidBifY]=find(ZBif);
imshow(I)
hold on
plot(CentroidTermX,CentroidTermY,'ro','linewidth',2)
plot(CentroidBifX,CentroidBifY,'go','linewidth',2)
%% Orientation
% Once we determined the differents minutiae, we have to find the
% orientation of each one
Table=[3*pi/4 2*pi/3 pi/2 pi/3 pi/4
5*pi/6 0 0 0 pi/6
pi 0 0 0 0
-5*pi/6 0 0 0 -pi/6
-3*pi/4 -2*pi/3 -pi/2 -pi/3 -pi/4];
%% Termination Orientation
% We have to find the orientation of the termination.
% For finding that, we analyze the position of the pixel on the boundary of
% a 5 x 5 bounding box of the termination. We compare this position to the
% Table variable. The Table variable gives the angle in radian.
for ind=1:length(CentroidTermX)
Klocal=K(CentroidTermY(ind)-2:CentroidTermY(ind)+2,CentroidTermX(ind)-2:CentroidTermX(ind)+2);
Klocal(2:end-1,2:end-1)=0;
[i,j]=find(Klocal);
OrientationTerm(ind,1)=Table(i,j);
end
dxTerm=sin(OrientationTerm)*5;
dyTerm=cos(OrientationTerm)*5;
figure
imshow(K)
set(gcf,'position',[1 1 600 600]);
hold on
plot(CentroidTermX,CentroidTermY,'ro','linewidth',2)
plot([CentroidTermX CentroidTermX+dyTerm]',...
[CentroidTermY CentroidTermY-dxTerm]','r','linewidth',2)
%% Bifurcation Orientation
% For each bifurcation, we have three lines. So we operate the same
% process than in termination case three times.
for ind=1:length(CentroidBifX)
Klocal=K(CentroidBifY(ind)-2:CentroidBifY(ind)+2,CentroidBifX(ind)-2:CentroidBifX(ind)+2);
Klocal(2:end-1,2:end-1)=0;
[i,j]=find(Klocal);
if length(i)~=3
CentroidBifY(ind)=NaN;
CentroidBifX(ind)=NaN;
OrientationBif(ind)=NaN;
else
for k=1:3
OrientationBif(ind,k)=Table(i(k),j(k));
dxBif(ind,k)=sin(OrientationBif(ind,k))*5;
dyBif(ind,k)=cos(OrientationBif(ind,k))*5;
end
end
end
plot(CentroidBifX,CentroidBifY,'go','linewidth',2)
OrientationLinesX=[CentroidBifX CentroidBifX+dyBif(:,1);CentroidBifX CentroidBifX+dyBif(:,2);CentroidBifX CentroidBifX+dyBif(:,3)]';
OrientationLinesY=[CentroidBifY CentroidBifY-dxBif(:,1);CentroidBifY CentroidBifY-dxBif(:,2);CentroidBifY CentroidBifY-dxBif(:,3)]';
plot(OrientationLinesX,OrientationLinesY,'g','linewidth',2)
附录2
变量D的定义程序:
function D=DistEuclidian(dataset1,dataset2)
h = waitbar(0,'Distance Computation');
switch nargin
case 1
[m1,n1]=size(dataset1);
m2=m1;
D=zeros(m1,m2);
for i=1:m1
waitbar(i/m1)
for j=1:m2
if i==j
D(i,j)=NaN;
else
D(i,j)=sqrt((dataset1(i,1)-dataset1(j,1))^2+(dataset1(i,2)-dataset1(j,2))^2);
end
end
end
case 2
[m1,n1]=size(dataset1);
[m2,n2]=size(dataset2);
D=zeros(m1,m2);
for i=1:m1
waitbar(i/m1)
for j=1:m2
D(i,j)=sqrt((dataset1(i,1)-dataset2(j,1))^2+(dataset1(i,2)-dataset2(j,2))^2);
end
end
otherwise
error('only one or two input arguments')
end
close(h)
附录3
指纹图像二值化,细化程序:
I=imread('Empreinte.bmp');
subplot(421);
imshow(I);
set(gcf,'position',[1 1 600 600]);
J=I(:,:,1)>160;
subplot(322);imshow(J)
set(gcf,'position',[1 1 600 600])
K=bwmorph(~J,'thin','inf');
subplot(323);imshow(~K)
set(gcf,'position',[1 1 600 600]);
fun=@minutie;
L = nlfilter(K,[3 3],fun);
%LTerm=(L==1);
%subplot(324);
%imshow(LTerm);
LTermLab=bwlabel(J);
subplot(324);
imshow(LTermLab)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。