天天看點

基于MATLAB的指紋識别算法仿真實作

目錄

​​一、理論基礎​​

​​二、核心程式​​

​​三、測試結果​​

一、理論基礎

       在指紋圖像預處理部分,論文對預處理的各個步驟包括規格化、圖像分割、中值濾波、二值化、細化等以及各個步驟的方法進行了深入的分析和研究,選擇了一種圖像預處理方案。在指紋特征提取部分,采用基于Matlab實作的指紋細節特征提取方法,并給出了去僞算法。指紋特征提取是從細化後的指紋圖中得到細節特征點(即端點和分叉點),此特征點含有大量的僞特征,既耗時又影響比對精度。采用了邊緣去僞和距離去僞,使得特征點去僞前後減小了近1/3,然後提取可靠特征點資訊,以便實作指紋比對。

      指紋識别技術是指使用取像裝置讀取指紋圖像,通過識别軟體提取出指紋圖像中的特征資料,然後根據比對算法得到的結果鑒别指紋所有人身份的生物特征識别技術。

       指紋識别系統主要涉及三大步驟:指紋圖像預處理、特征提取、特征比對三個部分,其中預處理部分又可分為歸一化、圖像濾波增強、二值化和細化等幾個步驟。系統流程框圖如圖1-1所示。下面對這三個個部分做一下簡單的介紹。

基于MATLAB的指紋識别算法仿真實作

        指紋圖像進行中物體的形狀資訊是十分重要的,為了提取指紋圖像特定區域的特征,對指紋圖像通常需要采用細化算法處理,得到與原來指紋圖像形狀近似的由簡單的弧或曲線組成的圖形,這些細線處于物體的中軸附近,這就是所謂的指紋圖像的細化。

      細化方法不同,細化結果就有差異。在指紋識别中要求在不改變原來指紋圖像的拓樸連通性的同時,細化的結果應為嚴格的八鄰域圖像骨架;紋線中除去特征點以外,每個像素均隻與相鄰兩個像素為八鄰域,抹去任意一像素都将破壞紋線的連接配接性。概括起來說就是紋線細化處理要滿足收斂性、連接配接性、拓樸性、保持性、細化性、中軸性、快速性的要求。目前為止,關于細化方法的研究工作已有很多成果,所采用的方法從使用的觀點來看,比較多的是采用模闆比對的方法(如疊代法、OPTA單連通法等)。這種方法是根據某個像素的局部鄰域(如3×3,5×5等)的圖像特征對其進行處理,此外也有采用邊緣搜尋編碼、外輪廓計算以及神經網絡等細化方法。從處理的過程來看,主要可以分為串行和并行兩類,前者對圖像中目前像素處理依據其鄰域内像素的即時化結果,且不同的細化階段采用不同的處理方法;後者對目前的像素處理該像素及其鄰域内各像素的前一輪 

疊代處理的結果,自始至終采用相同的細化準則。

       對于任意形狀的區域,細化實質上是腐蝕操作的變體,細化過程中要根據每個像素點的八個相鄰點的情況來判斷該點是否可以剔除或保留。

基于MATLAB的指紋識别算法仿真實作

        細節特征提取的方法分為兩種:一種是從灰階圖像中提取特征,另一種是從細化二值圖像中提取特征。直接從灰階圖像中提取特征的算法一般是對灰階指紋紋線進行跟蹤,根據跟蹤結果尋找特征的位置和判斷特征的類型。這種方法省去了複雜的指紋圖像預處理過程,但是特征提取的算法卻十分複雜,而且由于噪聲等因素影響,特征資訊(位置、方向等)也不夠準确。目前大多數系統采用第二種方法,從細化二值圖像中提取特征,該方法比較簡單,在得到可靠的細化二值圖像後,隻需要一個3×3的模闆就可以将端點和分叉點提取出來。

        特征點提取的好壞将直接影響比對的結果。現實中,指紋輸入時,由于汗漬、幹燥、按壓力度不同等影響,得到的指紋圖像大都含有斷紋、褶皺、模糊、灰階不均勻等品質問題,雖然經過預處理,圖像品質會有所改觀,但預處理算法對各個指紋的适應性和有效性也會不同,并且會引入新的噪聲,是以得到的細化二值圖像往往含有大量的僞特征點。僞特征點不僅會影響比對的速度,嚴重的會影響整個識别的正确率。是以提取特征點後要進行去僞處理,盡可能濾除僞特征點、保留真特征點。實踐中發現,僞特征點的數量一般占總特征數量的一半以上,是以去僞是必不可少的過程。去僞過程可以在兩個階段進行:一是在特征提取之前對細化二值圖像進行平滑、去除毛刺、連接配接斷紋等操作,然後提取特征作為真特征;另一種是在特征提取之後,根據特征之間的互相關系,盡可能準确的識别僞特征點并濾除它們。前者直接對圖像進行修補,操作比較複雜,容易引入新的僞特征;後者對特征提取後的資料進行判斷,識别比較麻煩,但是速度較快本文采用第二種方法,即從已提取的特征點中濾除僞特征,保留真特征。

二、核心程式

clc;
clear all;
close all;
warning off;

%讀取圖檔
%注意,為了和論文中的結果對應起來,我們使用論文中的圖檔進行代碼的測試
I=imread('images.jpg');
if isrgb(I) == 1
   I = rgb2gray(I);
else
   I = I;
end
I_tmp = I;


figure;
subplot(121);
imshow(I);

%圖像預處理,去噪濾波
I = medfilt2(I,[3,3]);%進行中值濾波;
subplot(122);
imshow(I);

%背景分割
%圖像二值化處理
%首先進行歸一化
I=norms(I,120,600);  

figure;
%為了顯示處理效果,需要資料類型轉換
subplot(121);
imshow(double(I));

Ker   = 8;
[m,n] = size(I);
m1    = m/Ker;
n1    = n/Ker;
for i=1:m1
   for j=1:n1
       %設定門限
      t=mean2(I((i-1)*Ker+1:(i-1)*Ker+Ker,(j-1)*Ker+1:(j-1)*Ker+Ker));
      for k=(i-1)*Ker+1:(i-1)*Ker+Ker
          for l=(j-1)*Ker+1:(j-1)*Ker+Ker
              if I(k,l) < t
                  I(k,l)=1;
              else 
                  I(k,l)=0;
              end
          end
      end
   end
end


%為了顯示處理效果,需要資料類型轉換
subplot(122);
imshow(double(I));
 




%異常點的處理
for i=1:m
    for j=1:n
        if I(i,j)>1
            I(i,j)=0;
        end
    end
end
for i=1:m
    for j=1:n
        if I(i,j)==1
            for k=1:j
                I(i,k)=1;
            end
            break;
        end
    end
end
for i=1:m
    for j=n:-1:1
        if I(i,j)==1
            for k=n:-1:j
               I(i,k)=1;
            end
            break;
   end
    end
end
for i=1:m
    for j=1:n
        if I(i,j)==1
            I(i,j)=0;
        else
            I(i,j)=1;
        end
    end
end
figure;
%為了顯示處理效果,需要資料類型轉換
imshow(double(I));

%對細化前的圖像進行維納濾波
figure;
subplot(121);
imshow(double(I));

I=wiener2(I,[3 3]);

subplot(122);
imshow(double(I));

%以下為細化處理
[r,c] = size(I);
for i1=1:r;
    for j1=1:c
        if (I(i1,j1)==1)
           I(i1,j1)= 255; 
           I2      = I;
        end
    end
end
 

y = thinning(I2);
figure;
imshow(y);


%以上的代碼是你之前的第三章的代碼的仿真圖
%以下的代碼是對應第四章的仿真圖
%首先需要提取指紋圖像的中心點——對應論文的“圖4-1提取中心點後的細化圖像”
[XC,YC] = find_central_point(y);

%找尋細化圖像的特征點
%特征點的建立——對應論文的“圖4-2特征點提取後的圖像”
[dpx3,dpy3,dpcount3,fpx3,fpy3,fpcount3]=characterpoint(y);
figure;
imshow(y);
hold on;
plot(dpy3,dpx3,'o');
hold on;
plot(fpy3,fpx3,'+');
hold on;
plot(XC,YC,'*r'); 
hold off;





%以下代碼是對最後的識别結果和資料庫中的進行比對
%計算每個特征點到中心點的距離,
Dpcount=size(dpx3,2);
Fpcount=size(fpx3,2);
for i=1:Dpcount
    DP_Feature(i)=sqrt((dpx3(i)-YC)^2+(dpy3(i)-XC)^2);
end
for j=1:Fpcount
    FP_Feature(j)=sqrt((fpx3(j)-YC)^2+(fpy3(j)-XC)^2);
end   

%計算指紋圖像的方向角
theta = func_theta(I_tmp);

%建立待識别的特征庫
for i=1:Dpcount
    PointOfModel(i,1)=1;
    PointOfModel(i,2)=DP_Feature(i);
    PointOfModel(i,3)=theta(dpx3(i),dpy3(i))-theta(YC,XC);
end
for i=Dpcount+1:Dpcount+Fpcount
    PointOfModel(i,1)=2;
    PointOfModel(i,2)=FP_Feature(i-Dpcount);
    PointOfModel(i,3)=theta(fpx3(i-Dpcount),fpy3(i-Dpcount))-theta(YC,XC);
end    


%調用database_feature計算得到PointOfMatch
I=imread('database/22.tif');

if isrgb(I) == 1
   I = rgb2gray(I);
else
   I = I;
end
PointOfMatch = database_feature(I);

%調用MATCH函數進行比對
%圖4-3 比對後的圖像
NUM = 90;%這個參數是新加的,設定相似度,即多少個比對點對上才算成功
Count=match(y,PointOfModel,PointOfMatch,dpx3,dpy3,fpx3,fpy3,NUM);      

三、測試結果

邊緣保護

基于MATLAB的指紋識别算法仿真實作

 進行适應性去噪過濾處理

基于MATLAB的指紋識别算法仿真實作

 細化處理得到的結果

基于MATLAB的指紋識别算法仿真實作

 二值化圖像細化處理,并标注特征點和中心點。特征端點用'o'标注,特征分叉點用'+'标注,中心點用紅色'*'标注

基于MATLAB的指紋識别算法仿真實作

 指紋比對

繼續閱讀