一、指纹识别简介

0 引言
随着社会的发展,钥匙、证件、银行卡以及用户名密码等这些鉴定身份的标志性物品和标识的安全性越来越弱,很容易被伪造、被盗用、不小心丢失等,给人们带来了极大的困扰,如何才能更好的保护个人信息成为当今时代一个很重要问题。随着网络和计算机应用技术的发展,人们逐渐将目光转向当下的一个新型识别热点,即生物特征识别技术。现在应用较多的生物特征识别技术有人脸识别、声音识别、虹膜识别以及指纹识别等等。本设计主要研究指纹识别系统。

指纹识别技术相对于声音识别、人脸识别而言,是一种使用时间比较久的生物识别技术。指纹具有不变性、唯一性、普遍性、可采集性和可储存性等特性。目前,指纹识别技术已经被人们应用在各大领域之中,除了大众熟知的刑事侦查外,还有公司企业指纹打卡考勤系统、住户安装指纹门锁、电脑开机或手机屏幕解锁的身份确认等生活的各个方面。

1 指纹识别系统的构成
指纹识别系统主要由指纹数字图像采集、指纹预处理、指纹特征提取和匹配这4个部分组成。首先,通过指纹采集设备完成指纹图像的采集;其次,进行预处理操作,把指纹图像变成一幅清晰的点线图,进而方便提取指纹图像的特征点;最后,将指纹图像进行匹配,判断这两者是否来自同一根手指。指纹识别系统的组成框图如图1所示。

图1 指纹识别组成框图

2 指纹识别系统的实现
2.1 指纹图像的采集
较为常用的指纹图像采集技术有:(1)光学指纹采集技术,通过光的全反射采集指纹表层纹理图像,是最早使用的一种采集技术,性价比高,使用较多;(2)超声波扫描,它是利用手指表皮和空气对声波的阻抗之间有差异这一特点进行设计;(3)电容式传感器,根据指纹图像中嵴线和谷线与半导体感应颗粒之间形成的电容值大小不同进行设计。

2.2 指纹图像的预处理
对指纹图像进行预处理,是为了能够将模糊的指纹图像经过处理之后得到一幅清晰的图像。指纹图像的预处理是指纹识别系统中后续特征提取和匹配的基础,其处理结果更是直接影响指纹识别的最终效果。对指纹图像进行预处理的过程一般分为以下几部分。

第一,对指纹图像进行灰度处理和归一化处理。其中,灰度处理是为了简化图像信息,一幅彩色图像,经过灰度处理后只剩下一个灰度值,去除了彩色信息。对指纹图像进行归一化处理的原因是采集到的指纹图像会因为按压不均等原因导致图像嵴线和谷线变化大,后续的指纹处理可能发生错误。

第二,图像分割,将目标指纹从采集到的指纹图像中分割出来,也就是指将指纹和背景范围进行分离。如果不进行图像分割,在提取指纹特征信息点时,会提取到很多没有用的特征点,增加难度,降低了最终匹配的精确度。

第三,对指纹图像二值化,将指纹图像变成只有0和1两个像素值的图像。其中,将指纹图像中并非是嵴线区域的像素点全部置为0,嵴线所在部分的像素点全部置为1。

第四,对指纹图像进行增强处理。要分离粘连的纹线,平滑纹线的边缘等等,以保证指纹特征提取的可靠性。

第五,进行细化处理,提取指纹图像中嵴线的框架,突出纹线的有效特征,为后面的特征提取做准备。

2.3 指纹图像特征提取
2.3.1 指纹图像特征点提取
指纹数字图像的特征分为全局特征和局部特征这两种,其中局部特征包含端点、分叉点、孤立点等。由于局部特征更能够分辨出两个指纹是否来自同一个人,因此对指纹图像的局部特征进行特征点提取。

指纹图像特征点提取又可分为特征点提取和去除伪特征点两个部分。常用的提取特征点的方法有两种,一种是直接在灰度处理后的指纹图像中提取所需的特征信息点,该方法省略了对指纹图像的一系列预处理操作,此方法需要极为清晰的指纹图像,在现实生活中很难有这样完美的指纹图像供提取特征点,所以很少采用这种方法;另一种则是在经过二值细化后的指纹图像中提取指纹的特征点,虽然前面要经过繁琐的预处理,但是最终提取到的特征信息点会比较精确。

从二值化细化后的图像中提取特征点,具体的方法是:建立一个3×3的模板,中心的P是待测像素点,而P1~P8是待测像素点P的8个邻域像素点,记Cn§为8个邻域像素点的灰度值从0变到1或者是从1变到0的次数,计算公式下式所示:

式中,P9=P1。

记Sn§为8个邻域像素点中灰度值为1的像素点的个数,计算公式如下式所示:

通过计算Cn§和Sn§的大小,来分析像素点P的状态,一般分为以下几种情况:(1)如果像素点P是嵴线上的一个点,并根据计算出Cn§=2和Sn§=1可知,像素点P是嵴线上的一个端点;(2)如果像素点P是嵴线上的一个点,并根据计算出Cn§=4和Sn§=1、2或者4可知,像素点P是嵴线上的一个连续点;(3)如果像素点P是嵴线上的一个点,并根据计算出Cn§=6和Sn§=3可知,像素点P是嵴线上的一个分叉点。

检测处理完成一幅二值化细化后的指纹图像,并按照上述方法算出所有检测出的端点和分叉点,作为特征点提取的结果。

2.3.2 指纹图像去伪
由于设备采集或者手指本身的原因,使指纹图像可能存在一些伪特征点,比如毛刺、空洞、断裂、短脊以及假桥等。这些伪特征点会大大的影响指纹匹配的速率,甚至降低指纹匹配的准确率,因此在指纹识别提取特征点的过程中还要对指纹进行去伪操作。

指纹图像特征信息点去伪采用的方法[9,10]:首先,特征提取,辨别它们是伪特征点还是真的特征点;其次,将指纹图像的细节点作为起始点,逐步搜索周围的区域,并判断这些特征点的真伪,其中分叉点不能和其他分叉点或者端点相连,端点也不能和其他的细节点相对;最后,判别特征信息点的真伪性之后将指纹数字图像中的所有伪特征点删除,并保留真特征点,每种伪特征信息点的去除都有其相对应的算法。

经过对指纹图像进行特征提取和去伪操作,细化后的指纹图像上的伪特征信息点被删除,提高了图像的质量。

2.4 指纹图像匹配
指纹匹配是指纹识别系统的最后一步,该步骤是输入两幅需要匹配的指纹数字图像,经过前面一系列的预处理和特征点信息提取操作之后进行比较,来确定这两幅指纹图像是否属于同一根手指。指纹图像的匹配算法有以下两种。

2.4.1 基于点模式的指纹匹配算法
先寻找到指纹图像的中心点,将它标记为极坐标的原点,其次建立极坐标系,并选择特征信息点,将其用极坐标(r,e)表示,最后用φ表示特征信息点的方向。设指纹参考方向为θc,参考点在极坐标系中的坐标为(r,e),在直角坐标系中的坐标为(xc,yc),r、e、φ的计算公式分别如下式所示:

观察式(3)、式(4)、式(5)可以得出:不管指纹图像是发生平移还是旋转,指纹的特征点的特征信息都不会因此有其他变化。虽然在最终匹配的过程中,无法做到非常精确的点对点的匹配,但是一般而言只要匹配的两个点在预先设定的阈值内就可判定为匹配成功。

2.4.2 基于指纹纹线的匹配算法
该方法是将两个指纹图像放在一起比较,寻找端点和交叉点这两种特征点,并找出最佳匹配点对,根据匹配到的个数来确定是否来自同一根手指。该算法的步骤是先从指纹图像中提取出一个特征点Ok,将它用直角坐标表示为(xk,yk),用φk表示该特征点所在嵴线的方向角;Ok与指纹图像中其他任何特征信息点Oi相连,可增加4个特征向量,即Ok与Oi之间的相对距离dki、两特征点之间的嵴线数量nki、特征点Ok所在嵴线的方向角φk与两点连线之间的夹角θki和Ok与Oi所在嵴线的方向差φki,可以计算出新增的特征向量,如式(6)、式(7)、式(8)所示:

如果两幅待匹配的指纹图像新增特征向量的几个参数之差小于设定的误差,则认为指纹匹配成功,反之不成功。

二、部分源代码

function varargout = Fingerprint_gui(varargin)
%FINGERPRINT_GUI M-file for Fingerprint_gui.fig
%      FINGERPRINT_GUI, by itself, creates a new FINGERPRINT_GUI or raises the existing
%      singleton*.
%
%      H = FINGERPRINT_GUI returns the handle to a new FINGERPRINT_GUI or the handle to
%      the existing singleton*.
%
%      FINGERPRINT_GUI('Property','Value',...) creates a new FINGERPRINT_GUI using the
%      given property value pairs. Unrecognized properties are passed via
%      varargin to Fingerprint_gui_OpeningFcn.  This calling syntax produces a
%      warning when there is an existing singleton*.
%
%      FINGERPRINT_GUI('CALLBACK') and FINGERPRINT_GUI('CALLBACK',hObject,...) call the
%      local function named CALLBACK in FINGERPRINT_GUI.M with the given input
%      arguments.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help Fingerprint_gui% Last Modified by GUIDE v2.5 03-Jan-2022 18:00:46% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @Fingerprint_gui_OpeningFcn, ...'gui_OutputFcn',  @Fingerprint_gui_OutputFcn, ...'gui_LayoutFcn',  [], ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end% End initialization code - DO NOT EDIT% --- Executes just before Fingerprint_gui is made visible.
function Fingerprint_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   unrecognized PropertyName/PropertyValue pairs from the
%            command line (see VARARGIN)% Choose default command line output for Fingerprint_gui
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes Fingerprint_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = Fingerprint_gui_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes when figure1 is resized.
function figure1_ResizeFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% --- Executes on button press in BW.
function BW_Callback(hObject, eventdata, handles)
% hObject    handle to BW (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
I = handles.OriginalImage;
level = graythresh(I);
BWimg = im2bw(I, level);
handles.BWimg=BWimg;
set(handles.Thining,'enable','on');
axes(handles.axes2);
% set(gca,'NextPlot','add');
hImg_BW=imshow(BWimg);
handles.hImg_BW=hImg_BW;
set(hImg_BW,'ButtonDownFcn',{@ImgButtonDown,handles});
guidata(hObject,handles);% --- Executes on button press in Thining.
function Thining_Callback(hObject, eventdata, handles)
% hObject    handle to Thining (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global addenable;
addenable=0;
J = handles.BWimg;
Thin_img=bwmorph(~J,'thin','inf');
axes(handles.axes2);
hImg_T=imshow(~Thin_img);
handles.Thin_img=Thin_img;
handles.hImg_T=hImg_T;
set(hImg_T,'ButtonDownFcn',{@Img1ButtonDown,handles});
set(handles.endpoint,'enable','on');
set(handles.bifurcation,'enable','on');
guidata(hObject,handles);
set(handles.add,'enable','on');% --- Executes on button press in endpoint.
function endpoint_Callback(hObject, eventdata, handles)
% hObject    handle to endpoint (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global enden;global CentroidFinX;global CentroidFinY;
enden=1;
end_img = handles.Thin_img;
fun=@filter_model;
L = nlfilter(end_img,[3 3],fun);
Lend_point=(L==1);
for i=1:384for j=1:288if Lend_point(i,j)==1if sum(end_img(i,1:j))==1||sum(end_img(i,j:288))==1 ...||sum(end_img(1:i,j))==1||sum(end_img(i:384,j))==1Lend_point(i,j)=0;endelsecontinue;endend
end
LFinLab=bwlabel(Lend_point);
propFin=regionprops(LFinLab,'Centroid');
CentroidFin=round(cat(1,propFin(:).Centroid));
CentroidFinX=CentroidFin(:,1);
CentroidFinY=CentroidFin(:,2);
axes(handles.axes2);
hold on;
hImg_end=plot(CentroidFinX,CentroidFinY,'r.');
handles.hImg_end=hImg_end;
set(hImg_end,'ButtonDownFcn',{@Img2ButtonDown,handles});
handles.Lend_point=Lend_point;
set(handles.delete,'enable','on');
guidata(hObject,handles);

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]刘艳华.基于MATLAB/GUI的指纹识别系统设计[J].信息与电脑(理论版). 2021,33(18)

【指纹识别】基于matlab GUI指纹预处理+特征点提取【含Matlab源码 1693期】相关推荐

  1. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  4. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  5. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  6. 【指纹识别】指纹预处理+特征点提取【含GUI Matlab源码 1693期】

    ⛄一.指纹识别简介 0 引言 随着社会的发展,钥匙.证件.银行卡以及用户名密码等这些鉴定身份的标志性物品和标识的安全性越来越弱,很容易被伪造.被盗用.不小心丢失等,给人们带来了极大的困扰,如何才能更好 ...

  7. arm linux 指纹识别,基于ARM—Linux指纹识别系统的设计.pdf

    基于ARM-Linux指纹识别系统的设计.pdf 第 20卷 第 l5期 电子设计工程 2012年 8月 Vo1.20 No.15 ElectronicDesienEn~inee Aug.2012 基 ...

  8. 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】

    一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...

  9. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】

    一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...

  10. 【飞行器】基于matlab GUI四旋飞行器模型【含Matlab源码 2075期】

    ⛄一.四旋翼飞行器简介 0 引 言 四旋翼飞行器由于具有可垂直起降.机动性强.操作方便等诸多优点,在军事和民用场合得到广泛应用,从而成为众多学者的研究热点.四旋翼飞行器是具有四输入.六输出的欠驱动.非 ...

最新文章

  1. java创建对象_java 创建对象的五种方式
  2. Android Crash战斗日记(一、原理篇)
  3. 监控服务器怎么增加碟机,微服务业务监控方法及服务器专利_专利申请于2017-12-15_专利查询 - 天眼查...
  4. git的常用操作(个人整理使用)
  5. switch注意事项
  6. 关于虚拟机下linux共享Windows文件的解决方案
  7. 做游戏,学编程(C语言) 10 僵尸危机
  8. windows制作docker镜像_Windows镜像制作
  9. B VUE系列 三:vuex,vue全局变量管理和状态更新的利器
  10. gitlab主备同步_gitlab实现主备切换集群
  11. sublime3dsmax - Sublime Text Send To 3ds Max 解决中文路径问题
  12. 英文版一元购源码开发解析
  13. 老闪创业那些事儿(88)——上市的钟声响起
  14. ios android 录音格式,Audio模块录音格式汇总(aac、mp3)
  15. 【算法随记二】线卷积积分及其在图像增强和特效方面的应用(一)
  16. php f4v元数据,IIS设置支持flv,f4v,mp4,ogv,webm
  17. 距离-视觉-惯性里程计:无激励的尺度可观测性(ICRA2021)
  18. spark使用之ALS版本对比
  19. 中国烟酰胺单核苷酸(NMN)行业研究与投资预测报告(2022版)
  20. 父母英语不好,孩子照样行:在家四步轻松搞定英语启蒙 读后感

热门文章

  1. c# 扩展方法奇思妙用高级篇三:Enumerable.CastT 应用
  2. Oracle9个重要的视图
  3. day02 Python 运算符
  4. python提示AttributeError: 'NoneType' object has no attribute 'append'
  5. Nginx中修改php.ini的上传设置upload_max_filesize的值
  6. Linux误删C基本运行库libc.so.6处理方法
  7. 【HDU1166】敌兵布阵(树状数组或线段树)
  8. Atitit 知识图谱 RDF、RDFS和OWL数据模型 目录 1. 知识图谱 1 2. 二、知识图谱的前世今生 2 2.1. 五六十年代所提出的一种知识表示形式——语义网络(Semantic N
  9. atitit 未来学课程体系.docx
  10. Atitit 文员招募规范 attilax总结