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

对于任意一点(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. 【Java nio】Blocking nio2

    package com.slp.nio; import org.junit.Test; import java.io.File; import java.io.IOException; import ...

  2. 基于TINY4412的Andorid开发-------简单的LED灯控制

    参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:pengdonglin137@163.com 平 ...

  3. 使用springBoot进行快速开发

    springBoot项目是spring的一个子项目,使用约定由于配置的思想省去了以往在开发过程中许多的配置工作(其实使用springBoot并不是零配置,只是使用了注解完全省去了XML文件的配置),达 ...

  4. 使用log4net记录日志到数据库(含有自定义属性)

    记录日志是管理系统中对用户行为的一种监控与审核,asp.net中记录日志的方式有很多种,这里我只介绍一下最近用到的log4net,关于他的具体介绍网上有很多,我讲一下他的用法. 第一步:在配置文件中的 ...

  5. 【BZOJ4195】[Noi2015]程序自动分析 并查集

    [BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...

  6. oracle的connect by level的示例

    SELECT regexp_substr('CITY_AA,CITY_BB,CITY_CC,CITY_DD', '[^,]+', 1, LEVEL) t FROM dualCONNECT BY reg ...

  7. 修改MySQL命令提示符

    当前session可以直接用prompt修改 mysql> prompt \u@\h \d \r:\m:\s>PROMPT set to '\u@\h \d \r:\m:\s>'ro ...

  8. maven学习(二)(转)

    一.maven父工程与子模块的拆分与聚合原理 问题描述:将ssh工程拆分为多个模块开发 1.1.拆分原理 创建一个maven project(pom),然后在创建三个子模块(maven moudule ...

  9. CentOS7安装步骤详解

    准备环境 1.虚拟机  VMware Workstation 2.Centos7-64位安装包  ( CentOS-6.7-x86_64-bin-DVD1.iso ) 开始安装   进入安装初始化界面 ...

  10. 【gulp】前端自动化工具---gulp的使用(一)------【巷子】

    什么是gulp?   基于node的自动化构建工具   扩展:开发的时候分为2个节点一个是开发阶段  另一个是部署阶段        开发阶段:源文件不会被压缩            部署阶段:所有文 ...