Python-VTK 3D Spline Regression через STL-модель сосудистого дерева

Мне нужно создать представление модели сосудистого дерева в виде сплайна или полилинии (см. Ниже).

все сосудистое дерево

Модель находится в формате STL, поэтому у меня есть координаты x-y-z всех вершин. Линии должны проходить через центр сетки сосуда, поэтому я подумал, что лучшим подходом будет сплайн-регрессия через облако вершин. Кроме того, было бы здорово, если бы я мог получить радиус судна в заданных точках, например координаты ломаной линии.

часть дерева, показанная как сетка

Я просмотрел этот форум и веб-сайт VTK (при условии, что у них есть простая реализация для такого рода вещей), но пока я не нашел что-то, что можно было бы использовать. Кто-нибудь знает модуль Python или класс VTK (который я бы назвал из Python), который может это сделать? Все модули python, которые я нашел здесь, предназначены для 2D-данных.

Большое спасибо!

РЕДАКТИРОВАТЬ: я наткнулся на эту библиотеку под названием VMTK, которая занимается почти исключительно сегментацией сосудов и имеет функциональные возможности. для того, что они называют «расчетом средней линии». Однако они обычно требуют, чтобы сосуды были «разрезаны» на концах и были определены «точки источника». В случае с моей моделью, однако, можно увидеть, что конечные точки «закрыты», что усложняет ситуацию. Если я найду решение, я опубликую здесь


person somada141    schedule 12.10.2013    source источник
comment
это очень фигура!   -  person ali_m    schedule 12.10.2013
comment
ха-ха, спасибо, если я научился чему-то во время учебы в докторантуре, то это сексуальные цифры :)   -  person somada141    schedule 12.10.2013
comment
Это ITK, а не VTK, но, может быть, это поможет? insight-journal.org/browse/publication/165   -  person Noeska Smit    schedule 25.10.2013


Ответы (1)


Я не знаю какого-либо программного обеспечения или классов Python точно по вашей проблеме. Возможно, python interpolate.splev поможет вам с одним сосудом. Вы можете попробовать следующий код в качестве примера:

from scipy import interpolate
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 3D example
total_rad = 10
z_factor = 3
noise = 0.1

num_true_pts = 200
s_true = np.linspace(0, total_rad, num_true_pts)
x_true = np.cos(s_true)
y_true = np.sin(s_true)
z_true = s_true/z_factor

num_sample_pts = 100
s_sample = np.linspace(0, total_rad, num_sample_pts)
x_sample = np.cos(s_sample) + noise * np.random.randn(num_sample_pts)
y_sample = np.sin(s_sample) + noise * np.random.randn(num_sample_pts)
z_sample = s_sample/z_factor + noise * np.random.randn(num_sample_pts)

tck, u = interpolate.splprep([x_sample,y_sample,z_sample], s=2)
x_knots, y_knots, z_knots = interpolate.splev(tck[0], tck)
u_fine = np.linspace(0,1,num_true_pts)
x_fine, y_fine, z_fine = interpolate.splev(u_fine, tck)

fig2 = plt.figure(2)
ax3d = fig2.add_subplot(111, projection='3d')
# blue line shows true helix
ax3d.plot(x_true, y_true, z_true, 'b')
# red stars show distorted sample around a blue line
ax3d.plot(x_sample, y_sample, z_sample, 'r*')
# green line and dots show fitted curve
ax3d.plot(x_knots, y_knots, z_knots, 'go')
ax3d.plot(x_fine, y_fine, z_fine, 'g')
plt.show()

В этом коде используется зашумленная центральная линия одного судна и подгоняется плавная кривая (см. Результат ниже):

результат интерполяции

Обычно для обозначения концов осевой линии используются два начальных числа пользователя, в случае представления осевой линии, как в VMTK.

Другой способ автоматически получить центральные линии - это вокселизировать вашу stl-сетку, построить воксельный каркас и отдельный скелетный сегмент для представления каждого сосуда. Затем вы можете интерполировать каждую осевую линию, чтобы получить плавные кривые. Необработанные сегменты скелета обычно имеют зигзагообразные формы.

person Roman Pryamonosov    schedule 29.10.2018