Hausdorff距离定义与计算方法

当谈论距离时,我们通常指的是最短距离:例如,如果说点 X 距离多边形 P 的距离为 D,我们通常假设 D 是从 X 到 P 的最近点的距离。同样的逻辑也适用于多边形:如果两个多边形 A 和 B 彼此相距一定距离,我们通常将该距离理解为 A 的任何一点和 B 的任何一点之间的最短距离。正式地,这称为极小函数,因为 A 和 B 之间的距离 D 由以下公式给出:

这个等式读起来就像一个计算机程序:“对于 A 的每个点 a,找到它到 B 的任意点 b 的最小距离;最后,保留所有点 a 之间的最小距离”。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

多边形之间的距离定义对于某些应用来说可能非常不令人满意;让我们看图 1 的例子。我们可以说,考虑到三角形的最短距离(由红色顶点显示),它们彼此接近。然而,我们自然会认为这些多边形之间的距离很小意味着一个多边形的任何一点都不远离另一个多边形。从这个意义上讲,图 1 中所示的两个多边形并不那么接近,因为它们的最远点(以蓝色显示)实际上可能离另一个多边形非常远。显然,最短距离完全独立于每个多边形的形状。

图 1:最短距离没有考虑整个形状

图 2 给出了另一个示例,其中我们有两个三角形,它们之间的最短距离与图 1 中的相同,但位置不同。很明显,最短距离概念的信息量非常小,因为距离值与前一种情况相比没有变化,而物体确实发生了一些变化。

图 2:最短距离不考虑物体的位置

正如我们将在下一节中看到的那样,尽管Hausdorff距离看起来很复杂,但它确实捕捉到了最短距离忽略的这些细微之处。

1、什么是Hausdorff距离?

Hausdorff距离以费利克斯·豪斯多夫 (1868-1942) 的名字命名,是“一个集合到另一个集合中最近点的最大距离” [Rote91]。更正式地说,从集合 A 到集合 B 的豪斯多夫距离是一个最大最小函数,定义为:

其中 a 和 b 分别是集合 A 和 B 中的点,d(a, b) 是这些点之间的任意度量;为简单起见,我们将 d(a, b) 视为 a 和 b 之间的欧几里得距离。例如,如果 A 和 B 是两组点,则暴力算法如下所示:

1.  h = 0
2.  for every point ai of A,
      2.1  shortest = Inf ;
      2.2  for every point bj of B
                    dij = d (ai , bj )
                    if dij < shortest then
                              shortest = dij
      2.3  if shortest > h then
                    h = shortest

以下是暴力计算过程的图示:

Hausdorff距离计算:第一步

Hausdorff距离计算:第二步

Hausdorff距离计算:第三步

Hausdorff距离计算:第四步

Hausdorff距离计算:第五步

Hausdorff距离计算:第六步

Hausdorff距离计算:第七步

Hausdorff距离计算:第八步

该算法显然在 O(n m) 时间内运行,其中 n 和 m 是每组中的点数。

应该注意的是,Hausdorff距离是有方向的(我们也可以说不对称),这意味着大多数时候 h(A, B) 不等于 h(B, A)。这个一般条件也适用于上面的示例,因为 h(A, B) = d(a1, b1),而 h(B, A) = d(b2, a1)。这种不对称性是最大最小函数的属性,而最小最小函数是对称的。

Hausdorff距离的更一般定义是:

H (A, B) = max { h (A, B), h (B, A) }

它定义了 A 和 B 之间的Hausdorff距离,而公式 2 适用于从 A 到 B 的豪斯多夫距离(也称为有向Hausdorff距离)。两个距离 h(A, B) 和 h(B, A) 有时被称为 A 到 B 的前向和后向Hausdorff距离。虽然作者之间术语尚未稳定,但上面的公式通常用于谈论豪斯多夫距离。除非另有说明,否则从现在起,我们在说“豪斯多夫距离”时也会引用上面公式。

如果集合 A 和 B 由线或多边形而不是单个点组成,则 H(A, B) 适用于这些线或多边形的所有定义点,而不仅仅是它们的顶点。暴力算法不再适用于计算此类集合之间的豪斯多夫距离,因为它们涉及无限数量的点。

2、多边形的Hausdorff距离

那么,图 1 中的多边形怎么样?请记住,它们的一些点很接近,但不是全部。豪斯多夫距离通过指示一个多边形上任何一点与另一个多边形之间的最大距离,给出了它们相互接近度的有趣度量。比最短距离更好,最短距离仅适用于每个多边形的一个点,而不考虑多边形的所有其他点。

图 4:图 1 中每个三角形极值周围的豪斯多夫距离。每个圆的半径为 H(P1, P2)

另一个问题是,最短距离对多边形位置的不敏感性。我们看到,这种距离根本不考虑多边形的布置。这里,Hausdorff距离再次具有对位置敏感的优势,如图 5 所示:

图 5:图 4 中三角形在最短距离相同但位置不同的情况下的豪斯多夫距离

3、计算凸多边形之间的Hausdorff距离

在下面的讨论中,我们假设多边形 A 和 B 具有以下事实:

  • 多边形 A 和 B 是简单的凸多边形;
  • 多边形 A 和 B 彼此不相交,即:a)它们不相交;b)没有多边形包含另一个。

3.1 引理

下一节中解释的算法基于此处介绍的三个几何观察。为了简化文本,我们假设两个点 a 和 b 分别属于多边形 A 和 B,这样:

d (a, b) = h (A, B)

简而言之,a 是多边形 A 相对于多边形 B 的最远点,而 b 是多边形 B 相对于多边形 A 的最近点。

  • 引理 1a

在 a 处垂直于 ab 的线是 A 的一条支撑线,并且 A 与 B 相对于该线位于同一侧。

  • 引理 1b:

在 b 处垂直于 ab 的线是 B 的一条支撑线,并且 a 和 B 相对于该线位于不同侧。

  • 引理 2:

A 有一个顶点 x,使得从 x 到 B 的距离等于 h (A, B)。

  • 引理 3:

让 bi 为 B 中距离 A 顶点 a i 最近的点。如果 µ 是从 bi 到 bi+1 的移动方向(顺时针或逆时针),那么,对于穿过 A 所有顶点的完整循环,µ 变化不超过两次。

3.2 算法

本文介绍的算法由 [Atallah83] 提出。其基本策略是依次计算 h(A,B) 和 h(B, A) ;根据引理 2,无需查询起始多边形的每个点,而只需查询其顶点。

该算法使用的一个重要事实是,最近点只能是目标多边形的顶点,或垂直于其一条边的线的脚 z。

这一事实表明,可以使用一个函数来检查可能的最近点是否存在。给定一个源点 a 和一个由点 b1 和顶点 b2 定义的目标边:

函数 z = CheckForClosePoint (a, b1 , b2 ):

  • 计算通过 b1 和 b2 的线与通过 a 的垂线相交的位置 z;
  • 如果 z 位于 b1 b2 之间,则返回 z;
  • 否则,在 b2 处计算与线 ab2 垂直的线 P;
  • 如果 P 是 B 的支撑线,则返回 b2;
  • 否则返回 NULL。

该函数显然使用引理 1b 来决定 B 的最近点是否可能位于目标边上,即应该靠近 a。它还假设源点 a 和 b2 不位于 b1 处 [b1b2 ] 垂线的不同侧,根据引理 3。

现在我们准备好进行主要算法;假设两个多边形的顶点按逆时针方向枚举:

1.  From a1, find the closest point b1 and compute d1 = d ( a1, b1 )
2.  h(A, B) = d1
3.  for each vertex ai of A,
      3.1  if ai+1 is to the left of aibi
                     find bi+1 , scanning B counterclockwise with CheckForClosePoint from bi
              if ai+1 is to the right of aibi
                     find bi+1 , scanning B clockwise with CheckForClosePoint from bi
              if ai+1 is anywhere on aibi
                      bi+1 = bi
      3.2  Compute di+1 = d (ai+1 , bi+1 )
      3.3  h (A, B) = max { h (A, B), di+1 }

3.3 复杂度

如果多边形 A 和 B 分别有 n 和 m 个顶点,则:

  • 步骤 1 显然可以在 O(m) 时间内完成;
  • 步骤 2 需要常数时间 O(1) ;
  • 步骤 3 将执行 (n-1) 次,即 O(n) ;
  • 步骤 3.1 总共不会执行超过 O(2m)。这是引理 3 的结果,它保证多边形 B 不能被扫描超过两次;
  • 步骤 3.2 和 3.3 在常数时间内完成 O(1) ;

因此,计算 h(A, B) 的算法需要:

O(m) + O(n) + O(2m) = O(n+m)

为了找到 H(A, B),该算法需要执行两次;计算豪斯多夫距离的总复杂度保持线性到 O(n+m)。


原文链接:Hausdorff 距离 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端 JS 经典:动态执行 JS

前言&#xff1a;怎么将字符串当代码执行。有 4 中方式实现 eval、setTimeout、创建 script 标签、new Function 1. eval 特点&#xff1a;同步执行&#xff0c;当前作用域 var name "yq"; function exec(string) {var name "yqcoder";eval(string); …

数据结构---力扣232.用栈实现队列(C

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a; 栈 是 后进先出 队列 是 先进先出 让一个栈&#xff08;s1&#xff09;作为空栈&#xff0c;入队列的栈 另一个&#xff08;s2&#xff09;作为非空栈&#xff0c;出队列的栈…

经典的带环链表问题(链表补充)

环形链表1 运用快慢指针的方法&#xff0c;fast ,slow从头节点出发&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;若有环&#xff0c;快指针先进环&#xff0c;后续如果慢指针和快指针相遇&#xff0c;则链表带环。转换成了追击问题。 struct ListNode {int v…

品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义

在当今日益全球化的经济环境中&#xff0c;品牌与产品之间的关系对于企业的成功与否起着至关重要的作用。然而&#xff0c;在消费者做出购买决策时&#xff0c;他们到底是在选择产品本身&#xff0c;还是在选择附着在产品之上的品牌价值&#xff1f;同样&#xff0c;当客户选择…

基于遗传优化算法的风力机位置布局matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的风力机位置布局matlab仿真&#xff0c;风力机位置布局优化是风能转换系统设计中的一个重要环节&#xff0c;旨在最大化风场的整体发电效率。仿…

MySQL----排序ORDER BY

在对数据进行处理的时候&#xff0c;我们通常需要对读取的数据进行排序。而 MySQL 的也提供了 ORDER BY 语句来满足我们的排序要求。 ORDER BY 可以按照一个或多个列的值进行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 语法 SELECT column1…

Photoshop(PS)高效使用小技巧大揭秘

Photoshop&#xff0c;简称PS&#xff0c;是设计师和摄影师的得力助手。为了让你在使用PS时更加得心应手&#xff0c;我们整理了一系列高效使用小技巧&#xff0c;助你提升工作效率&#xff0c;释放创造力&#xff01; 一、快捷键大法 ALT键鼠标滚轮&#xff1a;快速放大和缩…

【C++题解】1962. 数值计算

问题&#xff1a;1962. 数值计算 类型&#xff1a;简单循环 题目描述&#xff1a; 给出一个不多于 5 位的非负整数&#xff0c;要求 1、 求出它是几位数 2、 分别输出每一位数字 3、 按逆序输出各位数字&#xff0c;例如原数为 321 ,应输出 123。 输入&#xff1a; 一个不大…

C语言 | Leetcode C语言题解之第146题LRU缓存

题目&#xff1a; 题解&#xff1a; typedef struct {int key;int val;UT_hash_handle hh; } LRUCache;LRUCache* cache NULL; int g_capacity 0; LRUCache** lRUCacheCreate(int capacity) {g_capacity capacity;return &cache; }int lRUCacheGet(LRUCache** obj, int…

Python 基础001 pythonpycharm安装

1 安装python 尽量在官网安装 根据电脑情况下载,下载完需要重启电脑 python安装路径自定义 添加环境变量&#xff08;add path&#xff09;需要勾选&#xff0c;若无勾选&#xff0c;手动更新环境变量 确认python是否安装成功&#xff1a; 方法一&#xff1a;有安装成功&am…

【多重背包 动态规划】2585. 获得分数的方法数

本文涉及知识点 动态规划汇总 背包问题汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode2585. 获得分数的方法数 考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types &#xff0c;其中 …

独立游戏《星尘异变》UE5 C++程序开发日志4——实现任务系统

本游戏作为工厂游戏&#xff0c;任务系统的主要功能就是给玩家生产的目标和动力&#xff0c;也就是给玩家发布一个需要一定数量某星尘的订单&#xff0c;玩家提交需要的星尘后会获得奖励&#xff0c;游戏中实际的奖励机制略微有点复杂&#xff0c;这里直接简化为完成任务后就能…

洛谷 P4913 二叉树深度(递归)

题目描述 有一个 &#x1d45b;(&#x1d45b;≤10^6) 个结点的二叉树。给出每个结点的两个子结点编号&#xff08;均不超过 &#x1d45b;&#xff09;&#xff0c;建立一棵二叉树&#xff08;根节点的编号为 1&#xff09;&#xff0c;如果是叶子结点&#xff0c;则输入 0。…

VitePress做一个自己的知识博客

创建项目 // 1.创建项目,直接在空项目下安装vitepress(npm/yarn等都可以,这个可以看官网,官网给了好几种安装方式) yarn add -D vitepress // 2.初始化配置项目(npm/官网也给了多种包管理工具的安装方式) yarn vitepress init // 初始化命令执行完会遇到以下几个问题 ┌ Welc…

温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic

摘要 旅游业随着经济的快速发展呈现出一派欣欣向荣的景象&#xff0c;尤其是近两年来&#xff0c;各个行业运用科技以及因特网来促进旅游迅速发展&#xff0c;逐渐都显示出了的问题&#xff0c;特别突出的是在线上推广&#xff0c;其缺点也是特别明显。尽管在新冠肺炎的冲击下&…

【C++】STL空间配置器

STL空间配置器 一、什么是空间配置器二、为什么需要空间配置器三、SGI-STL空间配置器实现原理1、 一级空间配置器2、二级空间配置器 四、优缺点分析 一、什么是空间配置器 STL 有六大组件分别是&#xff1a;容器&#xff0c;算法&#xff0c;迭代器&#xff0c; 空间配置器&am…

创建第一个Springboot项目HelloWorld

目录 一、准备工作 一、创建springboot项目 三、使用git上传到代码仓库gitee 四、git使用过程问题总结 一、准备工作 安装jdk&#xff1a;8u201&#xff08;可以使用高一点的版本&#xff09; jdk所有版本下载&#xff1a;Java Archive | Oracle 安装maven&#xff1a;不用…

“改进型”Howland 电流泵电路

“改进型”Howland 电流泵电路 “改进型”Howland 电流泵是一种使用差分放大器在分流电阻器 (Rs) 上施加电压的电路&#xff0c;从而产生能够驱动大范 围负载电阻的双极性&#xff08;拉电流或灌电流&#xff09;压控电流源。 设计注释 确保运算放大器的输入端&#xff08;V…

Vue19-key的原理

一、v-for中key的作用 给节点进行一个标识&#xff0c;类似于身份证号。 1-1、需求1&#xff1a; 点击按钮&#xff0c;在<li>的最前面添加一个老刘的信息 <body><div id"root"><h1>人员信息</h1><button click.once"add&qu…

深度学习-注意力机制和分数

深度学习-注意力机制 注意力机制定义与起源原理与特点分类应用领域实现方式优点注意力机制的变体总结注意力分数定义计算方式注意力分数的作用注意力分数的设计总结 注意力机制&#xff08;Attention Mechanism&#xff09;是一个源自对人类视觉研究的概念&#xff0c;现已广泛…