【问题标题】:Understanding ridge vertices returned by `scipy.spatial.Voronoi` in 3D了解 scipy.spatial.Voronoi 以 3D 形式返回的山脊顶点
【发布时间】: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


【解决方案1】:

在 2D 中,区域由一条线段分隔,因此每个脊总是 2 个点。在 3D 及更高版本中,区域分隔“平面段”通常是三角形的,但它们也可以有 4 条以上的边。

出于立体化目的,一种方法是显示分离区域的轮廓,跳过虚拟 (-1) 点。因此,[3, 0, -1] 将转换为点 3 和 0 之间的一条线。[1, 0, 3, 2] 将生成线段 1-0、0-3、3-2、2-1。作为一项额外的改进,具有 4 个以上点的山脊可以进一步拆分为三角形,因此在 [1, 0, 3, 2] 的情况下,另一段将是 0-2 或 1-3。

我仍然不确定我的问题是否正确,如果没有,请告诉我

【讨论】:

  • 这确实解释了为什么脊有超过 2 个顶点,我只将它们视为线段而不是平面段。我肯定会重新考虑我的方法。非常感谢。
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2016-06-24
  • 2017-05-06
  • 2018-05-02
相关资源
最近更新 更多