【学习笔记】Hausdorff 距离的 C 语言实现

Hausdorff 距离的 C 语言实现

简介

Hausdorff 距离,亦称为豪斯多夫距离,是由德国数学家费利克斯·豪斯多夫(Felix Hausdorff)提出的一种度量空间中两个非空集合之间远近程度的方法。这种距离度量广泛应用于计算机视觉、图像处理、形状分析、医学影像分析等领域,因为它能有效衡量两个复杂结构或形状的相似性,尤其是在存在噪声、尺度变化或轻微形变的情况下。

基本定义

给定两个集合 A A A B B B,它们可以是点集、几何形状的边界点集合等,在一个度量空间中(通常假设为欧几里得空间),Hausdorff距离 H ( A , B ) H(A, B) H(A,B) 定义为两个集合间最远的最近点距离的最大值。具体来说,它可以通过两个单向Hausdorff 距离来描述:

  1. 从集合 A A A 到集合 B B B 的单向Hausdorff距离 h ( A , B ) h(A, B) h(A,B) 定义为集合 A A A 中每个点到集合 B B B 中最近点的距离中的最大值:
    h ( A , B ) = max ⁡ a ∈ A min ⁡ b ∈ B ∣ ∣ a − b ∣ ∣ h(A, B) = \max_{a \in A} \min_{b \in B} ||a - b|| h(A,B)=aAmaxbBmin∣∣ab∣∣
  2. 从集合 B B B 到集合 A A A 的单向Hausdorff距离 h ( B , A ) h(B, A) h(B,A) 同理定义为集合 B B B 中每个点到集合 A A A 中最近点的距离中的最大值:
    h ( B , A ) = max ⁡ b ∈ B min ⁡ a ∈ A ∣ ∣ b − a ∣ ∣ h(B, A) = \max_{b \in B} \min_{a \in A} ||b - a|| h(B,A)=bBmaxaAmin∣∣ba∣∣

​ 3.双向Hausdorff距离 H ( A , B ) H(A, B) H(A,B) 取这两个单向距离中的最大值:
H ( A , B ) = max ⁡ { h ( A , B ) , h ( B , A ) } H(A, B) = \max\{h(A, B), h(B, A)\} H(A,B)=max{h(A,B),h(B,A)}

这表明 Hausdorff 距离衡量的是一个集合中的任一点到另一个集合中最近点的最大距离。如果这个距离很小,说明两个集合在某种程度上是“接近”的;反之,如果这个距离很大,则表明它们之间差异显著。

特性

  • 非对称性:虽然通常考虑的是双向 Hausdorff 距离以获得对称性质,但单向Hausdorff距离本身是非对称的,即 h ( A , B ) ≠ h ( B , A ) h(A, B) \neq h(B, A) h(A,B)=h(B,A) 可能成立。
  • 鲁棒性:Hausdorff 距离对小的形状变化(如噪声)相对不敏感,但能捕捉到大的结构差异,适合于形状匹配和识别任务。
  • 计算复杂性:计算Hausdorff距离可能相当复杂,特别是对于大规模数据集,因为需要计算所有点对之间的距离并找出最大值。
  • 应用:在图像处理中,Hausdorff距离常用于比较边界轮廓、分割结果的评估、医学图像分析等。

Hausdorff距离因其强大的表达能力和实用性,在多个领域内成为一种重要的形状分析工具。

C语言实现

以下是计算 Hausdorff 距离的C语言实现示例:

#include <stdio.h>
#include <math.h>// 定义点结构体
typedef struct {double x;double y;
} Point;// 计算两点之间的欧几里得距离
double euclidean_distance(Point p1, Point p2)
{return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}// 计算集合P到集合Q的Hausdorff距离
double hausdorff_distance(Point* P, int n, Point* Q, int m)
{double maxDistPQ = 0.0;double maxDistQP = 0.0;// 计算从P到Q的Hausdorff距离for (int i = 0; i < n; i++) {double minDist = INFINITY;for (int j = 0; j < m; j++) {double dist = euclidean_distance(P[i], Q[j]);if (dist < minDist) {minDist = dist;}}if (minDist > maxDistPQ) {maxDistPQ = minDist;}}// 计算从Q到P的Hausdorff距离for (int i = 0; i < m; i++) {double minDist = INFINITY;for (int j = 0; j < n; j++) {double dist = euclidean_distance(Q[i], P[j]);if (dist < minDist) {minDist = dist;}}if (minDist > maxDistQP) {maxDistQP = minDist;}}// 返回Hausdorff距离return fmax(maxDistPQ, maxDistQP);
}int main()
{// 定义两个点集Point P[] = {{0, 0}, {1, 1}, {2, 2}};Point Q[] = {{0, 0}, {1, 2}, {3, 3}};// 计算Hausdorff距离double distance = hausdorff_distance(P, 3, Q, 3);printf("Hausdorff Distance: %f\n", distance);return 0;
}

总结

Hausdorff 距离作为一种集合之间相似性度量的方法,具有明确的数学定义和广泛的应用场景。它通过考虑两个集合中各点之间的最大距离,为我们提供了一种有效的工具来比较和分析不同集合之间的相似性和差异性。


本文链接:https://blog.csdn.net/u012028275/article/details/139814895

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

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

相关文章

Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口

前言 本篇文章我们来使用 Supabase 实现 RESTful 风格的 API 接口&#xff0c;以此来实现网站分类和子站点的 CURD 功能。 表设计 这里需要用到两张表&#xff1a; ds_categorys&#xff1a;存储网站分类 列名类型备注iduuid主键&#xff0c;分类 idnametext分类名称desct…

python 魔术方法备忘录

python 魔术方法备忘录 网上收集了一些&#xff0c;列出了比较常用的&#xff0c;特别是第一张。 Python中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也被称为特殊方法&#xff08;Special Methods&#xff09;或双下划线方法&#xff08;Dunder Methods&a…

Python2 日志模块的使用

Python中的日志模块&#xff08;logging module&#xff09;提供了灵活的日志记录功能&#xff0c;使开发者能够在程序运行时记录各种级别的信息&#xff0c;从而方便调试、跟踪程序的执行情况&#xff0c;并定位可能出现的问题。 日志模块可以用来&#xff1a; 记录程序的运行…

Effective C++ 改善程序与设计的55个具体做法笔记与心得 2

二. 构造/析构/赋值运算 5. 了解C默默编写并调用哪些函数 唯有当这些函数被调用&#xff0c;他们才会被编译器创建出来。 请记住&#xff1a; ‌‌‌‌  编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符&#xff0c;以及析构函数。 6. 若…

渗透测试之存储型跨站脚本攻击(高危)

一、定义 跨站脚本攻击&#xff0c;指的是恶意用户往web页面里插入恶意HTML代码。当普通用户访问该web页面&#xff0c;嵌入其中的HTML代码会被执行&#xff0c;从而达到破坏的效果。 二、风险定级 高危 三、可输入的HTML标签示例 图片标签 <img src"#"> 超…

有监督学习——决策树、集成学习

1. 决策树 熵 在热力学中&#xff0c;熵&#xff08;entropy&#xff09;被用来衡量系统的不稳定程度。香农在论文《通信的数学原理》中提出信息熵的概念&#xff0c;目的是_量化数字信息的价值_。 信息熵的定义 香农提出的量化信息方式&#xff1a; \[H(P_1,P_2,\cdots P…

新建一个 React TypeScript 项目,并使用 Webpack 进行构建和打包

要用 create-react-app 新建一个 React TypeScript 项目&#xff0c;并使用 Webpack 进行构建和打包&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;使用 create-react-app 创建 React TypeScript 项目 确保你已经安装了 Node.js 和 npm&#xff08;Nod…

【代码随想录算法训练Day43】LeetCode 518.零钱兑换II、LeetCode 377.组合总和IV、LeetCode 70.爬楼梯

Day43 动态规划第五天 LeetCode 518.零钱兑换II dp数组的含义&#xff1a;装满容量为j的背包有dp[j]种方法 递推公式&#xff1a;dp[j]dp[j-coins[i]]。 初始化&#xff1a;dp[0]1,dp[j]0 遍历顺序&#xff1a;先物品后背包&#xff0c;背包内从小到大 本题是组合数&#xff…

【Android面试八股文】你能讲一讲Kotlin语言泛型的形变是什么?

文章目录 1. 协变 (`out`)1.1 协变概念1.2 协变示例1.3 为什么协变只能读取泛型,而不能修改泛型?1. 原因概述2. 类型安全性问题3. 类型一致性结论2. 逆变 (`in`)2.1 逆变概念2.2 逆变示例2.3 为什么逆变只能修改泛型,不能读取泛型?2.3.1 为什么逆变只能读取泛型,不能修改泛…

吴恩达机器学习作业ex3:多类分类和前馈神经网络(Python实现)详细注释

文章目录 1 多类分类1.1数据集1.2 数据可视化1.3 向量化逻辑回归1.3.1 向量化代价函数1.3.2 矢量化梯度下降以及正则化表达1.4 一对多分类 2.神经网络2.1模型表示 总结&#xff08;自己训练求解参数全流程&#xff09; 1 多类分类 在本练习中&#xff0c;您将使用逻辑回归和神…

Redis学习|Jedis、SpringBoot整合Redis

Jedis 我们要使用Java 来操作 Redis,知其然并知其所以然&#xff0c;授人以渔!学习不能急躁&#xff0c;慢慢来会很快!什么是Jedis 是 Redis 官方推荐的java连接开发工具!使用java 操作Redis 中间件!如果你要使用 java操作redis&#xff0c;那么一定要对Jedis 十分的熟悉! 1、…

MySQL之复制(五)

复制 复制的原理 复制文件 3.master.info 这个文件用于保存备库连接到主库所需要的信息&#xff0c;格式为纯文本(每行一个值)&#xff0c;不同的MySQL版本&#xff0c;其记录的信息也可能不同。此文件不能删除&#xff0c;否则备库在重启后无法连接到主库。这个文件以文本的…

电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法

在数字化时代&#xff0c;多媒体文件的处理已经成为我们日常生活和工作中不可或缺的一部分。在计算机使用过程中&#xff0c;丢失ffmpeg.dll文件是一个特定但常见的问题&#xff0c;尤其是对于那些经常处理视频编解码任务的用户来说。下面小编讲全面分析ffmpeg.dll丢失原因以及…

android webview调用js滚动到指定位置

一、activity import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.tencent.smtt.sdk.WebView import com.tencent.smtt.sdk.WebViewClientclass MainActivity : AppCompatActivity() {private lateinit var webView: WebViewoverride fun …

基于深度学习的图像去噪

基于深度学习的图像去噪 图像去噪是从受噪声污染的图像中恢复原始图像的过程。在传统方法中&#xff0c;常用的去噪技术包括均值滤波、中值滤波和维纳滤波等。随着深度学习技术的发展&#xff0c;基于深度学习的图像去噪方法取得了显著进展。 深度学习图像去噪方法 1. 卷积神…

Python数据分析与建模库之从入门到四大库(Numpy、Pandas、Matplotl、Seaborn )教学课程下载

第一阶段课程-Python快速入门&#xff1a; 含&#xff1a;1.系列课程环境配置&#xff1b;2.Python快速入门&#xff1b;3.变量类型&#xff1b;4.LIST基础&#xff1b;5.List索引&#xff1b;6.循环结构&#xff1b;7.判断结构&#xff1b;8.字典&#xff1b;9.文件处理&#…

哪些好用的AI绘画生成软件?建议你试试这四款

哪些好用的AI绘画生成软件&#xff1f;随着人工智能技术的飞速发展&#xff0c;AI绘画生成软件逐渐走入大众的视野&#xff0c;为艺术创作领域带来了革命性的变革。今天&#xff0c;就让我们一起探索四款备受推崇的AI绘画生成软件&#xff0c;看看它们如何以独特的魅力&#xf…

202483读书笔记|《牵牛花浮世无篱笆:千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊,单恋

202483读书笔记|《牵牛花浮世无篱笆&#xff1a;千代尼俳句250》——被红叶染红的只有一侧山坡之山 啊&#xff0c;单恋 春之句夏之句秋之句冬之句 历史读过的俳句列表: 202318读书笔记|《芭蕉芜村一茶&#xff1a;俳句三圣新译300》——樱花——让一整个春夜亮起来&#xff0…

数据库相关-Spock

数据库相关-Spock ‍ Spock连接数据库 ‍ import com.alibaba.fastjson.JSON import com.google.common.reflect.TypeToken import com.meituan.mtrace.Tracer import com.sankuai.solarsystem.aigc.common.util.GsonUtil import com.sankuai.solarsystem.aigc.domain.assi…

目标检测讲解

环境准备 pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple图片读取&画框 from skimage import io import matplotlib.pyplot as plt import matplotlib.patches as mpss io.imread(dogs.jpg)_, ax plt.subplots(ncols1, nrows1, figsize(6, 6))…