Я хочу использовать VTK для наложения двух файлов - PullRequest
1 голос
/ 28 июня 2019

В настоящее время я создаю программу, которая перекрывает nrrd два файла.Информация, такая как интервал и размер двух файлов, одинакова.В одном файле содержится информация о медицинском трехмерном изображении, а в другом файле хранится информация индексации маркировки.Я хочу извлечь эту информацию об индексировании и сделать отображение цветов разным для каждого индексирования.Вывод обоих файлов успешен, но два файла не наложены.Я посмотрел на код, но я не смог увидеть, в чем проблема.

Результат программы Я думаю, это связано с разницей в маппере, который рендерит два файла, поэтому я его рендерилиспользуя тот же картограф.Отображение цветов не удалось, но наложенная печать прошла успешно.

Итак, что вам нужно сделать, чтобы напечатать два объекта снова и снова?Я не знаю, как смотреть на код.Большое спасибо за ваши ответы.

import vtk
import nrrd
import numpy as np
from vtk.util import numpy_support as VN


def main():
    renWin = vtk.vtkRenderWindow()
    renderer = vtk.vtkRenderer()
    renWin.AddRenderer(renderer)
    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)


reader = vtk.vtkNrrdReader()
reader.SetFileName('sample_nrrd.nrrd')
reader.Update()

vol = ImageDataToVolume(reader.GetOutput())
renderer.AddVolume(vol)

data = nrrd.read('Segmentation-label_2.nrrd')

for x in range(0, 500):
    for y in range(100, 500):
        for z in range(220, 300):
            if data[0][x][y][z] != 0:
                src = vtk.vtkSphereSource()
                src.SetCenter(x, y, z)
                src.SetRadius(0.6)

                src.Update()

                mapper1 = vtk.vtkPolyDataMapper()
                actor1 = vtk.vtkActor()
                mapper1.SetInputConnection(src.GetOutputPort())
                actor1.SetMapper(mapper1)
                if data[0][x][y][z] == 1:
                    actor1.GetProperty().SetColor(255, 0, 0)
                elif data[0][x][y][z] == 2:
                    actor1.GetProperty().SetColor(0, 255, 0)
                elif data[0][x][y][z] == 3:
                    actor1.GetProperty().SetColor(0, 0, 255)
                elif data[0][x][y][z] == 4:
                    actor1.GetProperty().SetColor(255, 255, 0)
                renderer.AddActor(actor1)
iren.Initialize()
renWin.Render()
iren.Start() 


def ImageDataToVolume(imagedata):
    mapper = vtk.vtkSmartVolumeMapper()
    mapper.SetInputData(imagedata)

    vol = vtk.vtkVolume()
    vol.SetMapper(mapper)

    ApplyAutoVolumeProperty(imagedata, mapper, vol)

    return vol 


def GetScalarData(ptData):
    vtkDataArray = ptData.GetScalars()
    if vtkDataArray == None:
        return np.array([])
    sData = VN.vtk_to_numpy(vtkDataArray)
    return sData 


def ApplyAutoVolumeProperty(pData, pMapper, pVolume):
    scalar = GetScalarData(pData.GetPointData())

    min_value = -1000
    max_value = 3095

    fCenter = (max_value - min_value) / 2.0
    fWidth = max_value - min_value

    fLow = fCenter - fWidth / 2.0
    fHigh = fCenter + fWidth / 2.0

    fTerm = fHigh - fLow;

    print("min, max : " + str(min_value) + ", " + str(max_value))

    pMapper.SetBlendModeToComposite()

    volProperty = vtk.vtkVolumeProperty()
    volProperty.ShadeOn()
    volProperty.SetInterpolationTypeToLinear()
    volProperty.SetDiffuse(0.7)
    volProperty.SetAmbient(0.2)
    volProperty.SetSpecular(0.3)
    volProperty.SetSpecularPower(30.0)

    otf = vtk.vtkPiecewiseFunction()
    otf.AddPoint(fLow, 0.0)  # start
    otf.AddPoint(fHigh, 1.0)  # end
    volProperty.SetScalarOpacity(0, otf)

    ctf = vtk.vtkColorTransferFunction()
    ctf.AddRGBPoint(fLow + fTerm * 0 * 0.2, 0.0, 0.0, 0.0)
    ctf.AddRGBPoint(fLow + fTerm * 1 * 0.2, 0.7, 0.4, 0.1)
    ctf.AddRGBPoint(fLow + fTerm * 2 * 0.2, 0.6, 0.5, 0.3)
    ctf.AddRGBPoint(fHigh, 1.0, 1.0, 1.0)
    volProperty.SetColor(0, ctf)

    pVolume.SetProperty(volProperty)
    pass 


if __name__ == '__main__':
    main()
...