【问题标题】:How to volume render 3D numpy array using VTK (MarchingCubes) in Python?如何在 Python 中使用 VTK(MarchingCubes)体积渲染 3D numpy 数组?
【发布时间】:2021-11-12 15:56:06
【问题描述】:

我有一个 3D numpy 数组,我正在尝试使用 VTK 对其进行体积渲染。但是,当我将其可视化时,我会得到完全不同的体积渲染。我怀疑这与我将 numpy 数组转换为 VTK 图像格式有关,但我似乎无法弄清楚我哪里出错了。我已经上传了numpy数组here

谁能帮我弄清楚我哪里出错了?

这是我的代码:

#!/usr/bin/env python

import os
import numpy as np

ArrayDicom = np.load('test3.npy')
data_matrix = ArrayDicom
w, d, h = ArrayDicom.shape

colors = vtkNamedColors()
iso_value = 200

reader = vtkImageImport()
data_string = data_matrix.tobytes()
reader.CopyImportVoidPointer(data_string, len(data_string))
reader.SetDataScalarTypeToUnsignedChar()
reader.SetNumberOfScalarComponents(1)
reader.SetDataExtent(0, w-1, 0, d-1, 0, h-1)
reader.SetWholeExtent(0, w-1, 0, d-1, 0, h-1)
reader.Update()

volume = vtkImageData()
volume.DeepCopy(reader.GetOutput())

surface = vtkMarchingCubes()
surface.SetInputData(volume)
surface.ComputeNormalsOn()
surface.SetValue(0, iso_value)

renderer = vtkRenderer()
renderer.SetBackground(colors.GetColor3d('DarkSlateGray'))

render_window = vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window.SetWindowName('MarchingCubes')

interactor = vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)

mapper = vtkPolyDataMapper()
mapper.SetInputConnection(surface.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(colors.GetColor3d('MistyRose'))

renderer.AddActor(actor)

render_window.Render()
interactor.Start()

这是我的体积渲染:

这是我预期的体积渲染:

【问题讨论】:

    标签: python image vtk pydicom medical-imaging


    【解决方案1】:

    Numpy 使用与 VTK 不同的数组排序。您应该能够重新排序 w、h 和 d 以获得正确的东西。

    这就是你想要的:

    h, d, w = ArrayDicom.shape
    

    好的,这是我用来转换为VTK文件的转换脚本:

    import numpy as np
    import SimpleITK as sitk
    
    x = np.load("test3.npy")
    y = sitk.GetImageFromArray(x)
    sitk.WriteImage(y, "test3.vtk")
    

    这并不像正确导入 VTK 图像那样好,但是,我是一个 SimpleITK 人,我知道转换 numpy 可以在 SimpleITK 中工作。

    【讨论】:

    • 嗨,戴夫,感谢您的回答。我尝试更改 h、d 和 w,但它似乎不起作用,我仍然得到一个与图像中相同的方形体积。可能是由于 SetDataExtent 和 SetWholeExtent 还是间距?
    • 嗨,戴夫,我也试试,再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多