基于MATLAB的指纹识别系统
基于MATLAB的指纹识别系统
一、 课题介绍
随着网络信息化时代的快速发展,个人身份的数字化和隐性化水平也得到了提高。如何准确鉴定一个人的身份,保护信息安全是当今信息化时代必须解决的一个关键性社会问题。目前,我国的各种管理大部分使用证件、磁卡、IC卡和密码,这些手段无法避免伪造或遗失,密码也很容易被窃取或遗忘。这些都给管理者和使用者带来很大不方便。生物特征身份鉴别方法可以避免这些麻烦。因此,这一技术已成为身份鉴别领域的研究热点。
生物特征识别(BiometriCS)技术是指通过计算机利用人体所固有的生理特征或行为特征来进行个人身份鉴别。生理特征与生俱来,多为先天性的;行为特征则是习惯使然,多为后天性的。这里将生理和行为特征统称为生物特征,用于身份鉴别的生物特征应具有普遍性,即任何人都具有这一特征;唯一性,不同人的这一特征各不相同;稳定性,这一特征不随时间、外界环境等的变化发生改变;可接受性,用这一特征进行人体身份鉴别可以被人们接受和认可;防伪性,这一特征不易仿造、窃取。
二、 指纹识别研究的目的和意义
指纹识别作为一种生物鉴定技术,为人类的个体的定义提供了一个到目前为止最为快捷和可信的方法。随着指纹识别的普及,人们之间的信任成本将大大降低,提高人类社会活动的效率。在信息时代,一种安全便捷的身份认证方式显得越发重要。“在网络上,没有人知道你是一只狗,”在这种情况下,任何基于网络环境下的交往活动都被蒙上了一层技术意义的灰色。不可避免,所有基于这种网络技术基础之上的经济活动也因此被深深打上了不真实和不被信任的烙印。面对如此伟大的技术,人类对它的应用仅仅局限于虚拟网络群落中的狂欢,而不能真正对经济交往模式和效率起到推动作用,实在是遗憾。对于想从事和已经从事网络商务的公司来讲,确认交易人的身份是解决信用问题的第一步,而且是最重要的一步。对于淘宝网来讲,它能做的仅仅是通过身份证注册来保证交易人身份,这样的确是降低了身份冒用的及率,但不能不说这道防线是非常脆弱的。盗用他人身份证到淘宝上注册来骗取货款的案例层出不穷。对于阿里巴巴这样的大型B2B网站,即使他们在授予“诚信通”之前会对企业的注册资料等方面做详尽评估和考察,但是谁又能保证后续的交易者就是企业本身呢?毕竟,“诚信通”不能保证使用者的帐号和密码不会被盗取。这正是电子商务所面临的困境和瓶颈。Paypal已经推出通过指纹识别来进行网络支付。相信随着技术成熟和应用成本降低,除了支付之外的任何网络信任问题都可以指纹识别得到极大改善,从而体高人们在信息时代的行动效率。
从生物测量角度而言,指纹识别将是一种非常理想的工具,用来定位一个人的基本社会坐标原点。作为一个人,具有非常复杂的社会角色。在公司的时候,你可能是产品总监、员工等工作性角色;回到家,你就是丈夫、孩子、爸爸、舅舅、哥哥等血缘性角色;当参加公司年度运动会时,你又是一名长跑运动员。所有这些角色都是基于你的生物测量基础上的。社会公共管理中,必须有一个基础变量来确认一个人的基本身份。在过去的很长一段时间里,我们是通过户籍制度来进行管理和定义一个人的,一个从出生到死亡都是根据其出生地来定义和追溯其身份。这种方式的随意性很大,防伪性比较差,容易引起管理上的漏洞。在现实生活中,有些内地考生为了取得成绩优势,到偏远省份重新办理一套身份系统,包括户口、身份证、档案等。在很多情况下,一个人的真实身份是很难被分辨的。指纹识别作为一个人基本社会角色定位点,其方便性和准确性已经得到了全世界范围内的认可。通过各种各样的指纹识别系统,社会公共管理的职能得到了强化,效率得到了提高。原来的养老保险系统,冒领保险金现象比较严重。随着越来
越多的地方实施了指纹养老金发放系统,这一现象得到了彻底改善,没有当事人的指纹,对应的养老金是不可能被领取的。深圳罗湖口岸,指纹出入境系统的实施大大提高了通关效率,过关旅客再也不需要拿着身份证排长队等待检查。
指纹识别承载了很多的社会意义,从最根本上来讲,是可以良好的判断和定义一个人的真实生物身份。从而降低社会活动中的信任成本,从根本上改变经济和社会交往模式改变,提高效率。指纹识别作为一种生物鉴定技术,为人类的个体的定义提供了一个到目前为止最为快捷和可信的方法。
随着指纹识别技术的日渐成熟,图像处理及模式识别界曾一度认为自动指纹识别问题已经得到很好的解决。但实际上,指纹识别的核心技术仍然存在许多尚
未解决的难题,尤其是对残缺、污损指纹图象进行识别的鲁棒性和适应性方面不
能令人满意。指纹识别系统将随着更小更廉价的指纹输入设备的出现、计算能力
更强更廉价的硬件以及互联网的广泛应用而进一步拓宽应用。其中,能适应在线
应用的自动指纹识别系统的算法有待进一步改进,多种指纹识别方法的集成应用
以及包括指纹识别在内的多种生物特征鉴定技术的集成应用也将是今后研究的
发展方向。因此,自动指纹识别技术现在是,未来几年仍将是一个重要的、极具
挑战性的模式识别研究课题。
三、指纹识别的基本原理
指纹其实是比较复杂的。与人工处理不同,许多生物识别技术公司并不直接存储指纹的图象。多年来在各个公司及其研究机构产生了许多数字化的算法(美国有关法律认为,指纹图象属于个人隐私,因此不能直接存储指纹图象)。但指纹识别算法最终都归结为在指纹图象上找到并比对指纹的特征。
1.指纹的特征
我们定义了指纹的两类特征来进行指纹的验证:总体特征和局部特征。在考虑局部特征的情况下,英国学者E.R.Herry认为,只要比对13个特征点重合,就可以确认为是同一个指纹。
总体特征:总体特征是指那些用人眼直接就可以观察到的特征,包括:基本纹路图案环型(loop),弓型(arch),螺旋型(whorl)。其他的指纹图案都基于这三种基本图案。仅仅依靠图案类型来分辨指纹是远远不够的,这只是一个粗略的分类,但通过分类使得在大数据库中搜寻指纹更为方便。
局部特征:局部特征是指指纹上的节点的特征,这些具有某种特征的节点称为特征点。两枚指纹经常会具有相同的总体特征,但它们的局部特征--特征点,却不可能完全相同。
2.指纹的特征点
指纹纹路并不是连续的、平滑笔直的,而是经常出现中断、分叉或打折。这些断点、分叉点和转折点就称为“特征点”。就是这些特征点提供了指纹唯一性的确认信息。
四、算法流程
指纹识别技术主要涉及四个功能:读取指纹图象、提取特征、保存数据和比对。
系统开始,通过指纹读取设备读取到人体指纹的图象,取到指纹图象之后,要对原始图象进行初步的处理,使之更清晰。接下来,指纹辨识软件建立指纹的数字表示特征数据,一种单方向的转换,可以从指纹转换成特征数据但不能从特征数据转换成为指纹,而两枚不同的指纹不会产生相同的特征数据。软件从指纹上找到被称为(minutiae)的数据点,也就是那些指纹纹路的分叉、终止或打圈处的坐标位置,这些点同时具有七种以上的唯一性特征。因为通常手指上平均具有70个节点,所以这种方法会产生大约490个数据。有的算法把节点和方向信息组合产生了更多的数据,这些方向信息表明了各个节点之间的关系,也有的算法还处理整幅指纹图像。总之,这些数据,通常称为模板,保存为1K大小的记录。无论它们是怎样组成的,至今仍然没有一种模板的标准,也没有一种公布的抽象算法,而是各个厂商自行其是。
最后,通过计算机模糊比较的方法,把两个指纹的模板进行比较,计算出它们的相似程度,最终得到两个指纹的匹配结果。指纹识别系统框图如图2.1所示。
图2.1 指纹识别系统工作原理框图
五、 matlab仿真实验结果与分析
本课题通过matlab仿真软件分别对神经网络指纹识别算法、滤波特征和不变矩指纹识别算法、指纹匹配算法进行仿真实验与分析。
5.1 算法matlab仿真结果
图3.1 原始指纹图像
图3.2 经过神经网络和高斯滤波的指纹图像
图3.3 经过不变矩的指纹图像
图3.4 经过匹配细化后的指纹图像
5.2 结果分析
试验结果显示:
LVQ神经网络模型的优势在于网络结构简单,只通过内部单元的互相作用,就可以完成十分复杂模式识别的分类处理,具有很好的模式识别特性。
滤波特征和不变矩指纹识别算法的优势在于它是基于直接线性变换的,因而无需确定与应用相关的自适应参数。矩技术类型很多,现已被应用于图像分类与识别处理的许多方面。从数学角度上看,矩是很简单的。它的局限性在于无法对特定的目标特性进行精细计算,而且只能被应用于全局目标识别任务中。
指纹匹配算法具有速度快、指纹模板小的优点,但是容易受指纹图像噪声干扰。基于全局特征匹配方式主要使用指纹纹理特征,具有特征稳定、信息丰富的优点,但是匹配精度不高、指纹模板比较大。
六、源代码
function out = go_to_next_element(in, path);
% called by end_track()
% with the input image and the path list, it will track to the next
% connected element of the ridge
[ix,iy] = size(in);
[length, dummy] = size(path);
next_x = 0;
next_y = 0;
flag = 0;
% length is the length of the path
%simply go to the next element
if (path(length,1) <4)
flag = 1;
end;
if (path(length,1) > 197)
flag =1;
end;
if (path(length,2) <4)
flag = 1;
end;
if (path(length,2) > 197)
flag =1;
end;
if flag == 0
[next_x,next_y] = find_next(in,path);
end;
%add it to the path
path(length+1,1) = next_x;
path(length+1,2) = next_y;
out = path;
程序2:
function [out, real_end ] =end_track(in,end_list,branch_list)
% 2/12
% this function will use the input image and the end_list to generate the
% output image ( cleaned ) and the list of real minutiae ( end points )
%
% out --- output image
% real_end --- real minutiae (end points)
% in --- input image
% end_list --- the list of valid and invalid end points
real_end = zeros(1,3);
end_count = 0;
'end_track'
out = in;
[number_of_end, dummy] = size(end_list);
for i=1:number_of_end
%path is a list of the tracked element in the currently
%tracking ridge
path = zeros(1,2);
path(1,1) = end_list(i,1);
path(1,2) = end_list(i,2);
if is_single(path(1,1),path(1,2),out) == 1
%it is a single point (pore) it should be invalid minutia
% and will be removed
out(path(1,1),path(1,2)) = 0;
else
% loop for n times , n > max path length value
flag = 0;
for j=1:25
path = go_to_next_element(in, path);
% check two conditions here
% if any one of the condition match
% break the loop
[len ,ddummy] = size(path);
curr_x = path(len,1);
curr_y = path(len,2);
% three conditions will break the loop.
if is_a_end_point(curr_x,curr_y,end_list) == 1
'---> is a end'
%need to delete it from output image
%
flag = 1;
break;
elseif is_a_branch_point(curr_x,curr_y,branch_list) == 1
'--->is a branch'
%need to delete it from output image
%
flag =1;
break;
elseif curr_x == 0 & curr_y == 0
'---> curr is 0'
flag = 1;
break;
end;
% no break
j
end; %end of the 25 loop
% the path length of the ridge is
% longer than 24 pixels
% it consider as a valid minutia (end points)
% store it in the real_end
if flag == 0
[ path_length, dddd] = size(path);
mean_x = 0;
mean_y = 0;
for k = 1:path_length
mean_x = mean_x + path(k,1);
mean_y = mean_y + path(k,2);
end;
mean_x = mean_x / path_length;
mean_y = mean_y / path_length;
theta = atan2( (mean_x - path(1,1)),(mean_y - path(1,2)) );
end_count = end_count +1;
real_end(end_count,1) = path(1,1);
real_end(end_count,2) = path(1,2);
real_end(end_count,3) = theta;
end;
end; %else%
i
end;