Geodesic in Heat: 一种测地线计算方法

2023-12-05 22:12

本文主要是介绍Geodesic in Heat: 一种测地线计算方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的博客中,我已经介绍过了使用Fast Marching算法计算测地线。Fast Marching的好处是实现简单,方便扩展在点云上。但是缺点是精度不够,求解不平滑。早在2013年,Crane et al. [1]就已经提出利用热流来估算测地距离。我很早就知道这个解决方案,大概是利用了拉普拉斯余切权重来实现一个二阶偏微分计算,以获得更精确的结果。这次恰好要做点云上的测地线计算,就把原文下载下来好好的学习一下。不看不知道,一看吓一跳,方法设计的很精巧,数学符号很花哨,对我浅薄的微分几何基础认知带来了极大的挑战。我决定在这篇博客中浅谈一下对这篇文章的理解,起到一个抛砖引玉的作用,如果有写错的地方,诚恳的希望高手指点,也让我提升一下。


1. 基本思路

Geodesics in heat的基本思路相对容易理解。首先估算一个基于热流的标量函数,之后对该标量函数对应的梯度向量场进行归一化计算,再用Possion方程平滑一下,即得到最后对测地距离场的精确估算。在Fast Marching算法中,我们已经知道了利用波动方程求解测地距离的一个离散方法。缺点是对钝角三角形敏感。究其原因,是因为点的位置关系不是规则的,或非各向同性的。这使得由一个源点向四周扩散时,计算外边的点到源点的距离时,不能直接相关的边累加,而是要通过一个微分方程间接的求解一种平滑的能力传递,以获得准确的结果。一点在接收他相关的点传递给他的能量或者累计距离时,需要考虑更复杂的标量函数平滑条件,而非直接连接一条边。如果你读不懂上述文字,没关系,看一个例子你就明白了:

这里假设由一个离散网格(2-manifold),我们希望计算红色点到紫色点的距离(a)。最直接的想法是直接计算他们的欧氏距离(b)。显然,这不是测地距离,因为已经脱离了网格本身。那么,我们需要逐步的计算测地线,即首先找到红色点的一邻域点,即绿色点(c)。在绿色点的基础上,我们在迭代搜索其一邻域,直到找到紫色点,累加边的长度就得到一个测地线的近似(d)。这个计算比欧氏距离好一些,但是显然还是不够精确。因为我们没有考虑距离传递是要以源点为起点的,叠加边界相当于不断改变源点,即改变了距离传递的方向。我们希望距离的传递在某一个方向上是平滑的。假设有这样一个函数,在每一个点上有一个标量值。我们希望这个函数的标量值对应测地距离,那么这个函数的梯度应该是恒定的。求测地线距离即转换成了求标量函数。回顾一下之前的步骤,我们利用局部的网格来构建一种点的关系(e),这种关系用来显性的表示函数的梯度。利用梯度,我们就能够通过微分方程,反向求解出函数,获得每个点的标量值。这就是利用微分方程求解测地线距离的核心思想。

Geodesics in heat的核心思想符合上述的描述,该方法利用物理上的热流,首先估计一个标量函数。这个标量函数的值对应一种粗糙的测地距离估计。其最大的问题就是梯度不均衡。作者在此基础上,通过对该标量函数的梯度归一化,而后解一个Possion方程,得到对原始标量函数的平滑。平滑后的标量函数即对应最终的测地距离估计。这个方案的好处是,通过两个简介的分段线性方程求解,以求解非线性的测地线计算问题。上述计算并未严格要求数据格式,可以方便扩展在任意的三维数据上,如体素、点云、多面体等。

2. 算法步骤

Geodesics in heat的总共包括三个步骤,即对热流标量函数求解,梯度归一化,最后解Possion方程。作者在论文中给出了对应的步骤:

论文在开始处就提高了基于热核的测地线显性表示:

Φ表示测地距离,x,y表示两个顶点,t表示事件,k表示heat kernel。我的理解是,当t足够小的时候,热量传导的距离即对应测测地距离。这里作者提议用大量的篇幅指出,热核推出的标量函数智能被认为是测地距离的粗糙拟合。只有在梯度均衡的情况下,其拟合结果的精度才能被保证。其误差被表示为下图:

因此,当利用热核求解处标量函数后,需要对梯度进行归一化,再解一次Possion方程才能获得精确的测地线拟合结果。(上面那个图我并没有看懂,猜测是说测地线在流形上的距离传播应该是线性的,但是热核函数的拟合误差,在实际计算时,会产生非线性的结果)。作者另外给了一个图,来进一步说明这种非线性变化的差异:

左图为热核推出的标量函数结果,右图为Possion方程求解后的结果。

这样,我们就大致了解了Geodesics in heat的三个求解步骤:

即首先获得热核推导的标量函数u,对应一个非均匀的梯度分布▽u,对▽u归一化,得到向量场X,基于X,解Possion方程,获得最后的标量函数Φ,即对应测地距离。

在面片上的计算方法

如果你对上述描述完全不感冒,不用担心,直接给网格计算的实例,或许能够启发你对整个求解过程的理解。首先我们给出一个点的拉普拉斯离散表示:

这里的网格和前面的网格实例是一样的。我们希望求从一个源点出发,到i和j两点的测地距离ui和uj。ui和uj基于他们相关边夹角的关系即构成了一个点的拉普拉斯表示,你可以简单理解为点与点的权重关系。Ai为面积元素,值为与i点相关的所有面片的面积的1/3。我们把所有点的拉普拉斯离散表示构建成一个矩阵形式:

A即Ai构成的n*n的diagonal matrix,Lc为n*n的余切权重算子,两项刚好对应前边Lu的计算过程。基于Lc和A我们就能够列出一个求Heat flow的方程:

t为时间,我查了作者的报告,这个t的取值对于估算结果是有影响的:

作者建议根据实际误差的考察,t取h^2,h为全局平局距离:

为Kronecker delta(克罗内克δ函数),即一个二值函数,源点为1,其余点为0。这样我们对对方程(A-tLc)u=δ的各项进行了规定,以求解u,即热流对应的标量函数。

之后我们对u求其梯度:

N为面片的单位法向,其他量对应图片可以很容易的理解。在对u的梯度进行归一化获得新的梯度场X,而后对X列出拉普拉斯,即

b即为,上述方程即利用Possion方程对Φ求解。如果你熟悉拉普拉斯线性系统求解问题,那么到这里,你就可以利用线性求解方法,得到Φ,即基于某一源点的测地距离。有兴趣了解具体解法的同学,可以参考我的另外一篇博客:基于测地距离场的三维人脸参数化方法

看到这里,又想起当年微分几何老师那句经典的话,如果几何分析只有一个重要的概念,那个概念就是拉普拉斯,老师诚不欺我!Crane还介绍了在点云计算的方法,大体利用的是维诺图建立局部邻接关系,这里不再展开。

这里展示一些结果图,整体来说,还是非常精巧的一个解法:

Reference

[1] Crane K, Weischedel C, Wardetzky M. Geodesics in heat: A new approach to computing distance based on heat flow[J]. ACM Transactions on Graphics (TOG), 2013, 32(5): 1-11.

这篇关于Geodesic in Heat: 一种测地线计算方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459343

相关文章

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

IBS和IBD的区别和计算方法介绍

大家好,我是邓飞。 今天介绍一下IBS和IBD的区别: IBS(肠易激综合症)和IBD(炎症性肠病)是两种不同的消化系统疾病,主要区别如下: IBS(Irritable Bowel Syndrome):是一种功能性肠道疾病,主要表现为腹痛、腹胀、腹泻或便秘,症状通常与饮食、压力和心理因素相关,没有明显的器质性病变。 IBD(Inflammatory Bowel Disease):是一组

OpenStack离线Train版安装系列—10.控制节点-Heat服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件?会不会很慢? 俺回了一句“现在的机器性能好,没啥问题”。 然后大家开始谈论机器的配置了。哎,俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义         public struct Rec         {             public int v1;             publi

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

CVPR 2024最新论文分享┆YOLO-World:一种实时开放词汇目标检测方法

论文分享简介 本推文主要介绍了CVPR 2024上的一篇论文《YOLO-World: Real-Time Open-Vocabulary Object Detection》,论文的第一作者为Tianheng Cheng和Lin Song,该论文提出了一种开放词汇目标检测的新方法,名为YOLO-World。论文通过引入视觉-语言建模和大规模预训练解决了传统YOLO检测器在固定词汇检测中的局限性。论

JWT详解:一种轻量级的身份验证和授权机制

引言 JSON Web Token(JWT)是一种基于JSON格式的开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。JWT因其轻量级、可扩展性和安全性,在Web应用程序和RESTful API中得到了广泛应用。本文将详细解析JWT的概念、结构、工作原理、应用场景以及使用时的安全注意事项。 JWT的基本概念 JWT是一种用于在用户和服务器之间传递安全

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

一种实现微观单线程,宏观上多线程的方法

1. 纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观上的多线程呢?这个用到两个东西:一是中断,二是switch语句。听老夫为你细细道来。   2. 举个例子来说,比如我想要实现的是:MCU每2秒通过6个USART向外发送数据。一般大家首先想到的是,配置一个定时器,每2S进入一个中断函数,然后中