import os
import numpy
import vtk
We're gonna use this function to embed a still image of a VTK render
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = str(buffer(writer.GetResult()))
return Image(data)
def createDummyRenderer():
renderer = vtk.vtkRenderer()
renderer.SetBackground(1.0, 1.0, 1.0)
camera = renderer.MakeCamera()
camera.SetPosition(-256, -256, 512)
camera.SetFocalPoint(0.0, 0.0, 255.0)
camera.SetViewAngle(30.0)
camera.SetViewUp(0.46, -0.80, -0.38)
renderer.SetActiveCamera(camera)
return renderer
l2n = lambda l: numpy.array(l)
n2l = lambda n: list(n)
# Path to the .mha file
filenameSegmentation = "./nac_brain_atlas/brain_segmentation.mha"
# Path to colorfile.txt
filenameColorfile = "./nac_brain_atlas/colorfile.txt"
# Opacity of the different volumes (between 0.0 and 1.0)
volOpacityDef = 0.25
reader = vtk.vtkMetaImageReader()
reader.SetFileName(filenameSegmentation)
castFilter = vtk.vtkImageCast()
castFilter.SetInputConnection(reader.GetOutputPort())
castFilter.SetOutputScalarTypeToUnsignedShort()
castFilter.Update()
imdataBrainSeg = castFilter.GetOutput()
Read colorfile into a dictionary
import csv
fid = open(filenameColorfile, "r")
reader = csv.reader(fid)
dictRGB = {}
for line in reader:
dictRGB[int(line[0])] = [float(line[2])/255.0,
float(line[3])/255.0,
float(line[4])/255.0]
fid.close()
Define color transfer function
funcColor = vtk.vtkColorTransferFunction()
for idx in dictRGB.keys():
funcColor.AddRGBPoint(idx,
dictRGB[idx][0],
dictRGB[idx][1],
dictRGB[idx][2])
Define scalar opacity transfer function
funcOpacityScalar = vtk.vtkPiecewiseFunction()
for idx in dictRGB.keys():
funcOpacityScalar.AddPoint(idx, volOpacityDef if idx<>0 else 0.0)
Define gradient opacity transfer function
funcOpacityGradient = vtk.vtkPiecewiseFunction()
funcOpacityGradient.AddPoint(1, 0.0)
funcOpacityGradient.AddPoint(5, 0.1)
funcOpacityGradient.AddPoint(100, 1.0)
2
propVolume = vtk.vtkVolumeProperty()
propVolume.ShadeOff()
propVolume.SetColor(funcColor)
propVolume.SetScalarOpacity(funcOpacityScalar)
propVolume.SetGradientOpacity(funcOpacityGradient)
propVolume.SetInterpolationTypeToLinear()
funcRayCast = vtk.vtkVolumeRayCastCompositeFunction()
funcRayCast.SetCompositeMethodToClassifyFirst()
mapperVolume = vtk.vtkVolumeRayCastMapper()
mapperVolume.SetVolumeRayCastFunction(funcRayCast)
mapperVolume.SetInput(imdataBrainSeg)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)
_origin = l2n(imdataBrainSeg.GetOrigin())
_spacing = l2n(imdataBrainSeg.GetSpacing())
_dims = l2n(imdataBrainSeg.GetDimensions())
_center = n2l(_origin+_spacing*(_dims/2.0))
planeClip = vtk.vtkPlane()
planeClip.SetOrigin(_center)
planeClip.SetNormal(0.0, 0.0, -1.0)
funcRayCast = vtk.vtkVolumeRayCastCompositeFunction()
funcRayCast.SetCompositeMethodToClassifyFirst()
mapperVolume = vtk.vtkVolumeRayCastMapper()
mapperVolume.SetVolumeRayCastFunction(funcRayCast)
mapperVolume.SetInput(imdataBrainSeg)
mapperVolume.AddClippingPlane(planeClip)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)
mapperVolume = vtk.vtkVolumeTextureMapper2D()
mapperVolume.SetInput(imdataBrainSeg)
mapperVolume.AddClippingPlane(planeClip)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)
mapperVolume = vtk.vtkGPUVolumeRayCastMapper()
mapperVolume.SetInput(imdataBrainSeg)
mapperVolume.AddClippingPlane(planeClip)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)
mapperVolume = vtk.vtkFixedPointVolumeRayCastMapper()
mapperVolume.SetInput(imdataBrainSeg)
mapperVolume.AddClippingPlane(planeClip)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)
mapperVolume = vtk.vtkVolumeTextureMapper3D()
mapperVolume.SetInput(imdataBrainSeg)
mapperVolume.AddClippingPlane(planeClip)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
renderer = createDummyRenderer()
renderer.AddActor(actorVolume)
vtk_show(renderer, 800, 800)