0

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

有人可以帮我弄清楚我哪里出错了吗?

这是我的代码:

#!/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()

这是我的体积渲染:

在此处输入图像描述

这是我预期的体积渲染:

在此处输入图像描述

4

1 回答 1

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 中工作。

于 2021-11-12T16:32:09.967 回答