www.pudn.com > fvsmatlabsourcecodebyRF.rar > fpextractdemo.m


function fpextractdemo(action, varargin) 
%	FPEXTRACTDEMO 指纹特征提取演示程序 
%   Modified by PRTsinghua@hotmail.com 
% 
% 输入图像必须是256×256的灰度图 
% 8-bit灰度级的图像 @ 500 dpi. 
% 如果这些条件不满足,一些函数中的参数必须做相应的改变 
%  
%   
%   选项: 
%     - Centralize:    二值化图像,计算中心点 
%     - Crop:          图像修剪 
%     - Sectorize:     可视化扇形 
%     - Normalize:     归一化输入图像 
%     - Gabor filters: 可视化Gabor滤波器 
%     - Convolute:     计算输入图像和Gabor滤波器的convolution 
%     - Features:      特征可视化 
%     - FingerCode:    在数据库中加入该指纹 
%     - Check:         指纹匹配 
% 
% 
% 指纹识别中一个至关重要的步骤就是中心点的确定。如果剪切指纹图像时出现了任何 
% 错误,你可以使用辅助的m文件"vedicentro.m":它使得输入指纹可视化并计算指纹 
% 中心,借助于m函数 "centralizing.m"。 
% 
% 在MATLAB的命令行提示中输入 "fpextractdemo" 运行程序 
 
 
%-------------------------------------------------------------------------- 
if nargin<1, 
    action='InitializeFPEXTRACTDEMO'; 
end; 
 
feval(action,varargin{:}) 
return; 
 
%%% 
%%%  子函数 - InitializeFPEXTRACTDEMO 
%%% 
 
function InitializeFPEXTRACTDEMO() 
 
% 如果 fpextractdemo 已经在运行,将之转到前台 
h = findobj(allchild(0), 'tag', 'Extracting FingerPrint Features Demo ( Modified by PRTsinghua@hotmail.com v) '); 
if ~isempty(h) 
    figure(h(1)) 
    return 
end 
 
screenD = get(0, 'ScreenDepth'); 
if screenD>8 
    grayres=256; 
else 
    grayres=128; 
end 
 
 
FpextractDemoFig = figure( ... 
    'Name','指纹特征提取演示程序 Modified by  PRTsinghua@hotmail.com', ... 
    'NumberTitle','off', 'HandleVisibility', 'on', ... 
    'tag', '指纹特征提取演示程序', ... 
    'Visible','off', 'Resize', 'off',... 
    'BusyAction','Queue','Interruptible','off', ... 
    'Color', [.8 .8 .8], ... 
    'IntegerHandle', 'off', ... 
    'Colormap', gray(grayres)); 
 
figpos = get(FpextractDemoFig, 'position'); 
figpos(3:4) = [1024 525]; 
% Adjust the size of the figure window 
horizDecorations = 10;  % 调整大小. 
vertDecorations = 45;   % 标题栏. 
screenSize = get(0,'ScreenSize'); 
 
dx = screenSize(3) - figpos(1) - figpos(3) - horizDecorations; 
dy = screenSize(4) - figpos(2) - figpos(4) - vertDecorations; 
if (dx < 0) 
    figpos(1) = max(5,figpos(1) + dx); 
end 
if (dy < 0) 
    figpos(2) = max(5,figpos(2) + dy); 
end 
set(FpextractDemoFig, 'position', figpos); 
 
rows = figpos(4);  
cols = figpos(3); 
 
% Colors 
bgcolor = [0.45 0.45 0.45];	% 背景颜色 
wdcolor = [.8 .8 .8];  		% Window 颜色 
fgcolor = [1 1 1];			% 文本 
 
hs = (cols-(6*175)) / 5;	% 水平间隔 
vs = (rows)/8;				% 垂直间隔 
 
%==================================== 
% 所有菜单和按钮的参数 
 
Std.Interruptible = 'off'; 
Std.BusyAction = 'queue'; 
 
% Defaults for image axes 
Ax = Std; 
Ax.Units = 'Pixels'; 
Ax.Parent = FpextractDemoFig; 
Ax.ydir = 'reverse'; 
Ax.XLim = [.5 128.5]; 
Ax.YLim = [.5 128.5]; 
Ax.CLim = [0 1]; 
Ax.XTick = []; 
Ax.YTick = []; 
 
Img = Std; 
Img.CData = []; 
Img.Xdata = [1 128]; 
Img.Ydata = [1 128]; 
Img.CDataMapping = 'Scaled'; 
Img.Erasemode = 'none'; 
 
Ctl = Std; 
Ctl.Units = 'Pixels'; 
Ctl.Parent = FpextractDemoFig; 
 
Btn = Ctl; 
Btn.Style = 'pushbutton'; 
Btn.Enable = 'off'; 
 
Edit = Ctl; 
Edit.Style = 'edit'; 
Edit.HorizontalAlignment = 'right'; 
Edit.BackgroundColor = 'white'; 
Edit.ForegroundColor = 'black'; 
 
Menu = Ctl; 
Menu.Style = 'Popupmenu'; 
 
Text = Ctl; 
Text.Style = 'text'; 
Text.HorizontalAlignment = 'left'; 
Text.BackgroundColor = bgcolor; 
Text.ForegroundColor = fgcolor; 
 
%================================ 
% 0 度  
ud.hComponent1Axes = axes(Ax, ... 
    'Position', [0*vs/6 5*vs-vs/6 175 175]); 
title('0度'); 
ud.hComponent1Image = image(Img, ... 
    'Parent', ud.hComponent1Axes); 
%================================ 
% 原始指纹图像  
ud.hOriginalAxes = axes(Ax, ... 
    'Position', [cols/2-128 5*vs-vs/6-81 256 256]); 
title('原始指纹图像'); 
ud.hOriginalImage = image(Img, ... 
    'Parent', ud.hOriginalAxes); 
ud.OriginalImageIsStale = 1; 
 
%================================ 
% 157.5 度  
ud.hComponent8Axes = axes(Ax, ... 
    'Position', [cols-175 5*vs-vs/6 175 175]); 
title('157.5 度组成'); 
ud.hComponent8Image = image(Img, ... 
    'Parent', ud.hComponent8Axes); 
 
%================================= 
% 22.5 度  
ud.hComponent2Axes = axes(Ax, ... 
    'Position', [hs vs/2 175 175]); 
title('22.5 度组成'); 
ud.hComponent2Image = image(Img, ... 
    'Parent', ud.hComponent2Axes); 
 
%================================ 
% 45 度  
ud.hComponent3Axes = axes(Ax, ... 
    'Position', [2*hs+1*175 vs/2 175 175]); 
title('45 度组成'); 
ud.hComponent3Image = image(Img, ... 
    'Parent', ud.hComponent3Axes); 
 
%================================ 
% 67.5 度  
ud.hComponent4Axes = axes(Ax, ... 
    'Position', [3*hs+2*175 vs/2 175 175]); 
title('67.5 度组成'); 
ud.hComponent4Image = image(Img, ... 
    'Parent', ud.hComponent4Axes); 
 
% 90 度  
ud.hComponent5Axes = axes(Ax, ... 
    'Position', [4*hs+3*175 vs/2 175 175]); 
title('90 度组成'); 
ud.hComponent5Image = image(Img, ... 
    'Parent', ud.hComponent5Axes); 
 
%================================= 
% 112.5 度  
ud.hComponent6Axes = axes(Ax, ... 
    'Position', [5*hs+4*175 vs/2 175 175]); 
title('112.5 度组成'); 
ud.hComponent6Image = image(Img, ... 
    'Parent', ud.hComponent6Axes); 
%================================= 
% 135 度  
ud.hComponent7Axes = axes(Ax, ... 
    'Position', [6*hs+5*175 vs/2 175 175]); 
title('135 度组成'); 
ud.hComponent7Image = image(Img, ... 
    'Parent', ud.hComponent7Axes); 
 
%================================= 
%  框架 
ud.hControlFrame = uicontrol(Std, ... 
    'Parent', FpextractDemoFig, ... 
    'Style', 'Frame', ... 
    'Units', 'pixels', ... 
    'Position', [vs/6 5*vs-vs/6-81 200 vs+vs/8], ... 
    'BackgroundColor', bgcolor); 
 
%==================================== 
% 图像弹出菜单 
ud.hImgPop = uicontrol(Menu, ... 
    'Position',[vs/6+vs/8 5*vs-2*vs/3+7 180 vs/16], ... 
    'String','Whorl|Twin loop|Left loop|Right loop|Other image', ... 
    'Callback','fpextractdemo(''LoadNewImage'')'); 
 
% 文字标签 
uicontrol( Text, ... 
    'Position',[vs/6+vs/8 5*vs-vs/6-vs/3-2 180 vs/4], ... 
    'String','选择指纹类型:'); 
 
%==================================== 
% 弹出菜单 
ud.hSelectStepPop = uicontrol(Menu, ... 
    'Position',[vs/6+vs/8 4*vs-7 120 vs/16], ... 
    'String','Centralize|Crop|Sectorize|Normalize|Gabor filters|Convolute|Features|FingerCode|Check', ... 
    'Callback','fpextractdemo(''SelectExtractingStep'')'); 
% 文字标签 
uicontrol( Text, ... 
    'Position',[vs/6+vs/8 4*vs-4 90 vs/4], ... 
    'String','选择步骤:'); 
 
%==================================== 
%  Info 和 Close 的框架 
ud.hInfoCloseFrame = uicontrol(Std, ... 
    'Parent', FpextractDemoFig, ... 
    'Style', 'Frame', ... 
    'Units', 'pixels', ... 
    'Position', [3*hs+2*175 2 vs/2+2*175 vs/2-4], ... 
    'BackgroundColor', bgcolor); 
 
%==================================== 
% 按钮 - Info 和 Close 
ud.hInfo=uicontrol(Btn, ... 
    'Position',[3*hs+2*175+vs/2 7 vs/8+135-vs/2 vs/4], ... 
    'String','帮助', ... 
    'Callback','helpwin fpextractdemo'); 
 
ud.hClose=uicontrol(Btn, ... 
    'Position',[4*hs+3*175+vs/2 7 vs/8+135-vs/2 vs/4], ... 
    'String','关闭', ... 
    'Callback','close(gcbf)'); 
%==================================== 
% 状态栏 
ud.hStatus = uicontrol(Std, ... 
    'Parent', FpextractDemoFig, ... 
    'Style','text', ... 
    'Units','pixels', ... 
    'Position',[hs vs/8 2*175-vs/8 vs/4], ... 
    'Foreground', [.8 0 0], ... 
    'Background',wdcolor, ... 
    'Horiz','center', ... 
    'Tag', 'Status', ... 
    'String','初始化程序...'); 
 
set(FpextractDemoFig, 'UserData', ud); 
set(FpextractDemoFig, 'visible','on','HandleVisibility','callback'); 
set([ud.hInfo ud.hClose], 'Enable', 'on'); 
 
LoadNewImage(FpextractDemoFig); 
SelectExtractingStep(FpextractDemoFig); 
return 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%% 
%%%  子函数 - LoadNewImage 
%%% 
 
function LoadNewImage(DemoFig) 
% 加载新图像 
 
if nargin<1 
    DemoFig = gcbf; 
end 
 
set(DemoFig,'Pointer','watch'); 
ud=get(DemoFig,'Userdata'); 
v = get(ud.hImgPop,{'value','String'}); 
name = deblank(v{2}(v{1},:)); 
drawnow 
 
switch name 
    case 'Right loop', 
        namefile='37_7.bmp'; 
        [img,map]=imread(namefile); 
    case 'Whorl', 
        namefile='19_7.bmp'; 
        [img,map]=imread(namefile); 
    case 'Left loop', 
        namefile='37_3.bmp'; 
        [img,map]=imread(namefile); 
    case 'Twin loop', 
        namefile='37_5_2.bmp'; 
        [img,map]=imread(namefile); 
    case 'Other image',         
        [namefile,pathname]=uigetfile('*.bmp','请选择一个256×256的灰度位图'); 
        if namefile~=0 
            [img,map]=imread(strcat(pathname,namefile)); 
        else 
            disp('   Chose a file!  '); 
            [img,map]=imread('37_7.bmp'); 
        end 
    otherwise  
        error('fpextractdemo: Unknown Image Option!'); 
end 
% 如果图像大小 N x M 且 mod(N,8)~=0 或者 mod(M,8)~=0 
% 则改变图像大小 
imgN=size(img,1); 
imgM=size(img,2); 
modN=mod(imgN,8); 
modM=mod(imgM,8); 
 
%---------------------------------------- 
% 将信息保存在 informations.dat 
if isa(img,'uint8') 
    graylevmax=2^8-1; 
end 
if isa(img,'uint16') 
    graylevmax=2^16-1; 
end 
if isa(img,'uint32') 
    graylevmax=2^32-1; 
end 
save('informations.dat','graylevmax','img'); 
%----------------------------------------- 
% 改变图像大小 
%----------------------------------------- 
img=img(modN+1:imgN,modM+1:imgM); 
%----------------------------------------- 
img = double(img)/graylevmax; 
set(get(ud.hOriginalAxes, 'title'), 'string', '原始指纹图像'); 
set(get(ud.hComponent1Axes, 'title'), 'string', '0 度组成'); 
set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 度组成'); 
set(ud.hOriginalImage, 'Cdata', img); 
set(DemoFig,'Pointer','arrow'); 
setstatus(DemoFig,'Please select a step to process...'); 
return; 
 
%======================================== 
%%% 
%%%  子函数 - SelectExtractingStep 
%%% 
 
function SelectExtractingStep(DemoFig) 
% Load a step 
 
if nargin<1 
    DemoFig = gcbf; 
end 
 
set(DemoFig,'Pointer','watch'); 
ud=get(DemoFig,'Userdata'); 
v = get(ud.hSelectStepPop,{'value','String'}); 
name = deblank(v{2}(v{1},:)); 
drawnow 
 
switch name 
    case 'Centralize', 
        Centralize(DemoFig); 
    case 'Crop', 
        Crop(DemoFig); 
    case 'Sectorize', 
        Sectorize(DemoFig); 
    case 'Normalize', 
        Normalize(DemoFig); 
    case 'Gabor filters', 
        Gaborfilter(DemoFig); 
    case 'Convolute', 
        Convolute(DemoFig); 
    case 'Features', 
        Features(DemoFig); 
    case 'FingerCode', 
        Fingercode(DemoFig); 
    case 'Check', 
        Check(DemoFig); 
    otherwise  
        error('fpextractdemo: Unknown Image Option!'); 
end 
 
return; 
 
%========================================================================== 
%%% 
%%%  子函数 - Centralize 
%%% 
 
function Centralize(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); 
 
set(get(ud.hComponent8Axes, 'title'), 'string', '二值化图像'); 
set(ud.hComponent8Image, 'Cdata', BinarizedPrint); 
set(DemoFig,'Pointer','arrow'); 
setstatus(DemoFig,'Finished centralization'); 
ud.OriginalImageIsStale = 0; 
set(DemoFig, 'UserData', ud); 
drawnow 
 
%========================================================================== 
%%% 
%%%  子函数 - Crop 
%%% 
 
function Crop(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); 
 
CroppedPrint = double(CroppedPrint)/graylevmax; 
set(get(ud.hComponent1Axes, 'title'), 'string', 'Cropped Print'); 
set(ud.hComponent1Image, 'Cdata', CroppedPrint); 
set(get(ud.hComponent8Axes, 'title'), 'string', 'Binarized Print'); 
set(ud.hComponent8Image, 'Cdata', BinarizedPrint); 
set(DemoFig,'Pointer','arrow'); 
setstatus(DemoFig,'Finished Crop'); 
ud.Component1ImageIsStale = 0; 
set(DemoFig, 'UserData', ud); 
drawnow 
 
%========================================================================== 
%%% 
%%%  子函数 - Sectorize 
%%% 
 
function Sectorize(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); 
for ( i=1:1:175*175) 
    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