fr/fr_env/lib/python3.8/site-packages/skimage/metrics/set_metrics.py

52 lines
1.6 KiB
Python

import numpy as np
from scipy.spatial import cKDTree
def hausdorff_distance(image0, image1):
"""Calculate the Hausdorff distance between nonzero elements of given images.
The Hausdorff distance [1]_ is the maximum distance between any point on
``image0`` and its nearest point on ``image1``, and vice-versa.
Parameters
----------
image0, image1 : ndarray
Arrays where ``True`` represents a point that is included in a
set of points. Both arrays must have the same shape.
Returns
-------
distance : float
The Hausdorff distance between coordinates of nonzero pixels in
``image0`` and ``image1``, using the Euclidian distance.
References
----------
.. [1] http://en.wikipedia.org/wiki/Hausdorff_distance
Examples
--------
>>> points_a = (3, 0)
>>> points_b = (6, 0)
>>> shape = (7, 1)
>>> image_a = np.zeros(shape, dtype=bool)
>>> image_b = np.zeros(shape, dtype=bool)
>>> image_a[points_a] = True
>>> image_b[points_b] = True
>>> hausdorff_distance(image_a, image_b)
3.0
"""
a_points = np.transpose(np.nonzero(image0))
b_points = np.transpose(np.nonzero(image1))
# Handle empty sets properly:
# - if both sets are empty, return zero
# - if only one set is empty, return infinity
if len(a_points) == 0:
return 0 if len(b_points) == 0 else np.inf
elif len(b_points) == 0:
return np.inf
return max(max(cKDTree(a_points).query(b_points, k=1)[0]),
max(cKDTree(b_points).query(a_points, k=1)[0]))