基於MATLAB的指紋識別演算法模擬實現

專注的阿熊發表於2022-11-25

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] =外匯跟單gendan5.com 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);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2925232/,如需轉載,請註明出處,否則將追究法律責任。

相關文章