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

news2024/11/29 8:49:29

在之前的博客中,我已经介绍过了使用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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1286260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java核心技术:Java工程师的实用干货笔记

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在Java工程师的职业生涯中,深入理解…

使用C语言创建高性能网络爬虫IP池

目录 一、引言 二、IP池的设计 1、需求分析 2、架构设计 3、关键技术 三、IP池的实现 1、存储实现 2、调度实现 3、通信实现 4、异常处理实现 四、代码示例 五、性能优化 六、测试与分析 七、结论 一、引言 随着互联网的快速发展,网络爬虫成为了获取…

日志JavaAgent-NoClassDefFoundError

一、引言 组内最近做了一个日志公共组件,用的是javaagent的方式,之前搞的maven jar包每次都要把所有系统都发一遍,太麻烦。 javaagent通过Java虚拟机(JVM)的Instrumentation API来实现代码的侵入。通过Instrumentation…

matlab diff和gradient

gradient 求解梯度。 示例 FX gradient(F) 返回向量 F 的一维数值梯度。输出 FX 对应于 ∂F/∂x,即 x(水平)方向上的差分。点之间的间距假定为 1。 使用方法: x -2:0.2:2; y x’; z x .* exp(-x.^2 - y.^2); [px,py] gradien…

K8S部署nginx并且使用NFS存储数据

安装NFS 在master安装NFS systemctl start nfs-server修改配置 /etc/exports /data *(rw,no_root_squash,no_all_squash,sync)目录为 /data 允许所有地址访问 验证下 [rootmaster nginx]# showmount -e 192.168.57.61 Export list for 192.168.57.61: /data *共享可以正常…

1.uniapp基础

1.uniapp基础 官方文档:uni-app官网 1.1开发工具 (1)工具: HBuilderX HBuilderX-高效极客技巧 1.2 新建项目 (1) 文件》新建项目 ​ (2)选择相应的配置信息,填写项目根路…

python超详细基础文件操作【建议收藏】

文章目录 前言1 文件操作1.1 文件打开与关闭1.1.1 打开文件1.1.2 关闭文件 1.2 访问模式及说明 2 文件读写2.1 写数据(write)2.2 读数据(read)2.3 读数据(readlines)2.3 读数据(readline&#x…

数据结构 / 队列 / 循环队列 / 概念

1. 定义 为充分利用向量空间,克服假溢出现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储…

正式发布! 加速科技ST2500A飙速赶来!

在新场景、新应用海量增长的驱动下,芯片测试需求也在日益多元化和快速扩展。加速科技始终致力于以客户的实际需求为导向,基于领先的半导体测试技术为千行百业提供全场景的测试解决方案,推出新一代ST2500A数模混合信号测试机。 ST2500A是基于…

(六)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法(TTA&#xf…

Linux-Linux安装JDK及配置环境 及 遇到的问题

下载linux环境对应的JDK的tar.gz包 配置JDK环境:编辑 sudo vim /etc/profile 在文件的最下方,填写 export JAVA_HOME/usr/local/src/software/jdk1.8 export CLASSPATH.:$JAVA_HOME/lib/tools.jar export PATH$JAVA_HOME/bin:$PATH 执行生效命令&…

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction,并把 my_transaction传递给my_scoreboard。在UVM中,通常使用TLM(Transaction Level Modeling)实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中,数…

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

Spring AOP解析

基本概念 之前写过如何实现方法增强,见链接:一篇文章了解如何实现方法增强,实现原理即采用的是AOP,那么本篇文章就主要是为了了解Spring AOP的实现。 面向切面编程(Aspect Oriented Programming) 在软件…

Apollo新版Beta技术沙龙,震撼来袭!

在2023年12月2日,我有幸参加百度Apollo举行的技术交流活动,Apollo是一个百度公司开发的开源的自动驾驶项目,这次线下技术交流让我对自动驾驶有了深入的了解。 在活动中,来自Apollo项目的专家们对 Apollo 技术的进行介绍和演示。他…

ValueError: not enough values to unpack (expected 3, got 2)

我在使用cv2.findContours函数中遇到以上错误,经查询找到该错误原因: 在 OpenCV 4.X 中,函数 cv2.findContours()仅有两个返回值, 其语法格式为: contours, hierarchy cv2.findContours( image, mode, method) 若不…

2023版本idea插件开发踩坑记录(一)

在进行idea开发的时候,开始仿照着写第一个插件hello world的时候,运行的时候一直运行不成功。参考了很多博客都是如此 后面对官方文档读了一遍,就发现其中的原委,这个的话估计会有很多人跟我一样踩坑 具体原因是,idea插…

你知道小红书小眼睛的推送机制吗?

明明很用心地发笔记,小眼睛就是不多,是不是你看到自己笔记的小眼睛低就头痛? 首先我们要知道小眼睛是什么!推送机制是什么!搞清楚才能把这项数据提升起来。

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板,以及一个通用的向量类模板和一个字符串类作为其派生类,以满足各种应用场景中的数据存储和处理需求。 项目内容: 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…