使用python

时间:2016-03-13 01:00:23

标签: python image 3d vtk

我有一系列包含512x512预分段CAT扫描数据的大约100个PNG文件。我想在Python上使用vtk来使用行进立方体算法创建3D模型。我不知道该怎么做的部分是加载PNG文件序列并将它们转换为适合发送到vtkDiscreteMarchingCubes算法的单个vtk像素数据对象。

我还认为我需要转换PNG数据的像素值,因为此时数据位于alpha通道中,因此需要将其转换为值为零和1的标量数据。

2 个答案:

答案 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')的输出,看看它是否是期望值。