指纹识别的一般步骤为指纹采集、预处理、特征点提取、特征点匹配。指纹分为螺旋形、弓形、环形。指纹的处理效果影响着后面特征点的提取和识别效果,所以图像的预处理占有重要的地位。指纹采集一般有专业的设备,所以这一步骤一搬不关注。
①预处理
因为采集指纹时力度和各种因素所以采集的指纹灰度图会有很大不同,首先对图像进行归一化处理,归一化主要针对两个步骤:大小和灰度值。把采集到的指纹图统一调整到特定大小。灰度值我会根据整幅图的均值方差调整到某一范围内。
归一化处理完毕后会对图像进行分割处理,目的是区分出前景色和背景色。我采用的分割为根据多区域阈值分割。多区域分割的效果取决于区域的大小,而指纹的区域分为一脊一谷最好,所以我选择3x3的区域大小。我会根据对区域多次进行求均值和方差进行分割。采集到的指纹图背景的灰度值大于前景色,背景主要为低频,所以背景的方差小于前景的方差。我分别求得背景和前景的均值和方差然后会得到背景为白色 脊线为黑色。然后保存在矩阵e(二值图)中,我会根据e中位置等于1的点的八邻域点的和小于四得到背景色,达到背景和前景分离(e矩阵)。然后黑白反转让感兴趣的前景色变为白色(保存在Icc中),灰度图(gray)的背景值替换为小区域块的和的均值(G1).但是得到的脊线方向并不能达到准确识别指纹。所以下一步会沿脊线方向增强指纹纹路,采用的方法为基于脊线方向场的增强方法。为了估计脊线的方向场,把脊线的方向场划分为八个方向,然后根据八个方向的灰度值的总和来得到脊线的方向。并对图像进行二值化。此时脊线还是为黑色。因为各种采集原因(油脂水分等)会使指纹粘连断裂,会影响后续的特征提取和识别,接下来会去除指纹中的空洞和毛刺,如果当前位置点值为0(背景)该点的四邻域点(上下左右)的和大于3则为毛刺,空洞的判断方法为该点为白色(背景)的四周为黑色(前景)八领域点两的和为0,则为空洞。我们得到的图像的纹线仍具有一定的宽度,而指纹的识别只与纹线的走向有关。所以我们只需要纹线的宽度为一个像素宽度即可。下面我执行了黑白反转使感兴趣的区域(纹线)变为白色。在执行开操作和闭操作使边界平滑,消除细小的尖刺,断开窄小的连接。执行细化(bwmorph)得到细画图(thin)。
②特征点提取
特征点提取的点为端点和交叉点,遍历细化图的每一个像素点,端点的判别方法为八领域点两两相减取绝对值求和如果值为2则为端点(周围只有一个为1的白色点)和为6时为交叉点(周围有三值为1的白色点)。把找到的端点位置存储在txy(Nx3),第一列存储x的位置,第二列存储y的位置,第三列标识点的类别,如果为交叉点则值为6,如果端点则值为2.然后对纹线再次进行光滑处理。原理:找到每个端点,使其沿着纹线的方向移动五个像素,如果在五个像素之内遇到交叉点则此点为毛刺,去除此点。判断离端点num个距离内是否有另一个端点的函数为walk判断的主要方法先将该点置为0然后根据八领域点和;和为0或大于2则证明该点距离num内有端点,然后循环向前遍历。惊醒光滑处理后的特征点比以前少了。但是我们采集指纹时由于采集器的关系,图像的边缘会有很多端点,这已然会影响后续的识别工作,所以我们需要熊特征点中去除这些端点,cut函数主要做这些工作,边缘的主要特征就是黑色多白色少,也就是均值小,所以我主要里用灰度图的分区域(31*31)求均值如果灰度值小于70则在该区域的特征点去除,然后会得到更少的特征点,但这些点依然不够少说明不够特殊,下面定义了combine(thin,r,txy,num)函数可以找出周围半径为r个像素的圆内没有任何端点和交叉点,沿纹线走num个距离没有交叉点和端点,comine为walk和single_point函数的综合,walk函数上面已经介绍,single_point函数主要是找出独特的点作为特征点,原理是根据两个端点之间的距离。求每个端点距离其他端点的距离,找取距离大于r的端点。执行完combine后会得到更少的端点(实验结果为3个端点)。
③特征点匹配
特征点匹配主要采用三个方法
1. 根据距离判断
找到某一个特征点,从该特征点沿着纹线走num个距离,并计算出每走一步距离该特征点的距离,最后会得到哟个装有长度信息的数组,如果两幅指纹相同则他们含有相同的特征点而且得到的数组对应的位置的数据基本相等
2三角形边长匹配,找到一个特征点以后,可以找出距离最近的两个端点与原特征点构成三角形,若两幅图的三角形的边长比例相等则说明两幅图匹配
3. 点类型匹配
4. 找到一个特征点以后,找出距离最近的num个端点,统计num个端点中端点和交叉点的个数,若两幅图匹配,则端点占的比例大致相同
读入指纹图片,通过预处理,特征点提取来识别指纹
二、现实意义:
指纹识别技术在现实生活中的意义主要体验在隐私安全保护上,可通过指纹特征点的多个特征来识别不同人的指纹来达到保护隐私安全,是具有及其重要的现实作用的。
三、涉及知识内容:
1、中值滤波
2、开运算
3、闭运算
4、二值化
5、图像细化
四、实例分析及截图效果:
(1)代码显示:
1、程序中定义图像重要变量说明
(1)image--------------------------------------------------------------原图变量;
(2)gray-------------------------------------------------------归一化后的图像;
(3)Icc-------------------------背景前景分离后的二值图;
(4)thin---细化图
(5)txy--------------------------特征点存储的矩阵;
(6)pxy----------------------特征点筛选后的特征点;
2、重要实现代码:
%找出独特的端点作为特征点 一个端点的周围半径为r个像素的圆内没有任何端点或交叉点
%随着r的逐渐变大,这样的点会变少,也就会越来越独特
function [pxy2,error]=single_point(txy,r)
error=0;
x=txy(:,1);
y=txy(:,2);
n=length(x);
d(1:n,1:n)=0;
for j=1:n
for i=1:n
if(i~=j)
%计算两点间距离
d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
else
d(i,j)=2*r;
end
end
end
[a,b]=min(d);
c=find(a>r);
pxy2=txy(c,:);
pxy2=pxy2(find(pxy2(:,3)==2),:);
t=size(pxy2,1);
if t==0
error=1;
else
plot(x,y,'b.');
hold on
plot(pxy2(:,1),pxy2(:,2),'r.');
End
function [pxy2,error]=single_point(txy,r)
error=0;
x=txy(:,1);
y=txy(:,2);
n=length(x);
d(1:n,1:n)=0;
for j=1:n
for i=1:n
if(i~=j)
%计算两点间距离
d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
else
d(i,j)=2*r;
end
end
end
[a,b]=min(d);
c=find(a>r);
pxy2=txy(c,:);
pxy2=pxy2(find(pxy2(:,3)==2),:);
t=size(pxy2,1);
if t==0
error=1;
else
plot(x,y,'b.');
hold on
plot(pxy2(:,1),pxy2(:,2),'r.');
End
3、运行效果截图:
第一步:读取原图,并显示
f=imread(image);
f=imresize(f,[363,312]);
figure;imshow(f);
第二步:归一化,将指纹灰度值调整到特定范围内
%归一化,灰度值限制在某一范围 M=0;var=0; %均值 for x=1:m for y=1:n M=M+gray(x,y); end end M1=M/(m*n); %方差 for x=1:m for y=1:n var=var+(gray(x,y)-M1).^2; end; end; var1=var/(m*n); for x=1:m for y=1:n if gray(x,y)>M1 gray(x,y)=150+sqrt(2000*(gray(x,y)-M1)/var1); else gray(x,y)=150-sqrt(2000*(M1-gray(x,y))/var1); end end end figure;imshow(uint8(gray));
![]()
第三步:细化图
Theshold = graythresh(Image);%取得图象的全局域值 Image_BW = im2bw(Image,Theshold);%二值化图象 figure,imshow(Image_BW); title(' 【初次二值化图像】');
![]()
第四步:特征点提取
%找出独特的端点作为特征点 一个端点的周围半径为r个像素的圆内没有任何端点或交叉点 %随着r的逐渐变大,这样的点会变少,也就会越来越独特 function [pxy2,error]=single_point(txy,r) error=0; x=txy(:,1); y=txy(:,2); n=length(x); d(1:n,1:n)=0; for j=1:n for i=1:n if(i~=j) %计算两点间距离 d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2); else d(i,j)=2*r; end end end [a,b]=min(d); c=find(a>r); pxy2=txy(c,:); pxy2=pxy2(find(pxy2(:,3)==2),:); t=size(pxy2,1); if t==0 error=1; else plot(x,y,'b.'); hold on plot(pxy2(:,1),pxy2(:,2),'r.'); End
第五步:特征点的再次提取
% 综合walk和single_point函数,通过执行[pxy3,error2]=combine(thin,r,txy,num)可以找出周围半径为r个像素的院内没有任何交叉点或端点,并且沿纹线走num个 % 距离内没有任何哟个交叉点或端点 function [pxy3,error2]=combine(thin,r,txy,num) error=0; [pxy2,error]=single_point(txy,r); n=size(pxy2,1); k=1; erroe2=0; for i=1:n [error,a,b]=walk(thin,pxy2(i,1),pxy2(i,2),num); if error~=1 pxy3(k,1)=pxy2(i,1); pxy3(k,2)=pxy2(i,2); pxy3(k,3)=pxy2(i,3); k=k+1; error2=0; plot(pxy2(i,1),pxy2(i,2),'r+'); end end
第六步:特征识别
①
% 特征点匹配 % 三角形边长匹配 % 找到一个特征点后,可以找出距离其最近的两个端点,与原特征点构成三角形,瑞两幅图像的三角形边长比例相等,则说明匹配 % find_point()找到最近的端点 function pxy=find_point(x0,y0,txy,num) x=txy(:,1); y=txy(:,2); n=length(x); k(1,n)=0; lnn=0; pxy(num,:)=[0,0,0]; for i=1:n k(i)=sqrt((x(i)-x0)^2+(y(i)-y0)^2); end kk=sort(k); for i=1:num xiao=kk(i+lnn); nn=find(k==xiao); lnn=length(nn); pxy(i,:)=[x(nn(1)),y(nn(1)),txy(nn(1),3)]; end plot(x0,y0,'bo'); x0; y0; hold on; plot(pxy(:,1),pxy(:,2),'ro'); % ff=(sum(abs((dd1./dd2)-1))) ff越接近0 匹配度越高
②
% 特征点匹配 % 纹线长度匹配 对于找到的特征点和纹线 沿着纹线走5个像素到原始端点的距离 function d=distance(x0,y0,num,thin) num2=fix(num/5); for i=1:num2 [error,a,b]=walk(thin,x0,y0,5*i); if error~=1 d(i)=sqrt((a-x0)^2+(b-y0)^2); else break; end end % 最后会得到一个装有长度信息的数组,如果两幅指纹途中的指纹是一样的,则他们含有相同的特征点和从这个特征点出发画出的纹线 % 则这两个数组对应位置的数据基本相等(图像大小相同,则他们的比例接近1) % f=(sum(abs((d1./d2)-1)))f越接近0 匹配度越高
③
% 找到一个特征点以后,在其周围找到四十个端点或交叉点,统计四十个点的交叉点和端点的个数 % 若两幅图断点占的比例近似相同则匹配 % fff=abs(f11-f21)/(f11+f12) 越接近于0 匹配度越高 close all; tic; clear; thin1=tuxiangyuchuli('zhiwen.png'); thin2=tuxiangyuchuli('zhiwen.png'); figure; txy1=point(thin1); txy2=point(thin2); [w1,txy1]=guanghua(thin2,txy2); [w2,txy2]=guanghua(thin2,txy2); thin1=w1; thin2=w2; txy1=cut(thin1,txy1); txy2=cut(thin2,txy2); [pxy31,error2]=combine(thin1,8,txy1,60); [pxy32,error2]=combine(thin2,8,txy2,60); error=1; num=20; cxy1=pxy31; cxy2=pxy32; d1=distance(cxy1(1,1),cxy1(1,2),num,thin1); d2=distance(cxy2(1,1),cxy2(1,2),num,thin2); f=(sum(abs((d1./d2)-1))); if(f<0.5) error=0; else error=1; end
第七步:最终检测结果:
f =
0
ff =
0
error =
0
fff =
0
时间已过 13.628304 秒。
四、算法分析
(1)中值滤波
利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化。
(2)开运算
先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
(3)闭运算
先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。