一、​我们想要求的方向场的定义为:

对于任意一点(x,y),该点的方向可以定义为其所在脊线(或谷线)位置的切线方向与水平轴之间的夹角:
将一条直线顺时针或逆时针旋转 180°,直线的方向保持不变。
因此,指纹方向场的取值范围一般定义为[0,π)或[-π/2, π/2),前闭后开区间的意义在于保证方向场取值的唯一性。
二、基于梯度场计算方向场
论文 《Analyzing Oriented Patterns》 网址:https://wenku.baidu.com/view/f741d931cc175527072208f7.html
概述:核心思想便是对其二倍角的分量进行平均,
流程:给定指纹图像I ,其梯度可以表示为,表示x方向的梯度和y方向的梯度
根据已有的梯度场,分别计算
W简单理解就是卷积运算
方向场的计算公式为:
继续可得方向场一致性:

当所有的方向都互相平行时,方向场一致性取最大值 1;反之,当所有的方向都相反时,方向场一致性取最小值 0;在这两种极端情况之间,其值相应的也在 0与 1 之间变化。因此,方向场一致性可以作为方向场有序程度的度量。所以最后结果要做一个0-1之间的normalize.
实现:
//变量
    Mat img = cv::imread( "e:/template/finger.bmp",0); 
    Mat matX;Mat matY;
    Mat Gxx;Mat Gyy;Mat Gxy;//和论文标识对应
    Mat matTheta;//方向场 
    Mat matCoh;//方向场一致性
    //实验图片
    /*Mat matTst = Mat(Size(11,11),CV_8UC1,Scalar(0));
    line(matTst,Point(5,0),Point(5,11),Scalar(255));
    line(matTst,Point(0,5),Point(11,5),Scalar(255));*/
    Mat matTst = img.clone();
    //x方向求导
    Sobel(matTst,matX,CV_16SC1,1,0);
    //y方向求导
    Sobel(matTst,matY,CV_16SC1,0,1);
    //转换为float计算,否则后面算爆掉
    matX.convertTo(matX,CV_32FC1);
    matY.convertTo(matY,CV_32FC1);
    //计算3个G
    Gxx = matX.mul(matX);
    Gyy = matY.mul(matY);
    Gxy = matX.mul(matY);
    Mat kernel8 = Mat(Size(8,8),CV_32FC1,Scalar(1));
    filter2D(Gxx,Gxx,Gxx.depth(),kernel8);
    filter2D(Gyy,Gyy,Gyy.depth(),kernel8);
    filter2D(Gxy,Gxy,Gxy.depth(),kernel8);
    //计算方向场
    Mat matTmp = 2 * Gxy;
    matTmp = matTmp / (Gxx - Gxy);
    matTheta = Mat(matTst.size(),CV_32FC1,Scalar(0));
    for (int i = 0 ;i< matTmp.rows;i++)
        for (int j = 0 ;j<matTmp.cols;j++)
            matTheta.at<float>(i,j) =     0.5 * atan(matTmp.at<float>(i,j)) + 3.1415926/2;
    //计算方向场一致性
    matTmp = Gxx - Gyy;
    matTmp = matTmp.mul(matTmp);
    Mat matTmp2 =  4*Gxy.mul(Gxy);
    matTmp += matTmp2;
    cv::sqrt(matTmp,matCoh);
    matCoh = matCoh / (Gxx+Gxy);
    //显示结果
    normalize(matTheta,matTheta,0,1,NORM_MINMAX);

normalize(matCoh,matCoh,0,1,NORM_MINMAX);

结果:
三、基于hessian特征值的方向场
原理:
参考frangi相关知识
代码:https://github.com/ntnu-bioopt/libfrangi
github frangi项目
调用:
//hessian方法
    frangi2d_opts_t opts;
    opts.sigma_start = DEFAULT_SIGMA_START;
    opts.sigma_end = DEFAULT_SIGMA_END;
    opts.sigma_step = DEFAULT_SIGMA_STEP;
    opts.BetaOne = DEFAULT_BETA_ONE; //ignore blob-like structures?
    opts.BetaTwo = DEFAULT_BETA_TWO; //appropriate background suppression for this specific image, but can change. 
    opts.BlackWhite = true;
    Mat J;Mat Scale;Mat directions;
    img.convertTo(img,CV_32FC1,1.0/255);

frangi2d(img,J,Scale,directions,opts);


结果:




基于梯度场和Hessian特征值分别获得图像的方向场的更多相关文章

  1. MATLAB绘制等高线和梯度场

    clear;clc;close all [X,Y] = meshgrid(-:.:); % 产生网格数据X和Y Z = X.*exp(-X.^ - Y.^); % 计算网格点处曲面上的Z值 [DX,D ...

  2. 4.基于梯度的攻击——MIM

    MIM攻击原论文地址——https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...

  3. 2.基于梯度的攻击——FGSM

    FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...

  4. 3 基于梯度的攻击——MIM

    MIM攻击原论文地址——https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是 ...

  5. 1 基于梯度的攻击——FGSM

    FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...

  6. 数字图像处理-基于matlab-直方图均匀化,傅立叶变换,图像平滑,图像锐化

    直方图均匀化 任务:用MATLAB或VC或Delphi等实现图像直方图均匀化的算法. clc;clear;close all; % 清除工作台 % path(path,'..\pics'); % 设置 ...

  7. C / C ++ 基于梯度下降法的线性回归法(适用于机器学习)

    写在前面的话: 在第一学期做项目的时候用到过相应的知识,觉得挺有趣的,就记录整理了下来,基于C/C++语言 原贴地址:https://helloacm.com/cc-linear-regression ...

  8. 3.基于梯度的攻击——PGD

    PGD攻击原论文地址——https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...

  9. 2 基于梯度的攻击——PGD

    PGD攻击原论文地址——https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...

随机推荐

  1. vue-学习笔记(更新中...)

    vue学习笔记 2017-08-23  11:10:28 Vue实例: var vm = new Vue({ // 选项 }) 实例化Vue.Vue实例,构造函数Vue.创建一个Vue的根实例,Vue ...

  2. chrome中image图片预留位置的问题

    在项目中发现,当设置 <img src="" width="100" height="100"> 通过设置img的width属性 ...

  3. vue报错一

    8080端口被占用 解决方案: 打开cmd输入:netstat -ano查看所有端口信息,如图,找到端口 8080,以及对应的 PID: 输入:tskill PID 即可杀死进程,ex:: tskil ...

  4. FileInputStream与FileOutputStream类 Reader类和Writer类 解析

    FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名. 创建FileInputStream实例对象时,指 ...

  5. This function has none of DETERMINISTIC, NO SQL

    错误信息: [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declara ...

  6. 310实验室OTL问题(2)

    1.PyOptimization代码学习心得 (1).该部分由三个分块组成(按完成的相应的任务).第一部分,运行函数. 以optimization.py为入口程序,其思路是:首先获取路径,然后,初始化 ...

  7. 170515、mybatis批量操作

    //Java代码 public void batchAdd(){ SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession(); Stud ...

  8. PHP对象在内存中的分配

    对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...

  9. blockchain 区块链的开发,基于python或node js

    现在很多人用node js做区块链的开发,因为点对点并发是区块链中的难点技术之一,而node js天然的对并发支持比较好,因此比较有优势. http://ecomunsing.com/build-yo ...

  10. POJ1273:Drainage Ditches(最大流入门 EK,dinic算法)

    http://poj.org/problem?id=1273 Description Every time it rains on Farmer John's fields, a pond forms ...