基于STL血管树模型的Python-VTK三维样条回归

基于STL血管树模型的Python-VTK三维样条回归,python,graphics,regression,vtk,stl-format,Python,Graphics,Regression,Vtk,Stl Format,我需要创建血管树模型的样条线或多段线表示(请参见下文) 模型是STL格式的,因此我有所有顶点的x-y-z坐标。这些线应该穿过血管网格的中心,因此我认为最好的方法是通过顶点云进行样条回归此外,如果我能得到给定点处船只的半径,例如多段线的坐标,那就太好了 我浏览了这个论坛和VTK网站(假设他们对这类事情有一个简单的实现),但到目前为止,我还没有找到我可以使用的东西。有人知道可以实现这一点的Python模块或VTK类(我将从Python调用它)吗?我在上面找到的python模块都是用于2D数据的

我需要创建血管树模型的样条线或多段线表示(请参见下文)

模型是STL格式的,因此我有所有顶点的x-y-z坐标。这些线应该穿过血管网格的中心,因此我认为最好的方法是通过顶点云进行样条回归此外,如果我能得到给定点处船只的半径,例如多段线的坐标,那就太好了

我浏览了这个论坛和VTK网站(假设他们对这类事情有一个简单的实现),但到目前为止,我还没有找到我可以使用的东西。有人知道可以实现这一点的Python模块或VTK类(我将从Python调用它)吗?我在上面找到的python模块都是用于2D数据的

非常感谢

编辑:
我偶然发现了一个名为的库,它几乎只处理血管分割,并且具有他们所称的“”功能。然而,它们通常要求在血管末端进行“切割”,并定义“源点”。然而,在我的模型中,我们可以看到端点是“封顶的”,这使得问题更加复杂。如果我找到了一个解决方案,我将在这里发布

我不知道任何软件或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网格进行体素化,构造体素骨架,并分离骨架段以表示每个血管。然后可以对每个中心线进行插值以获得平滑曲线。未加工的骨骼段通常有锯齿形。

这是一个非常酷的数字!哈哈,谢谢,如果我在读博士期间学到了一件事,那就是制作性感的身材:)这是ITK而不是VTK,但也许这会有帮助?