gpt4 book ai didi

python - 3D 网格之间的 Hausdorff 距离

转载 作者:太空宇宙 更新时间:2023-11-03 14:18:45 24 4
gpt4 key购买 nike

我有多个网格(numpy 数组 [Nk,Ny,Nx])并且想使用 Hausdorff 距离作为这些网格相似性的度量。 scipy 中有几个模块(scipy.spatial.distance.cdist、scipy.spatial.distance.pdist)可以计算二维数组之间的欧氏距离。现在要比较网格,我必须选择一些横截面(例如 grid1[0,:] & grid2[0,:])并相互比较。是否可以直接计算 3D 网格之间的 Hausdorff 距离?

最佳答案

我是新来的,但面临着同样的挑战,并试图在 3D 层面上直接攻击它。

所以这是我做的功能:

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)

输入需要是 numpy.array,但其余的直接工作。

我有 8000 对 5000 个 3D 点,这运行了几分钟,但最后它到达了您正在寻找的距离。

然而,这是检查两点之间的距离,不一定是两条曲线的距离。 (都不是网格)。

编辑(2015 年 11 月 26 日):

最近完成了此代码的微调版本。现在它被分成两部分。

首先要注意在给定点周围抓取一个框并获取所有半径。我认为这是减少检查所需点数的明智方法。

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

以及计算距离的其他代码:

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)

关于python - 3D 网格之间的 Hausdorff 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30706079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com