我有一系列包含512x512预分段CAT扫描数据的大约100个PNG文件。我想在Python上使用vtk来使用行进立方体算法创建3D模型。我不知道该怎么做的部分是加载PNG文件序列并将它们转换为适合发送到vtkDiscreteMarchingCubes
算法的单个vtk像素数据对象。
我还认为我需要转换PNG数据的像素值,因为此时数据位于alpha通道中,因此需要将其转换为值为零和1的标量数据。
答案 0 :(得分:1)
使用vtkPNGreader并加载单个切片,然后填充vtkImageData,您可以定义维度,并为每个z切片或图像填充图像数据,将读取器的输出填充到vtkImageData中。
粗糙的伪代码 - 未检查错误:)
import vtk
from vtk.util import numpy_support
pngfiles = glob.glob('*.png')
png_reader = vtk.vtkPNGReader()
png_reader.SetFileName(pngfiles[0])
x,y = png_reader.GetOutput().GetDimensions()
data_3d = np.zeros([x,y,len(pngfiles)])
for i,p in enumerate(png):
png_reader.SetFileName(pngfiles[0])
png_reader.Update()
img_data = png_reader.GetOutput()
data_3D[:,:,i] = numpy_support.vtk_to_numpy(img_data)
#save your 3D numpy array out.
data_3Dvtk = numpy_support.numpy_to_vtk(data_3D)
答案 1 :(得分:0)
万一有人偶然发现这里寻找仅使用vtk的另一种方法,则可以使用vtkImageAppend
类。
def ReadImages(files):
reader = vtk.vtkPNGReader()
image3D = vtk.vtkImageAppend()
image3D.SetAppendAxis(2)
for f in files:
reader.SetFileName(f)
reader.Update()
t_img = vtk.vtkImageData()
t_img.DeepCopy(reader.GetOutput())
image3D.AddInputData(t_img)
image3D.Update()
return image3D.GetOutput()
要转换数据,您可以看一下t_img.GetPointData()。GetArray('PNGImage')的输出,看看它是否是期望值。