基于梯度场和Hessian特征值分别获得图像的方向场

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

对于任意一点(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);

结果:

来自为知笔记(Wiz)

时间: 2024-12-25 10:25:19

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

MATLAB绘制等高线和梯度场

1 clear;clc;close all 2 [X,Y] = meshgrid(-2:.2:2); % 产生网格数据X和Y 3 Z = X.*exp(-X.^2 - Y.^2); % 计算网格点处曲面上的Z值 4 [DX,DY] = gradient(Z,0.2,0.2); % 计算曲面上各点处的梯度 5 figure; 6 contour(X,Y,Z) ; % 绘制等高线 7 title('等高线') 8 9 figure; 10 quiver(X,Y,DX,DY) ; % 绘制梯度场 11

基于梯度下降的神经网络

一.特点: 0.无监督的神经网络 1.基于梯度下降 2.固定学习速率 3.离线学习(批量学习)4.隐藏层数目范围:[1, +∞) 4.可以选择激活函数类型 5.numpy强大的矩阵运算能力 二.效果:未分类: 隐藏层:[6,4]效果: 隐藏层:[6,5,3]效果: 三.代码: import numpy as np ''' 无监督的神经网络 1.基于梯度下降 2.固定学习速率 3.离线学习(批量学习) 4.可以选择激活函数类型 5.numpy强大的矩阵运算能力 ''' class NeuralNe

理解GBDT算法(三)——基于梯度的版本

上一篇中我们讲到了GBDT算法的第一个版本,是基于残差的学习思路.今天来说第二个版本,可以说这个版本的比较复杂,涉及到一些推导和矩阵论知识.但是,我们今天可以看到,两个版本之间的联系,这个是学习算法的一个重要步骤. 这篇博文主要从下面这几个方面来说基于梯度的GBDT算法: (1)算法的基本步骤: (2)其中的学数学推导: (3)基于梯度的版本和基于残差的版本之间的联系: 在讲解算法的详细步骤之前,我们可以先明确一个思路,就是梯度版本的GBDT是用多类分类Multi-class classific

基于梯度的攻击——MIM

MIM攻击原论文地址——https://arxiv.org/pdf/1710.06081.pdf 1.MIM攻击的原理 MIM攻击全称是 Momentum Iterative Method,其实这也是一种类似于PGD的基于梯度的迭代攻击算法.它的本质就是,在进行迭代的时候,每一轮的扰动不仅与当前的梯度方向有关,还与之前算出来的梯度方向相关.其中的衰减因子就是用来调节相关度的,decay_factor在(0,1)之间,decay_factor越小,那么迭代轮数靠前算出来的梯度对当前的梯度方向影响越

Hessian RPC示例和基于Http请求的Hessian序列化对象传输

本文主要介绍两个案例,第一个是使用Hessian来实现远程过程调用,第二个是通过Hessian提供的二进制RPC协议进行和Servlet进行数据交互,Hessian本身即是基于Http的RPC实现. 案例一: 1.准备工作 这里建立一个Maven项目,其中包含四个模块,父模块(仅用来聚合其它模块,不做实际使用),服务器端模块,客户端模块,API模块(远程过程接口,供服务器和客户端使用).目录结构见下图: 2.添加Hessian的依赖 由于客户端和服务器都要依赖Hessian的包,这里可以添加到父

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

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

基于Bilateral Attention和Pyramid Filling Block的图像修复方法

One-Stage Inpainting with Bilateral Attention and Pyramid Filling Block 论文链接:https://arxiv.org/abs/1912.08642 源码地址:https://github.com/KumapowerLIU/One-Stage-Inpainting-with-Bilateral-Attention-and-Pyramid-Filling-Block 1. 引言 这篇论文解决的问题是图像修复(Image inpa

基于matlab的退化图像复原(一)------图像退化处理

图像恢复技术是图像处理领域一类重要的处理技术,与图像增强等其他基本图像处理技术类似,该技术也是以获取视觉质量得到某种程度改善为目的的,所不同的是图像恢复过程需要根据指定的图像退化模型来完成,根据这个退化模型对在某种情况下退化或恶化了的退化图像进行恢复,以获取到原始的.未经过退化的原始图像.换句话说,图像恢复的处理过程实际是对退化图像品质的提升,并通过图像品质的提升来达到图像在视觉上的改善. 这是MATLAB的自带函数库里的一些函数, 把它调用出来研究理解一下 分别是运动模糊,圆盘模糊,钝化模糊.

基于C#的机器学习--面部和动态检测-图像过滤器

原文地址:https://www.cnblogs.com/wangzhenyao1994/p/10386907.html