📄 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -