⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpextractdemo.m

📁 基于MATLAB的指纹识别系统(包含原代码指纹和图片)
💻 M
📖 第 1 页 / 共 2 页
字号:
    tmp=CroppedPrint(i);
    CroppedPrint(i)=whichsector(i);
    if (CroppedPrint(i)==36 | CroppedPrint(i)==37)
        CroppedPrint(i)=tmp/graylevmax;
    else 
        CroppedPrint(i)=CroppedPrint(i)/64;
    end
    
end

set(get(ud.hComponent1Axes, 'title'), 'string', 'SectorizedPrint');
set(ud.hComponent1Image, 'Cdata', CroppedPrint);
set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Finished Sectorization');
ud.Component1ImageIsStale = 0;
set(DemoFig, 'UserData', ud);
drawnow

%==========================================================================
%%%
%%%  子函数 - Normalize
%%%

function Normalize(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end
set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在归一化,请等待......');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;


[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector] = sector_norm( CroppedPrint , 0 , 0);

CroppedPrint = double(CroppedPrint)/graylevmax;
NormalizedPrint = double(NormalizedPrint)/100;
set(get(ud.hComponent1Axes, 'title'), 'string', 'Cropped Print');
set(ud.hComponent1Image, 'Cdata', CroppedPrint);
set(get(ud.hComponent8Axes, 'title'), 'string', 'Normalized Print');
set(ud.hComponent8Image, 'Cdata', NormalizedPrint);
set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Finished normalization');
ud.Component1ImageIsStale = 0;
set(DemoFig, 'UserData', ud);
drawnow

%==========================================================================
%%%
%%%  子函数 - Gaborfilter
%%%

function Gaborfilter(DemoFig)
% 

if nargin<1
    DemoFig = gcbf;
end
set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在Gabor滤波,请等待......');
ud=get(DemoFig,'Userdata');

num_disk=8;

for (angle=0:1:num_disk-1)
    
    gabor=gabor2d_sub(angle,num_disk);
    gabor=gabor*128;
    switch angle<num_disk
        case (angle==0),
            set(get(ud.hComponent1Axes, 'title'), 'string', '0 度 gabor');
            set(ud.hComponent1Image, 'Cdata', gabor);
        case (angle==1),
            set(get(ud.hComponent2Axes, 'title'), 'string', '22.5 度 gabor');
            set(ud.hComponent2Image, 'Cdata', gabor);
        case (angle==2),
            set(get(ud.hComponent3Axes, 'title'), 'string', '45 度 gabor');
            set(ud.hComponent3Image, 'Cdata', gabor);
        case (angle==3),
            set(get(ud.hComponent4Axes, 'title'), 'string', '67.5 度 gabor');
            set(ud.hComponent4Image, 'Cdata', gabor);
        case (angle==4),
            set(get(ud.hComponent5Axes, 'title'), 'string', '90 度 gabor');
            set(ud.hComponent5Image, 'Cdata', gabor);
        case (angle==5),
            set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 度 gabor');
            set(ud.hComponent6Image, 'Cdata', gabor);
        case (angle==6),
            set(get(ud.hComponent7Axes, 'title'), 'string', '135 度 gabor');
            set(ud.hComponent7Image, 'Cdata', gabor);
        case (angle==7),
            set(get(ud.hComponent8Axes, 'title'), 'string', '157.5 度 gabor');
            set(ud.hComponent8Image, 'Cdata', gabor);
        otherwise 
            error('Nothing !');
    end
    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Gabor Filters were shown');
ud.OriginalImageIsStale = 0;
set(DemoFig, 'UserData', ud);
drawnow

%==========================================================================
%%%
%%%  子函数 - Convolute
%%%

function Convolute(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end
set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在处理8个Gabor滤波器,旋转......');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

load 'informations.dat' -mat
fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;

[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);
for (angle=0:1:num_disk-1)
    
    gabor=gabor2d_sub(angle,num_disk);    
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);
    
    
    [disk,vector]=sector_norm(ComponentPrint,1,0);
    img = double(ComponentPrint)/graylevmax;
    
    switch angle<8
        case (angle==0),
            set(get(ud.hComponent1Axes, 'title'), 'string', '0 度组成');
            set(ud.hComponent1Image, 'Cdata', img);
        case (angle==1),
            set(get(ud.hComponent2Axes, 'title'), 'string', '22.5 度组成');
            set(ud.hComponent2Image, 'Cdata', img);
        case (angle==2),
            set(get(ud.hComponent3Axes, 'title'), 'string', '45 度组成');
            set(ud.hComponent3Image, 'Cdata', img);
        case (angle==3),
            set(get(ud.hComponent4Axes, 'title'), 'string', '67.5 度组成');
            set(ud.hComponent4Image, 'Cdata', img);
        case (angle==4),
            set(get(ud.hComponent5Axes, 'title'), 'string', '90 度组成');
            set(ud.hComponent5Image, 'Cdata', img);
        case (angle==5),
            set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 度组成');
            set(ud.hComponent6Image, 'Cdata', img);
        case (angle==6),
            set(get(ud.hComponent7Axes, 'title'), 'string', '135 度组成');
            set(ud.hComponent7Image, 'Cdata', img);
        case (angle==7),
            set(get(ud.hComponent8Axes, 'title'), 'string', '157.5 度组成');
            set(ud.hComponent8Image, 'Cdata', img);
        otherwise 
            error('Nothing !');
    end
    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'旋转结束');
set(DemoFig, 'UserData', ud);
drawnow

%==========================================================================
%%%
%%%  子函数 - Features
%%%

function Features(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end
set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在处理8个Gabor滤波器,旋转......');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;

[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)
    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);
    
    [disk,vector]=sector_norm(ComponentPrint,1,0);
    
    img = double(ComponentPrint)/graylevmax;
    img1 = double(disk)/51200;
    switch angle<8
        case (angle==0),
            set(get(ud.hComponent1Axes, 'title'), 'string', '0 度特征');
            set(ud.hComponent1Image, 'Cdata', img1);
        case (angle==1),
            set(get(ud.hComponent2Axes, 'title'), 'string', '22.5 度特征');
            set(ud.hComponent2Image, 'Cdata', img1);
        case (angle==2),
            set(get(ud.hComponent3Axes, 'title'), 'string', '45 度特征');
            set(ud.hComponent3Image, 'Cdata', img1);
        case (angle==3),
            set(get(ud.hComponent4Axes, 'title'), 'string', '67.5 度特征');
            set(ud.hComponent4Image, 'Cdata', img1);
        case (angle==4),
            set(get(ud.hComponent5Axes, 'title'), 'string', '90 度特征');
            set(ud.hComponent5Image, 'Cdata', img1);
        case (angle==5),
            set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 度特征');
            set(ud.hComponent6Image, 'Cdata', img1);
        case (angle==6),
            set(get(ud.hComponent7Axes, 'title'), 'string', '135 度特征');
            set(ud.hComponent7Image, 'Cdata', img1);
        case (angle==7),
            set(get(ud.hComponent8Axes, 'title'), 'string', '157.5 度特征');
            set(ud.hComponent8Image, 'Cdata', img1);
        otherwise 
            error('Nothing !');
    end
    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Features were extracted');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

%==========================================================================
%%%
%%%  子函数 - FingerCode
%%%

function Fingercode(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end


set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在指纹编码......');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;


[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code1{angle+1}=vector(1:36);
end

load('informations.dat','img','-mat');
img=imrotate(img,22.5/2);
imgN=size(img,1);
imgM=size(img,2);
modN=mod(imgN,8);
modM=mod(imgM,8);
fingerprint=double(img(modN+1:imgN,modM+1:imgM));

[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code2{angle+1}=vector(1:36);
end
% FingerCode added to database
if (exist('fp_database.dat')==2)
    load('fp_database.dat','-mat');
    fp_number=fp_number+1;
    data{fp_number,1}=finger_code1;
    data{fp_number,2}=finger_code2;
    save('fp_database.dat','data','fp_number','-append');
else
    fp_number=1;
    data{fp_number,1}=finger_code1;
    data{fp_number,2}=finger_code2;
    save('fp_database.dat','data','fp_number');
end

message=strcat('指纹编码已经成功加入数据库. 指纹编号:',num2str(fp_number));
msgbox(message,'指纹数据库','帮助');

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'指纹编码计算完成');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

%==========================================================================
%%%
%%%  子函数 - Check
%%%

function Check(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end


set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'正在搜索数据库......');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;


[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code{angle+1}=vector(1:36);
end


% 输入指纹的编码已经计算,检查数据库
if (exist('fp_database.dat')==2)
    load('fp_database.dat','-mat');
    %---- 申请内存 -----------------------------------
    ruoto1=zeros(36,1);
    ruoto2=zeros(36,1);
    vettore_d1=zeros(12,1);
    vettore_d2=zeros(12,1);
    best_matching=zeros(fp_number,1);
    % 开始检查 ---------------------------------------
    for scanning=1:fp_number
        fcode1=data{scanning,1};
        fcode2=data{scanning,2};
        for rotazione=0:1:11
            d1=0;
            d2=0;
            for disco=1:8
                f1=fcode1{disco};
                f2=fcode2{disco};
                % ora ruoto f1 ed f2  della rotazione ciclica ----------
                for old_pos=1:12
                    new_pos=mod(old_pos+rotazione,12);
                    if (new_pos==0)
                        new_pos=12;
                    end
                    ruoto1(new_pos)=f1(old_pos);
                    ruoto1(new_pos+12)=f1(old_pos+12);
                    ruoto1(new_pos+24)=f1(old_pos+24);
                    ruoto2(new_pos)=f2(old_pos);
                    ruoto2(new_pos+12)=f2(old_pos+12);
                    ruoto2(new_pos+24)=f2(old_pos+24);
                end
                %-------------------------------------------------------
                d1=d1+norm(finger_code{disco}-ruoto1);
                d2=d2+norm(finger_code{disco}-ruoto2);                
            end
            vettore_d1(rotazione+1)=d1;
            vettore_d2(rotazione+1)=d2;
        end
        [min_d1,pos_min_d1]=min(vettore_d1);
        [min_d2,pos_min_d2]=min(vettore_d2);
        if min_d1<min_d2
            minimo=min_d1;
        else
            minimo=min_d2;
        end
        best_matching(scanning)=minimo;
    end
    [distanza_minima,posizione_minimo]=min(best_matching);
    beep;
    message=strcat('数据库中与输入指纹最匹配的是:',num2str(posizione_minimo),...
                         ' 其距离为: ',num2str(distanza_minima));
    msgbox(message,'数据库信息','帮助');
    %-------------------------------------------------------
    
else
    message='数据库为空,无法检查';
    msgbox(message,'指纹编码数据库错误','警告');    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'数据库搜索完毕');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -