#python #scipy #voronoi #scipy-spatial
Вопрос:
Я не понимаю формат возврата вершин хребта для функции scipy.spatial.Voronoi. При использовании этой функции в 2D вершины располагаются парами для одного гребня, что является форматом, который я ожидаю, но в 3D количество вершин в гребнях, как правило, превышает 2 точки.
Зачем хребту нужно более 2 точек?
С некоторой постобработкой могу ли я упростить формат до 2 точек на гребень?
Примеры
(int в vor.ridge_vertices
относится к указателю точки в 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]]
Контекст:
Я хочу скелетировать 3D-объект, используя вершины хребта Вороного. Для этого я соединяю свой объект в сетку, чтобы выбрать точки поверхности, передаю их функции scipy.spatial.Voronoi и использую вершины гребня внутри объекта в качестве своего скелета.
В качестве обходного пути я в настоящее время использую регионы для угадывания вершин хребта, но они подвержены ошибкам и медленны. Изучение того, как правильно использовать возвращенные вершины хребта, должно исправить это.
Причина, по которой я хочу использовать скелетонизацию вороного, заключается в том, что она показалась мне самой простой в реализации. Я знаю о skimage.morphology.skeletonize_3d, но он имеет тенденцию терять мелкие детали (недостаточно разумно), и нет параметров, с которыми можно играть.
Комментарии:
1. Я изо всех сил пытаюсь понять «количество точек в вершинах, как правило, превышает 2 точки». Вершина-это одна точка, та же размерность, что и входные данные. Можете ли вы привести конкретный пример того, что вызывает эту путаницу?
2. @Марат Да, извините, я перепутал вершины и гребни. Я хочу понять, почему гребень должен иметь более 2 вершин/точек. Я добавил пример
ridge_vertices
.
Ответ №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.
Я все еще не уверен, правильно ли я понял вопрос, дайте мне знать, если я этого не сделал
Комментарии:
1. Это объясняет, почему гребни имеют более 2 вершин, я видел их только как линейный сегмент, а не как плоский сегмент. Мне определенно придется пересмотреть свой подход. Большое спасибо.