mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
155 lines
4.5 KiB
Python
155 lines
4.5 KiB
Python
#! /usr/bin/env python
|
|
|
|
"""
|
|
Test NIFTI support in VTK by reading a file, writing it, and
|
|
then re-reading it to ensure that the contents are identical.
|
|
"""
|
|
|
|
import vtk
|
|
from vtk.test import Testing
|
|
from vtk.util.misc import vtkGetDataRoot
|
|
from vtk.util.misc import vtkGetTempDir
|
|
|
|
VTK_DATA_ROOT = vtkGetDataRoot()
|
|
VTK_TEMP_DIR = vtkGetTempDir()
|
|
|
|
import sys
|
|
import os
|
|
|
|
testfiles = [
|
|
["minimal.nii.gz", "out_minimal.nii.gz"],
|
|
["minimal.img.gz", "out_minimal.hdr"]
|
|
]
|
|
|
|
dispfile = "avg152T1_RL_nifti.nii.gz"
|
|
|
|
def TestDisplay(file1):
|
|
"""Display the output"""
|
|
|
|
inpath = os.path.join(str(VTK_DATA_ROOT), "Data", file1)
|
|
|
|
reader = vtk.vtkNIFTIImageReader()
|
|
reader.SetFileName(inpath)
|
|
reader.Update()
|
|
|
|
size = reader.GetOutput().GetDimensions()
|
|
center = reader.GetOutput().GetCenter()
|
|
spacing = reader.GetOutput().GetSpacing()
|
|
center1 = (center[0], center[1], center[2])
|
|
center2 = (center[0], center[1], center[2])
|
|
if size[2] % 2 == 1:
|
|
center1 = (center[0], center[1], center[2] + 0.5*spacing[2])
|
|
if size[0] % 2 == 1:
|
|
center2 = (center[0] + 0.5*spacing[0], center[1], center[2])
|
|
vrange = reader.GetOutput().GetScalarRange()
|
|
|
|
map1 = vtk.vtkImageSliceMapper()
|
|
map1.BorderOn()
|
|
map1.SliceAtFocalPointOn()
|
|
map1.SliceFacesCameraOn()
|
|
map1.SetInputConnection(reader.GetOutputPort())
|
|
map2 = vtk.vtkImageSliceMapper()
|
|
map2.BorderOn()
|
|
map2.SliceAtFocalPointOn()
|
|
map2.SliceFacesCameraOn()
|
|
map2.SetInputConnection(reader.GetOutputPort())
|
|
|
|
slice1 = vtk.vtkImageSlice()
|
|
slice1.SetMapper(map1)
|
|
slice1.GetProperty().SetColorWindow(vrange[1]-vrange[0])
|
|
slice1.GetProperty().SetColorLevel(0.5*(vrange[0]+vrange[1]))
|
|
slice2 = vtk.vtkImageSlice()
|
|
slice2.SetMapper(map2)
|
|
slice2.GetProperty().SetColorWindow(vrange[1]-vrange[0])
|
|
slice2.GetProperty().SetColorLevel(0.5*(vrange[0]+vrange[1]))
|
|
|
|
ratio = size[0]*1.0/(size[0]+size[2])
|
|
|
|
ren1 = vtk.vtkRenderer()
|
|
ren1.SetViewport(0,0,ratio,1.0)
|
|
ren2 = vtk.vtkRenderer()
|
|
ren2.SetViewport(ratio,0.0,1.0,1.0)
|
|
ren1.AddViewProp(slice1)
|
|
ren2.AddViewProp(slice2)
|
|
|
|
cam1 = ren1.GetActiveCamera()
|
|
cam1.ParallelProjectionOn()
|
|
cam1.SetParallelScale(0.5*spacing[1]*size[1])
|
|
cam1.SetFocalPoint(center1[0], center1[1], center1[2])
|
|
cam1.SetPosition(center1[0], center1[1], center1[2] - 100.0)
|
|
|
|
cam2 = ren2.GetActiveCamera()
|
|
cam2.ParallelProjectionOn()
|
|
cam2.SetParallelScale(0.5*spacing[1]*size[1])
|
|
cam2.SetFocalPoint(center2[0], center2[1], center2[2])
|
|
cam2.SetPosition(center2[0] + 100.0, center2[1], center2[2])
|
|
|
|
if "-I" in sys.argv:
|
|
style = vtk.vtkInteractorStyleImage()
|
|
style.SetInteractionModeToImageSlicing()
|
|
|
|
iren = vtk.vtkRenderWindowInteractor()
|
|
iren.SetInteractorStyle(style)
|
|
|
|
renwin = vtk.vtkRenderWindow()
|
|
renwin.SetSize(size[0] + size[2], size[1])
|
|
renwin.AddRenderer(ren1)
|
|
renwin.AddRenderer(ren2)
|
|
|
|
renwin.Render()
|
|
|
|
if "-I" in sys.argv:
|
|
renwin.SetInteractor(iren)
|
|
iren.Initialize()
|
|
iren.Start()
|
|
|
|
return renwin
|
|
|
|
def TestReadWriteRead(infile, outfile):
|
|
"""Read, write, and re-read a file, return difference."""
|
|
|
|
inpath = os.path.join(str(VTK_DATA_ROOT), "Data", infile)
|
|
outpath = os.path.join(str(VTK_TEMP_DIR), outfile)
|
|
|
|
# read a NIFTI file
|
|
reader = vtk.vtkNIFTIImageReader()
|
|
reader.SetFileName(inpath)
|
|
reader.TimeAsVectorOn()
|
|
reader.Update()
|
|
|
|
writer = vtk.vtkNIFTIImageWriter()
|
|
writer.SetInputConnection(reader.GetOutputPort())
|
|
writer.SetFileName(outpath)
|
|
# copy most information directoy from the header
|
|
writer.SetNIFTIHeader(reader.GetNIFTIHeader())
|
|
# this information will override the reader's header
|
|
writer.SetQFac(reader.GetQFac())
|
|
writer.SetTimeDimension(reader.GetTimeDimension())
|
|
writer.SetQFormMatrix(reader.GetQFormMatrix())
|
|
writer.SetSFormMatrix(reader.GetSFormMatrix())
|
|
writer.Write()
|
|
|
|
reader2 = vtk.vtkNIFTIImageReader()
|
|
reader2.SetFileName(outpath)
|
|
reader2.TimeAsVectorOn()
|
|
reader2.Update()
|
|
|
|
diff = vtk.vtkImageMathematics()
|
|
diff.SetOperationToSubtract()
|
|
diff.SetInputConnection(0,reader.GetOutputPort())
|
|
diff.SetInputConnection(1,reader2.GetOutputPort())
|
|
diff.Update()
|
|
diffrange = diff.GetOutput().GetScalarRange()
|
|
differr = diffrange[0]**2 + diffrange[1]**2
|
|
|
|
return differr
|
|
|
|
for infile, outfile in testfiles:
|
|
err = TestReadWriteRead(infile, outfile)
|
|
if err:
|
|
sys.stderr.write(
|
|
"Input " + infile + " differs from outfile " + outfile)
|
|
sys.exit(1)
|
|
|
|
renWin = TestDisplay(dispfile)
|