В настоящее время я создаю программу, которая перекрывает 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()