图14 执行single-point函数后Matlab的显示情况
由运行结果可知,有3个端点满足周围半径为20个像素的圆内没有任何端点和交叉点的条件。
这三个点在下图中用红点标出。
图15 满足条件的特征点
3.4.2 walk函数
在此,我们还定义了一个walk函数,用于进一步找出特征点,它的作用是判断离某一端点num距离是否有另一端点。
函数如下:
function [error,a,b]=walk(thin,x0,y0,num) error=0; thin(y0,x0)=0; t1=0; for n=1:num if error==1 break; else x=x0; y=y0;
for x=x0-1:x0+1 if error==1 break; else
for y=y0-1:y0+1
t1=sum(sum(thin(y0-1:y0+1,x0-1:x0+1))); if (t1==0||t1>=2) error=1;
a=x0; b=y0; break; else
if (thin(y,x)==1&&(x-x0)^2+(y-y0)^2~=0)
if (t1>=2 ) error=1; break ; else thin(y,x)=0; x0=x; y0=y; a=x0; b=y0;
plot(x0,y0,'r.') end end end end end end end end
3.4.3 last1函数
综合以上两个找特征点的函数,可以设计一个新的last1函数。通过执行
[pxy3,error2]=last1(thin,r,txy,num)可以找出周围半径为r个像素的圆内没有任何端点或交叉点,并且沿纹线走num个像素内没有另一个端点或交叉点的端点。
程序如下所示:
function [pxy3,error2]=last1(thin,r,txy,num) error=0;
[pxy2,error]=single_point(txy,r); n=size(pxy2,1); l=1; error2=0; for i=1:n
[error,a,b]=walk(thin,pxy2(i,1),pxy2(i,2),num); if error~=1
pxy3(l,1)= pxy2(i,1); pxy3(l,2)= pxy2(i,2);
pxy3(l,3)= pxy2(i,3); l=l+1; error2=0;
plot(pxy2(i,1) ,pxy2(i,2),'r+'); end end
得到的Matlab运行结果显示为:
图16 last1函数的运行结果
得到的图像如下:
图17 执行last1函数后指纹图像的显示
其中红色的端点为满足single_point函数的端点,红色的纹线为沿上述端点走一定距离后的纹线,一部分可以一直走到规定距离(这些即是要找的特征点),还有一部分走到端点或叉点停止。
至此,每幅指纹图像的特征点均可找出。
4.特征点匹配
4.1 纹线长度匹配 上面,我们已经可以找出每幅指纹图像的特征点,并画出一段纹线。下面就是匹配的问题了。在此,我们设置了三层匹配。 首先是纹线长度匹配。对于上面找出的特征点和纹线,每沿着纹线走5个像素测量一下到原始端点的距离。由distance函数得到。
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
最后会得到一个装有长度信息的数组。试想如果两幅指纹图中的指纹是一样的,则它们会包含相同的特征点和从这个特征点出发画出的纹线,则这两个长度数组对应位置的比例应基本相等(考虑到老师所给的24幅指纹图像大小相同,这个比例应近似为1);最终的函数中定义了一个数f=(sum(abs((d1./d2)-1))),所以f值越接近于0,这两幅图像的匹配度越高。
4.2 三角形边长匹配 找到一个特征点后,可以找出距离其最近的2个端点或交叉点,与原特征点构成三角形,若两幅图像的三角形边长比例相等(本实验中都为1),则说明这两幅图像匹配。
其中,找到距离最近的端点的函数find_point如下所示:
function pxy=find_point(x0,y0,txy,num) x=txy(:,1); y=txy(:,2); n=length(x); l(1,n)=0; lnn=1;
pxy(num,:)=[0,0,0]; for i=1:n
l(i)=sqrt((x(i)-x0)^2+(y(i)-y0)^2); end
ll=sort(l); for i=1:num
xiao=ll(i+lnn); nn=find(l==xiao); lnn=length(nn);
pxy(i,:)=[x(nn(1)),y(nn(1)),txy(nn(1),3)];

