一、指纹识别简介
随着社会的发展,钥匙、文件、银行卡、用户名密码等标志性物品的安全性越来越弱,容易伪造、盗窃、意外丢失等,给人们带来了巨大的麻烦,如何更好地保护个人信息已成为当今时代一个非常重要的问题。随着网络和计算机应用技术的发展,人们逐渐将注意力转向了一个新的识别热点,即生物特征识别技术。目前,人脸识别、声音识别、虹膜识别、指纹识别等生物特征识别技术应用广泛。本设计主要研究指纹识别系统。
与声音识别和人脸识别相比,指纹识别技术是一种长期使用的生物识别技术。指纹具有不变性、独特性、普遍性、可采集性和可储存性。目前,指纹识别技术已应用于各个领域。除了众所周知的刑事调查外,还有企业指纹打卡考勤系统、居民指纹门锁安装、计算机启动或手机屏幕解锁身份确认等生活方面。
指纹识别系统主要由四个部分组成:指纹数字图像采集、指纹预处理、指纹特征提取和匹配。一是通过指纹采集设备完成指纹图像采集;二是预处理,将指纹图像变成清晰的点线图,便于提取指纹图像的特征;最后,匹配指纹图像,判断两者是否来自同一个手指。指纹识别系统的组成框图如图1所示。 图1 框图由指纹识别组成
更常用的指纹图像采集技术包括:(1)光学指纹采集技术,通过光的全反射采集指纹表面纹理图像,是最早的采集技术,成本效益高,使用更多;(2)超声扫描,采用手指表皮和空气阻抗的特点;(3)电容式传感器,在指纹图像中,设计了由脊线和谷线和半导体感应颗粒形成的电容值。
预处理指纹图像是为了在处理模糊的指纹图像后获得清晰的图像。指纹图像的预处理是指纹识别系统的基础,其处理结果直接影响指纹识别的最终效果。指纹图像的预处理过程一般分为以下部分。
首先,对指纹图像进行灰度处理和一体化处理。其中,灰度处理是为了简化图像信息一个彩色图像,灰度处理后只剩下一个灰度值,去除彩色信息。指纹图像集成的原因是,由于按压不均匀,收集到的指纹图像会导致图像的脊线和谷线发生很大变化,后续的指纹处理可能会出现错误。
二是图像分割,从收集到的指纹图像中分割目标指纹,即将指纹与背景范围分离。如果没有图像分割,在提取指纹特征信息点时,会提取许多无用的特征点,增加难度,降低最终匹配的准确性。
第三,对指纹图像进行二值化,将指纹图像变成只有0和1两个像素值的图像。其中,并非所有的像素点都放在指纹图像的0,而是所有的像素点都放在1。
第四,对指纹图像进行增强处理。要分离粘连的纹线,平滑纹线的边缘等等,以保证指纹特征提取的可靠性。
第五,细化指纹图像中的脊线框架,突出线条的有效特征,为以下特征提取做准备。
指纹数字图像的特征分为整体特征和局部特征,其中局部特征包括端点、分叉点、孤立点等。由于局部特征可以更好地区分两个指纹是否来自同一以提取指纹图像的局部特征。
提取指纹图像特征可分为两部分:提取特征和去除伪特征。有两种常用的提取特征点的方法。一种是直接从灰度处理后的指纹图像中提取所需的特征信息点。该方法省略了指纹图像的一系列预处理操作。这种方法需要非常清晰的指纹图像。在现实生活中,很难有如此完美的指纹图像来提取特征点,因此很少使用这种方法;另一种是细化后的指纹图像中提取指纹特征点,虽然前面要经过繁琐的预处理,但是最终提取到的特征信息点会比较精确。
从二值化细化后的图像中提取特征点的具体方法是建立3×3模板,中心P是待测像素点,P1~P8是8个等待测像素P的邻域像素点Cn§计算公式如下: 式中,P9=P1。
记Sn§计算公式如下: 通过计算Cn§和Sn§为了分析像素点P的状态,一般分为以下几种情况:(1)如果像素点P是脊线上的一个点,并根据计算Cn§=2和Sn§=1以看出,像素点P是脊线上的一个端点;(2)如果像素点P是脊线上的一个点,并根据计算计算Cn§=4和Sn§=1、2或4可知,像素点P是脊线上的连续点;(3)如果像素点P是脊线上的一个点,并按计算Cn§=6和Sn§=可以看出,像素点P是脊线上的一个分叉点。
检测处理完成二值细化后的指纹图像,并按上述方法计算出所有检测到的端点和分叉点,作为特征点提取的结果。
由于设备收集或手指本身,指纹图像可能有一些伪特征点,如毛刺、空洞、断裂、短脊柱和假桥。这些伪特征点将极大地影响指纹匹配的速度,甚至降低指纹匹配的准确性,因此在指纹识别和提取特征点的过程中。
指纹图像特征信息点采用[9,10]:首先,特征提取,区分它们是伪特征点还是真实特征点;其次,以指纹图像的细节点为起点,逐步搜索周围区域,判断这些特征点的真实性,分叉点不能与其他分叉点或端点连接,端点不能与其他细节点相对;最后,在确定特征信息点的真实性后,删除指纹数字图像中的所有虚假特征点,并保留真实特征点。每个虚假特征信息点的删除都有相应的算法。
对指纹图像进行特征提取和去伪操作后,删除指纹图像上的伪特征信息点,提高图像质量。
指纹匹配是指纹识别系统的最后一步。该步骤是输入两个需要匹配的指纹数字图像,并在前一系列预处理和特征信息提取后进行比较,以确定这两个指纹图像是否属于同一个手指。指纹图像有以下两种匹配算法。
首先找到指纹图像的中心点,标记为极坐标的原点,然后建立极坐标系,选择特征信息点,使用极坐标(r,e)表示,最后用φ表示特征信息点的方向。指纹参考方向为θc,极坐标系中参考点的坐标为(r,e),直角坐标系中的坐标是(xc,yc),r、e、φ计算公式如下: 观察(3)、类型(4)、类型(5)可以得出结论:无论指纹图像是平移还是旋转,指纹特征点的特征信息都不会发生其他变化。虽然在最终匹配过程中不能实现非常准确的点对点匹配,但一般来说,只要匹配的两个点在预设阈值内确定为匹配成功。
该方法是将两个指纹图像放在一起进行比较,找到端点和交叉点点,并根据匹配的数量确定是否来自同一个手指。该算法的步骤是从指纹图像中提取特征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 th 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);
三、运行结果
四、matlab版本及参考文献
2014a
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015. [5]刘艳华.基于MATLAB/GUI的指纹识别系统设计[J].信息与电脑(理论版). 2021,33(18)