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.

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

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

相关文章

Hadoop学习笔记(HDP)-Part.14 安装YARN+MR

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

一文7个步骤教你搭建测试web测试项目实战环境,

​今天小编,给大家总结下web 测试实战的相关内容,一起来学习下吧! web项目实战可按顺序依次为:【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】…

编写并调试运行一个简单的 Java 应用程序,显示自己的学号、姓名、兴趣爱好等。

源代码: public class Main { public static void main(String[] args) { System.out.println("学号是:""0233217821"); System.out.println("姓名是:""赵港"); System.out.println("兴趣爱好是:""运动&qu…

想要精确搜索商品详情?闲鱼电商API接口帮你实现!

闲鱼电商API接口是一种为开发者提供的强大工具,它能够帮助开发者轻松获取闲鱼平台上的商品信息,实现精确搜索商品详情功能。无论你是想要开发一个自有电商平台,还是需要定制商品搜索功能,闲鱼电商API接口都能够满足你的需求。 API…

C++检测字符串中有效的括号个数

匹配一个字符串buf中&#xff0c;连续包换运算符reg的次数&#xff1a; #include <iostream>//return 返回匹配的字符个数 //buf, 要检测的字符串 //reg, 包含的连续运算符 int GetMatchCount(std::string& buf, std::string& reg) {int nMatchCount 0;if (reg.…

提高Idea编码速度和插件自用推荐

非常推荐 Easy Javadoc 一款注释生成器&#xff0c;很好使~免费&#xff0c;配合使用腾讯、百度之类的翻译免费额度完全够用了&#xff0c;印象中是50万字符每月。下图是使用快捷键生成的注释&#xff08;我采用鼠标侧面按键&#xff0c;随手一按很方便&#xff09; Chinese …

制作一个RISC-V的操作系统四-嵌入式开发介绍

文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1联系4-2练习4-3 什么是嵌入式开发 程序跑到开发板上&#xff0c;或者说运行到硬件上 交叉编译 简单理解交叉编译来说…

Mybaits 动态sql 整理

一 常见的 MyBatis 是一个流行的 Java 数据持久化框架&#xff0c;它提供了灵活的动态 SQL 查询功能&#xff0c;让开发者可以根据需要构建动态的 SQL 查询语句。下面是 MyBatis 中常用的动态 SQL 构建方式&#xff1a; 1. if 元素&#xff1a;用于根据条件判断是否包含某个 …

Web自动化测试怎么做?Web网页测试全流程解析

1、功能测试 web网页测试中的功能测试&#xff0c;主要测试网页中的所有链接、数据库连接、用于在网页中提交或获取用户信息的表单、Cookie 测试等。 &#xff08;1&#xff09;查看所有链接&#xff1a; 测试从所有页面到被测特定域的传出链接。 测试所有内部链接。 测…

设计模式之创建型模式(单例、工厂方法、抽象工厂、原型、建造者)

文章目录 一、设计模式二、设计模式的六大原则三、设计模式分类四、单例设计模式五、工厂方法六、抽象工厂七、原型模式八、建造者模式 一、设计模式 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用…

JSP 设置静态文件资源访问路径

这里 我们先在 WEB目录webapp 下创建一个包 叫 static 就用它来存静态资源 然后 我们扔一张图片进去 我们直接这样写 如下图 找到父级目录 然后寻找下面的 static 下的 img.png 运行代码 很明显 它没有找到 这边 我们直接找到 webapp目录下的 WEB-INF目录下的 web.xml 加入…

temu最近数据:拼多多旗下跨境电商平台的业绩持续增长

据最近的报道和数据显示&#xff0c;拼多多旗下的跨境电商平台Temu在2023年第三季度取得了显著的业绩增长。销售额突破50亿美元&#xff0c;市场份额不断扩大&#xff0c;用户数量迅速增长。本文将深入探讨Temu的业绩增长、市场份额、用户增长以及其营销策略。 先给大家推荐一款…

3d家居产品虚拟三维展示提升企业的品牌竞争力

2D展示逐渐难以满足消费者需求&#xff0c;因此基于3D三维展示制作平台将产品或服务以三维形式呈现的3D三维展示更受客户和企业青睐&#xff0c;也大幅提升企业的营销推广效果。那么3D三维展示制作平台如何赋能企业营销推广呢? 首先&#xff0c;3D三维展示制作平台能够提供更加…

Avalonia开发之HelloWrold

前言 本文所有讲解是以VS2022为开发工具&#xff0c;官方提供了VS2022和2019的扩展支持&#xff0c;大家根据自己的是实际情况下载相应的扩展进行安装。 安装扩展 如下图&#xff0c;我们在扩展菜单里面找到扩展管理&#xff0c;如下图&#xff1a; 在扩展管理的搜索栏里面…

一文带你了解Java中synchronized原理

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是Java中 synchronized 的基本原理 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff…

分享Python给自己写的函数添加注释的小功能

def get_ips(prefix: str, suffix: int) -> List[str]:"""获取 IP 地址段。Args:prefix: IP 地址的前缀。suffix: IP 地址的后缀。Returns:IP 地址列表。"""... """ """ 就是注释开始以及注释结束。 效果&a…

C语言学习笔记之数组篇

数组是一组相同类型元素的集合。 目录 一维数组 数组的创建 数组的初始化 数组的使用 数组在内存中的存储 二维数组 数组的创建 数组的初始化 数组的使用 数组在内存中的存储 数组名 数组名作函数参数 一维数组 数组的创建 type_t arr_name [const_n]; //type_…

华为 ArkTS 边框怎么设置,单边边框怎么设置以及条件设置边框(鸿蒙开发)

一、实例代码&#xff1a; border(params) 接收一个对象参数&#xff0c;对象参数的属性为width?: Lenght&#xff0c;color?: &#xff0c;radius?: Length,style?: BorderStyle 注意&#xff1a;以下实例包含了我说知道的 边框的单位 以及 颜色 的各种用法 Column() {Im…

【已解决】MySQL:执行存储过程报错(MySQL字符集和排序方式冲突)

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、转换条件两边的字段或值为二进制数据&#xff1a; 2、转换条件两边的字段或值的字符集和排序方式&#xff1a; 3、修改列、表、库的字符集和排序方式 参考链接&#xff1a; 问…

微信商城小程序怎么制作?做一个小程序需要什么流程?

小程序商城对商家有哪方面的帮助&#xff1f; 随着移动互联网的快速发展&#xff0c;小程序商城已经成为了越来越多商家的选择。那么&#xff0c;小程序商城到底对商家有哪些方面的帮助呢&#xff1f; 一、提高商家曝光度 在小程序平台上开设自己的小程序商城&#xff0c;可以…