日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

【指纹识别】基于模板匹配算法指纹识别匹配门禁系统matlab源码

發(fā)布時(shí)間:2024/1/8 windows 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【指纹识别】基于模板匹配算法指纹识别匹配门禁系统matlab源码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、簡介

1 指紋識(shí)別的引入和原理
1.1 指紋的基本知識(shí)
指紋,由于其具有終身不變性、唯一性和方便性,已幾乎成為生物特征識(shí)別的代名詞。指紋是指人的手指末端正面皮膚上凸凹不平產(chǎn)生的紋線。紋線有規(guī)律的排列形成不同的紋型。紋線的起點(diǎn)、終點(diǎn)、結(jié)合點(diǎn)和分叉點(diǎn),稱為指紋的細(xì)節(jié)特征點(diǎn)(minutiae)。如圖1-1所示。

1.2 指紋識(shí)別的原理及算法流程
指紋識(shí)別即指通過比較不同指紋的細(xì)節(jié)特征點(diǎn)來進(jìn)行鑒別。指紋識(shí)別技術(shù)涉及圖像處理、模式識(shí)別、計(jì)算機(jī)視覺、數(shù)學(xué)形態(tài)學(xué)、小波分析等眾多學(xué)科。由于每個(gè)人的指紋不同,就是同一人的十指之間,指紋也有明顯區(qū)別,因此指紋可用于身份鑒定。由于每次捺印的方位不完全一樣,著力點(diǎn)不同會(huì)帶來不同程度的變形,又存在大量模糊指紋,如何正確提取特征和實(shí)現(xiàn)正確匹配,是指紋識(shí)別技術(shù)的關(guān)鍵。
指紋識(shí)別技術(shù)主要包括三大部分:指紋圖像采集、指紋預(yù)處理、特征提取與匹配。如圖1-4所示。

2 指紋圖像預(yù)處理
圖像預(yù)處理是對(duì)原始圖像進(jìn)行的一種前期處理,方便后續(xù)的模塊識(shí)別。無論采用何種方式獲取的指紋圖像, 都有一部分由于質(zhì)量原因, 不能被系統(tǒng)直接識(shí)別,因此圖像的預(yù)處理就顯得非常有必要。
指紋圖像的預(yù)處理目的就是將自己感興趣的目標(biāo)區(qū)域保留下來,去除背景區(qū)域和沒有用的部分,同時(shí)根據(jù)指紋目標(biāo)區(qū)域中脊線的結(jié)構(gòu)特征,采取較好的濾波方法,提高指紋脊線清晰度,平滑脊線邊緣的毛刺和空洞,抑制圖像噪聲,保證指紋特征的可靠提取,并使灰度圖像轉(zhuǎn)化成黑白的二值圖像,最終得到脊線結(jié)構(gòu)清晰的單像素寬的二值圖像。本文預(yù)處理的主要流程如圖2-1所示。

2.1 指紋圖像的采集
因本設(shè)計(jì)重點(diǎn)是對(duì)指紋圖像的處理,最終得到匹配結(jié)果,因此指紋圖像的獲取并非本設(shè)計(jì)的重點(diǎn)。指紋圖像的獲取可以借助市面上的指紋采集器貨得,或者自行利用手機(jī)和數(shù)碼相機(jī)等拍攝器材采集。
2.2圖像的灰度處理
圖像的灰度化是保留原有像素的透明度的,即透明度不參與像素的運(yùn)算。該運(yùn)算公式為:
gray = R?0.299 + G * 0.587 + B * 0.114
這個(gè)公式的意思是原圖的一個(gè)像素區(qū)域包含了RGB的三個(gè)顏色值,而目標(biāo)灰度圖上相對(duì)應(yīng)的像素上的顏色值為由上面的公式計(jì)算得到。這里有個(gè)問題就是,你需要結(jié)果圖是24位(如果包含Alpha則是32位)還是8位,如果是24位,則結(jié)果灰度圖還是RGB的,只不過R=G=B=gray,如果是8位的,一個(gè)像素就只包含一個(gè)顏色值gray。
圖像的灰度化是圖像處理中很基本的算法,同時(shí)也是其他圖像處理或是識(shí)別的基礎(chǔ),有些智能算法都是基于單色8位灰度圖進(jìn)行的,因?yàn)樗麥p少了計(jì)算量。
2.3 圖像的二值化
二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或1,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白視覺效果。指紋圖像中包括目標(biāo)和背景還有眾多噪聲,要想從原始的指紋圖像中提取出目標(biāo),一般用的方法是設(shè)定一個(gè)閾值T,用T將圖像中像素?cái)?shù)據(jù)分成兩部分,若輸入灰度圖像的函數(shù)為:

通過求解閾值T,從而把圖像f(x,y)分成目標(biāo)和背景兩個(gè)區(qū)域,其中大于T的像素群為目標(biāo)區(qū)域,小于等于T的像素群為背景區(qū)域,閾值的選取原則是:(1)盡可能的多保存圖像信息;(2)盡可能的減少噪聲。
本文將討論基于方向場的二值化處理。
采集到的指紋圖像一般都有比較清晰的方向場,方向場估計(jì)得準(zhǔn)確與否直接決定了圖像二值化算法的效果。
為估計(jì)方向場,我們把指紋脊線的走向分為如下8個(gè)方向,如圖2-6所示:

我們先對(duì)分割后的圖像進(jìn)行了平均濾波,然后對(duì)圖像的每一個(gè)像素,為確定在該像素處的脊線方向,在以該像素為中心的99窗口內(nèi),分別計(jì)算8個(gè)方向上的經(jīng)過處理后的灰度值,即將圖2-6中數(shù)字1到8的位置的像素灰度值去除其中最大summax和最小值summin,若滿足最大的summax和最小的summin與 4I(x,y))之和大于 (3summ/8),則該像素點(diǎn)的脊線方向?yàn)閟ummin,否則為summax.確定完脊線方向后再由該方向場對(duì)圖像進(jìn)行二值化。
結(jié)果如下:

2.4 圖像細(xì)化
二值化處理后,脊線仍然有一定的寬度,指紋識(shí)別的匹配是只利用圖像的點(diǎn)或線的特征,這些點(diǎn)或者特征只與脊線的走向或者紋理有關(guān)系,有一定寬度的二值化圖像顯得有些多余,所以需要對(duì)二值化圖像進(jìn)行細(xì)化處理,指紋二值化圖像經(jīng)過細(xì)化處理即可得到一個(gè)單一像素寬度的脊線,經(jīng)過上述的細(xì)化處理,在后續(xù)的指紋特征提取和特征匹配的算法中大大的減少了計(jì)算的冗余量和出錯(cuò)率,使得指紋識(shí)別的速度和準(zhǔn)確度有了很大的提高。
細(xì)化目的是在不破壞指紋圖像連通性的情況下去除掉多余的信息(即多余的像素點(diǎn)),將二值化的指紋圖像的脊線采用逐層剝離的方法,將圖像中的指紋脊線細(xì)化成單象素寬(實(shí)際為保存原圖的骨架)。
這里是利用matlab庫函數(shù)bwmorph,調(diào)用格式為:BW2 = bwmorph(BW,operation,n)應(yīng)用形態(tài)學(xué)操作n次,n可以是Inf,這種情況下該操作被重復(fù)執(zhí)行直到圖像不再發(fā)生變化為止。
‘thin’ n = Inf時(shí),減薄目標(biāo)成線。沒有孔洞的目標(biāo)縮成最低限度的連通邊;有孔洞的目標(biāo)縮成連通環(huán)。
3 圖像特征提取和特征匹配
3.1 特征點(diǎn)提取
(1)提取指紋的端點(diǎn)和交叉點(diǎn)
端點(diǎn)和交叉點(diǎn)均是指紋圖像的兩個(gè)細(xì)節(jié)特征,同時(shí)在指紋識(shí)別的的過程中起著重要的作用,因?yàn)樽R(shí)別的首要前提就是找到圖像的所有端點(diǎn)和交叉點(diǎn)。通過point.m函數(shù)來找出細(xì)化后指紋圖像的所有端點(diǎn)及交叉點(diǎn)。
將八鄰域中的每個(gè)點(diǎn)依次兩兩相減并取其絕對(duì)值,后將所有結(jié)果加起來,因?yàn)槎它c(diǎn)處是兩個(gè)點(diǎn),即和為2時(shí)細(xì)化圖像有端點(diǎn),和為6時(shí)圖像特征為交叉點(diǎn)。
運(yùn)行完上面的point.m函數(shù)的程序后,能把細(xì)化圖像的的端點(diǎn)和交叉點(diǎn)全部找出。在定義函數(shù)的程序中有數(shù)組txy,其中t為橫坐標(biāo),x為縱坐標(biāo),y為2時(shí)為端點(diǎn),y為6時(shí)為交叉點(diǎn)。
(2)去除圖像邊緣的端點(diǎn)[去偽]
可以看出,指紋圖像細(xì)化的邊緣,由于采集儀器不同的關(guān)系,因此不可避免的會(huì)多出很多的端點(diǎn),這些端點(diǎn)不僅增加了后續(xù)的工作量,還可能導(dǎo)致識(shí)別過程中產(chǎn)生錯(cuò)誤,所以要把這些邊緣的端點(diǎn)都去除,在matlab中這些操作都可以采用一函數(shù)來實(shí)現(xiàn),本實(shí)驗(yàn)中設(shè)計(jì)了一cut.m函數(shù)來進(jìn)行處理。
3.2 找出特征點(diǎn)
設(shè)置三個(gè)函數(shù)來找出圖像的特征點(diǎn):
(1)single_point函數(shù)
經(jīng)過去除邊緣端點(diǎn)的操作后進(jìn)一步減少了指紋細(xì)化圖像中的端點(diǎn)和交叉點(diǎn)的個(gè)數(shù)。下面就需要找出一些在細(xì)化圖像中比較獨(dú)特的端點(diǎn)來作為識(shí)別的特征點(diǎn)。在一幅細(xì)化的指紋圖像中,如果在一個(gè)像素(該像素為端點(diǎn))的周圍半徑為r(r為像素的個(gè)數(shù))的圓內(nèi)沒有任何的端點(diǎn)或者交叉點(diǎn),那么隨著r的逐漸增大,這樣的點(diǎn)就會(huì)越來越少,因此該點(diǎn)也就越來越獨(dú)特。于是我們設(shè)計(jì)了一single_point函數(shù)來找出這樣獨(dú)特的點(diǎn)。
(2)walk函數(shù)
為了進(jìn)一步找出特征點(diǎn),我們還需定義一walk函數(shù),它的主要作用就是判斷某一端點(diǎn)在num的距離內(nèi)是否還有其他的端點(diǎn)。
(3)last1函數(shù)
single_point函數(shù)和walk函數(shù)都是找細(xì)化圖像特征點(diǎn)的函數(shù),因此可以設(shè)計(jì)另一個(gè)新的last1函數(shù),通過執(zhí)行
[pxy3,error2]=last1(thin,r,txy,num)
可以找出一端點(diǎn)以r為半徑的像素內(nèi)的任何端點(diǎn)和交叉點(diǎn)且沿著脊線走向的num內(nèi)沒有任何的其他端點(diǎn)和交叉點(diǎn)。
3.3 特征點(diǎn)匹配
由上文的函數(shù)可知,已經(jīng)找出了指紋細(xì)化圖像中的特征點(diǎn),并畫出了一段獨(dú)特的脊線,在圖像中用紅色來標(biāo)示。下面就是指紋匹配[12]的問題了。在此我們設(shè)置了三層匹配。
(1)脊線長度匹配
對(duì)于上面的函數(shù)即可找出細(xì)化圖像中的特征點(diǎn)和一段脊線,沿著該段脊線走向,每隔五個(gè)像素測量一下,看到到原始端點(diǎn)的距離,此段距離由一distance函數(shù)得到。
函數(shù)結(jié)果會(huì)得到一數(shù)組(內(nèi)有脊線的長度信息)。如果兩幅指紋細(xì)化圖像中的紋路是相同的,則它們就包含相同的端點(diǎn)和交叉點(diǎn)及用distance函數(shù)找出的相同的一段脊,則這兩個(gè)指紋圖像中的長度數(shù)組對(duì)應(yīng)的位置比例會(huì)基本相等(我們選擇的指紋圖像大小基本相等,因此該比例選1),因此函數(shù)最終定義了一個(gè)數(shù)f=(sum(abs((d1./d2)-1))),其中若f的值越接近于0,這兩幅圖像的匹配度就越高,在一定范圍的閾值內(nèi)我們可以認(rèn)定為匹配。
(2)三角形邊長匹配
找到一個(gè)指紋細(xì)化圖像的特征點(diǎn)后,可以找出距離這個(gè)端點(diǎn)距離最近的兩個(gè)端點(diǎn)或者交叉點(diǎn),與這個(gè)指紋圖像細(xì)化的特征點(diǎn)構(gòu)成一個(gè)三角形,若兩幅圖像中的邊長比例基本相等(原理同上,也選1),則說明這兩幅圖像匹配,越接近于1說明這兩幅指紋圖像越匹配。其中設(shè)置一find_point函數(shù)來找出距離最近的端點(diǎn)或交叉點(diǎn)。
函數(shù)最后定義了一個(gè)數(shù)ff=(sum(abs((dd1./dd2)-1))),因此ff值越接近于0,這兩幅指紋圖像的匹配度越高,在一定范圍的閾值內(nèi)我們可以認(rèn)定為匹配。

二、源代碼

function varargout = gui1(varargin) % GUI1 MATLAB code for gui1.fig % GUI1, by itself, creates a new GUI1 or raises the existing % singleton*. % % H = GUI1 returns the handle to a new GUI1 or the handle to % the existing singleton*. % % GUI1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in GUI1.M with the given input arguments. % % GUI1('Property','Value',...) creates a new GUI1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before gui1_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to gui1_OpeningFcn via varargin. % % *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 gui1% Last Modified by GUIDE v2.5 19-May-2018 10:57:01% Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @gui1_OpeningFcn, ...'gui_OutputFcn', @gui1_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 gui1 is made visible. function gui1_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 command line arguments to gui1 (see VARARGIN) % Choose default command line output for gui1 handles.output = hObject; A=imread('指紋3.jpg'); set(handles.pushbutton1,'CData',A); B=imread('指紋19.jpg'); set(handles.pushbutton3,'CData',B);C=imread('指紋18.jpg'); set(handles.pushbutton7,'CData',C);D=imread('指紋6.jpg'); set(handles.pushbutton4,'CData',D);E=imread('指紋17.jpg'); set(handles.pushbutton5,'CData',E);F=imread('指紋5.jpg'); set(handles.pushbutton8,'CData',F);G=imread('指紋8.jpg'); set(handles.pushbutton9,'CData',G); % ha=axes('units','normalized','position',[0 0 1 1]); % uistack(ha,'down') % II=imread('動(dòng)態(tài)圖片2.jpg');%里面的參數(shù)可以是你自己的圖片,把名字連同格式寫進(jìn)去就可以了 % image(II) % colormap gray % set(ha,'handlevisibility','off','visible','off');guidata(hObject, handles);% UIWAIT makes gui1 wait for user response (see UIRESUME) % uiwait(handles.figure1);% --- Outputs from this function are returned to the command line. function varargout = gui1_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 on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) hfigure2=Fingerprint_gui(); handles.hfigure2=hfigure2; guidata(hObject,handles);% --- Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) function out = thinning2(in);%thinning process obtain a one pixel wide image skeleton % use function n_sum and t_sum[w,h] = size(in);out = in;for i= 3:h-2 for j= 3:w-2if out(i,j) == 1if 1 < n_sum(i,j,out) & n_sum(i,j,out) < 7 if t_sum(i,j,out) == 2if or ( and_157(i,j,out) == 0 , t_sum(i,j-1,out) ~= 2 )if or (and_357(i,j,out) == 0 , t_sum(i+1,j,out) ~=2 ) % if and_157(i,j,out) == 0% if and_357(i,j,out) == 0 out(i,j) = 0;elseout(i,j) = 1;end;elseout(i,j) = 1;end;elseend;end;

三、運(yùn)行結(jié)果

?

總結(jié)

以上是生活随笔為你收集整理的【指纹识别】基于模板匹配算法指纹识别匹配门禁系统matlab源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。