【学习笔记】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

图像 Hausdorff 距离是一种常用于度量两个图像之间的相似度的指标,它可以评估两个图像中的最大差异程度。在图像匹配中,可以使用 Hausdorff 距离来计算图像之间的相似度,从而进行匹配。 在 Python 中,可以使用 OpenCV 库以及 NumPy 库来实现图像 Hausdorff 距离的匹配。以下是一种简单的实现方法: 1. 导入所需的库: ```python import cv2 import numpy as np ``` 2. 加载两个图像(可以是灰度图或彩色图): ```python image1 = cv2.imread("image1.jpg") image2 = cv2.imread("image2.jpg") ``` 3. 将图像转换为灰度图(如果图像不是灰度图): ```python gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) gray_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) ``` 4. 使用 OpenCV 的 `distanceTransform` 函数计算图像的距离变换。这将返回一个浮点数数组,表示图像中每个像素到最近边缘的距离: ```python dist1 = cv2.distanceTransform(gray_image1, cv2.DIST_L2, 3) dist2 = cv2.distanceTransform(gray_image2, cv2.DIST_L2, 3) ``` 5. 计算 Hausdorff 距离: ```python hausdorff_distance = np.max(dist1 * cv2.compare(dist1, dist2, cv2.CMP_LE)) ``` 以上代码中,`np.max` 函数用于找到图像中的最大值,`cv2.compare` 函数用于比较两个距离变换后的图像,并生成一个比较结果图像。 最后,`hausdorff_distance` 变量将包含计算出的 Hausdorff 距离值,可以用于衡量两个图像的相似度。 需要注意的是,图像 Hausdorff 距离的计算复杂度较高,计算大图像或大数据集时可能较耗时。不过,这个简单的实现可以提供一个基本的框架,您可以根据具体需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值