• 指纹识别源代码(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)闭运算

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


  • 相关阅读:
    1048. Find Coins (25)
    return view 详解 MVC
    EF Power Tool 代码生成器 反向生成
    对新数据库使用 Code First
    一个成熟的网站的架构设计应该是这样的
    公司业务的设计思想感悟
    请给奋斗中的男人们一次机会
    大话西游感悟
    充满恶意的单词
    lisp的解释器
  • 原文地址:https://www.cnblogs.com/mrcharles/p/11879799.html
Copyright © 2020-2023  润新知