指纹识别源代码(3)-特征点匹配

特征点匹配主要采用三个方法
1.根据距离判断

找到某一个特征点,从该特征点沿着纹线走num个距离,并计算出每走一步距离该特征点的距离,最后会得到num个装有长度信息的数组,如果两幅指纹相同则他们含有相同的特征点而且得到的数组对应的位置的数据基本相等

% 特征点匹配
% 纹线长度匹配 对于找到的特征点和纹线 沿着纹线走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 匹配度越高
%判断离端点num距离内是否有另一端点
function [error,a,b]=walk(thin,x0,y0,num)
error=0;
thin(x0,y0)=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))));
                    %=0代表一个断点(独立的点) dayu2代表不是端点
               
                    if(t1==0||t1>2)
                        error=1;
                        a=x0;
                        b=y0;
                        break;
                    else
                        % x,y还是y,x
                        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

2.三角形边长匹配,找到一个特征点以后,可以找出距离最近的两个端点与原特征点构成三角形,若两幅图的三角形的边长比例相等则说明两幅图匹配

% 特征点匹配
% 三角形边长匹配
% 找到一个特征点后,可以找出距离其最近的两个端点,与原特征点构成三角形,瑞两幅图像的三角形边长比例相等,则说明匹配
% 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 匹配度越高
3.点类型匹配

4.找到一个特征点以后,找出距离最近的num个端点,统计num个端点中端点和交叉点的个数,若两幅图匹配,则端点占的比例大致相同

相关:

(1)中值滤波

    利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化。

(2)开运算

  先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

(3)闭运算

    先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
  


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrCharles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值