Jak na objemové vykreslení 3D numpy pole pomocí VTK (MarchingCubes) v Pythonu?

0

Otázka

Mám 3D numpy pole a snažím se objem činí to pomocí VTK. Nicméně, jsem si zcela jiný objem vykreslování, když jsem si to představit. Mám podezření, že to má něco společného s mou přeměnu numpy pole VTK formát obrazu, ale nemůžu přijít na to, kde jsem jít špatně. Mám nahrané numpy array zde.

Může mi někdo pomoci zjistit, kde jsem jít špatně?

Tohle je můj kód:

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

Tohle je moje volume rendering:

enter image description here

Tohle je můj předpokládaný objem vykreslování:

enter image description here

image medical-imaging pydicom python
2021-11-12 15:56:06
1

Nejlepší odpověď

1

Numpy používá jiné pole objednání než VTK. Měli byste být schopni re-pořadí w, h a d se dostat správnou věc.

To je, jak chcete, aby to:

h, d, w = ArrayDicom.shape

OK, tady je konverzní skript, který jsem použil převést na soubor s příponou VTK:

import numpy as np
import SimpleITK as sitk

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

To není tak pěkné, jak správně dostat VTK import obrázků do práce, ale, no, já jsem SimpleITK chlap, a vím, že převod numpy pracuje v SimpleITK.

2021-11-12 17:32:08

Ahoj Dave, děkuji za vaši odpověď. Snažil jsem se změnit h, d a w, ale nezdá se do práce, jsem ještě dostat objemu se stejným čtvercový tvar jako na obrázku. Může to být způsobeno SetDataExtent a SetWholeExtent nebo mezery?
user42

Ahoj Dave, budu se snažit to stejně, ještě jednou vám děkuji.
user42

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................