Distancia de Hausdorff entre grillas 3D

Tengo varias cuadrículas (matrices numpy [Nk, Ny, Nx]) y me gustaría usar la distancia de Hausdorff como una métrica de similitud de estas cuadrículas. Hay varios módulos en scipy (scipy.spatial.distance.cdist, scipy.spatial.distance.pdist) que permiten calcular la distancia euclidiana entre matrices 2D. Ahora, para comparar las cuadrículas, tengo que elegir una sección transversal (por ejemplo, cuadrícula1 [0 ,:] y cuadrícula2 [0 ,:]) y compararla entre sí. ¿Es posible calcular la distancia de Hausdorff entre las redes 3D directamente?

Soy nuevo aquí, pero me enfrento al mismo desafío y traté de atacarlo directamente en un nivel 3D.

Así que aquí está la función que hice:

def Hausdorff_dist(vol_a,vol_b): dist_lst = [] for idx in range(len(vol_a)): dist_min = 1000.0 for idx2 in range(len(vol_b)): dist= np.linalg.norm(vol_a[idx]-vol_b[idx2]) if dist_min > dist: dist_min = dist dist_lst.append(dist_min) return np.max(dist_lst) 

La entrada debe ser numpy.array, pero el rest funciona directamente.

Tengo 8000 contra 5000 puntos 3D y esto dura varios minutos, pero al final llega a la distancia que estás buscando.

Sin embargo, esto es verificar la distancia entre dos puntos, no necesariamente la distancia de dos curvas. (ni malla).

Editar (el 26/11/2015):

Recenty terminó la versión afinada de este código. Ahora se divide en dos partes.

Lo primero es encargarse de agarrar una caja alrededor de un punto dado y tomar todo el radio. Considero esto como una forma inteligente de reducir la cantidad de puntos necesarios para verificar.

 def bbox(array, point, radius): a = array[np.where(np.logical_and(array[:, 0] >= point[0] - radius, array[:, 0] <= point[0] + radius))] b = a[np.where(np.logical_and(a[:, 1] >= point[1] - radius, a[:, 1] <= point[1] + radius))] c = b[np.where(np.logical_and(b[:, 2] >= point[2] - radius, b[:, 2] <= point[2] + radius))] return c 

Y el otro código para el cálculo de la distancia:

 def hausdorff(surface_a, surface_b): # Taking two arrays as input file, the function is searching for the Hausdorff distane of "surface_a" to "surface_b" dists = [] l = len(surface_a) for i in xrange(l): # walking through all the points of surface_a dist_min = 1000.0 radius = 0 b_mod = np.empty(shape=(0, 0, 0)) # increasing the cube size around the point until the cube contains at least 1 point while b_mod.shape[0] == 0: b_mod = bbox(surface_b, surface_a[i], radius) radius += 1 # to avoid getting false result (point is close to the edge, but along an axis another one is closer), # increasing the size of the cube b_mod = bbox(surface_b, surface_a[i], radius * math.sqrt(3)) for j in range(len(b_mod)): # walking through the small number of points to find the minimum distance dist = np.linalg.norm(surface_a[i] - b_mod[j]) if dist_min > dist: dist_min = dist dists.append(dist_min) return np.max(dists)