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});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_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:384
for j=1:288
if Lend_point(i,j)==1
if 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))==1
Lend_point(i,j)=0;
end
else
continue;
end
end
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);
1 matlab版本
2014a
2 参考文献
[1] 刘艳华.基于MATLAB/GUI的指纹识别系统设计[J].信息与电脑(理论版). 2021,33(18)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除