【发布时间】:2021-08-29 16:48:35
【问题描述】:
我不明白函数scipy.spatial.Voronoi 的脊顶点的返回格式。在 2D 中使用此函数时,一个脊的顶点成对出现,这是我期望的格式,但在 3D 中, 脊中的顶点数往往超过 2 个点。
为什么一个山脊需要超过 2 个点?
通过一些后处理,我可以将格式简化为每个脊 2 个点吗?
示例
(vor.ridge_vertices中的int指的是vor.vertices中的点索引)
import numpy as np
from scipy.spatial import Voronoi
# for 2D
points = np.array([[0, 0], [0, 1], [0, 2],
[1, 0], [1, 1], [1, 2],
[2, 0], [2, 1], [2, 2]])
vor = Voronoi(points)
# vor.vertices :
# [[0.5 0.5]
# [0.5 1.5]
# [1.5 0.5]
# [1.5 1.5]]
#
# vor.ridge_vertices : (only pairs of vertices)
# [[-1, 0],
# [-1, 0],
# [-1, 1],
# [-1, 1],
# [0, 1],
# [-1, 3],
# [-1, 2],
# [2, 3],
# [-1, 3],
# [-1, 2],
# [1, 3],
# [0, 2]]
import numpy as np
from scipy.spatial import Voronoi
# for 3D
points = np.array([[0, 0, 0], [0, 0, 1], [0, 0, 2],
[0, 1, 0], [0, 1, 1], [0, 1, 2],
[0, 2, 0], [0, 2, 1], [0, 2, 2],
[1, 0, 0], [1, 0, 1], [1, 0, 2],
[1, 1, 0], [1, 1, 1], [1, 1, 2],
[1, 2, 0], [1, 2, 1], [1, 2, 2]])
vor = Voronoi(points)
# vor.vertices :
# [[0.5 1.5 0.5]
# [0.5 0.5 0.5]
# [0.5 0.5 1.5]
# [0.5 1.5 1.5]]
#
# vor.ridge_vertices : (3-4 vertices per ridge)
# [[3, 0, -1],
# [0, -1, 1],
# [1, 0, 3, 2],
# [2, 1, -1],
# [2, 3, -1],
# [3, -1, 0],
# [-1, 1, 0],
# [-1, 3, 0],
# [-1, 1, 0],
# [-1, 2, 3],
# [-1, 1, 2],
# [-1, 1, 2],
# [-1, 2, 3]]
上下文:
我想使用 voronoi 脊顶点对 3D 对象进行骨架化。为此,我将对象网格化以选择表面的点,将它们提供给函数 scipy.spatial.Voronoi 并使用对象内部的脊顶点作为我的骨架。
作为一种解决方法,我目前正在使用这些区域来猜测山脊顶点,但它容易出现错误并且速度很慢。学习如何正确使用返回的脊顶点应该可以解决这个问题。
我想使用 voronoi 骨架化的原因是因为它似乎最容易实现。我知道skimage.morphology.skeletonize_3d,但它往往会丢失较小的细节(不够明智)并且没有可玩的参数。
【问题讨论】:
-
我很难理解“顶点中的点数往往超过 2 个点”。顶点是单个点,与输入数据具有相同的维度。你能举一个具体的例子说明造成这种混乱的原因吗?
-
@Marat 是的,对不起,我混淆了顶点和山脊。我想了解为什么山脊应该有超过 2 个顶点/点。我添加了一个示例
ridge_vertices。
标签: python scipy voronoi scipy-spatial