1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
package require vtk
#
# write to the temp directory if possible, otherwise use .
#
set dir "."
if {[info commands "rtTester"] == "rtTester"} {
set dir [rtTester GetTempDirectory]
}
# first, create an image to warp
vtkImageGridSource imageGrid
imageGrid SetGridSpacing 16 16 0
imageGrid SetGridOrigin 0 0 0
imageGrid SetDataExtent 0 255 0 255 0 0
imageGrid SetDataScalarTypeToUnsignedChar
vtkLookupTable table
table SetTableRange 0 1
table SetValueRange 1.0 0.0
table SetSaturationRange 0.0 0.0
table SetHueRange 0.0 0.0
table SetAlphaRange 0.0 1.0
table Build
vtkImageMapToColors alpha
alpha SetInputConnection [imageGrid GetOutputPort]
alpha SetLookupTable table
vtkBMPReader reader1
reader1 SetFileName "$VTK_DATA_ROOT/Data/masonry.bmp"
vtkImageBlend blend
blend AddInputConnection [reader1 GetOutputPort]
blend AddInputConnection [alpha GetOutputPort]
# next, create a ThinPlateSpline transform
vtkPoints p1
p1 SetNumberOfPoints 8
p1 SetPoint 0 0 0 0
p1 SetPoint 1 0 255 0
p1 SetPoint 2 255 0 0
p1 SetPoint 3 255 255 0
p1 SetPoint 4 96 96 0
p1 SetPoint 5 96 159 0
p1 SetPoint 6 159 159 0
p1 SetPoint 7 159 96 0
vtkPoints p2
p2 SetNumberOfPoints 8
p2 SetPoint 0 0 0 0
p2 SetPoint 1 0 255 0
p2 SetPoint 2 255 0 0
p2 SetPoint 3 255 255 0
p2 SetPoint 4 96 159 0
p2 SetPoint 5 159 159 0
p2 SetPoint 6 159 96 0
p2 SetPoint 7 96 96 0
vtkThinPlateSplineTransform thinPlate0
thinPlate0 SetSourceLandmarks p1
thinPlate0 SetTargetLandmarks p2
thinPlate0 SetBasisToR2LogR
set filename "$dir/mni-thinplatespline.xfm"
# write the tps to a file
vtkMNITransformWriter tpsWriter
tpsWriter SetFileName "$filename"
tpsWriter SetTransform thinPlate0
tpsWriter Write
# read it back
vtkMNITransformReader tpsReader
if { [tpsReader CanReadFile "$filename"] != 0 } {
tpsReader SetFileName "$filename"
}
set thinPlate [tpsReader GetTransform]
# make a linear transform
vtkTransform linearTransform
linearTransform PostMultiply
linearTransform Translate -127.5 -127.5 0
linearTransform RotateZ 30
linearTransform Translate +127.5 +127.5 0
# remove the linear part of the thin plate
vtkGeneralTransform tpsGeneral
tpsGeneral SetInput $thinPlate
tpsGeneral PreMultiply
tpsGeneral Concatenate [[linearTransform GetInverse] GetMatrix]
# convert the thin plate spline into a grid
vtkTransformToGrid transformToGrid
transformToGrid SetInput tpsGeneral
transformToGrid SetGridSpacing 16 16 1
transformToGrid SetGridOrigin -64.5 -64.5 0
transformToGrid SetGridExtent 0 24 0 24 0 0
transformToGrid Update
vtkGridTransform gridTransform
gridTransform SetDisplacementGridConnection [transformToGrid GetOutputPort]
gridTransform SetInterpolationModeToCubic
# add back the linear part
vtkGeneralTransform gridGeneral
gridGeneral SetInput gridTransform
gridGeneral PreMultiply
gridGeneral Concatenate [linearTransform GetMatrix]
# invert for reslice
gridGeneral Inverse
# write to a file
vtkMNITransformWriter gridWriter
gridWriter SetFileName "$dir/mni-grid.xfm"
gridWriter SetComments "TestMNITransforms output transform"
gridWriter SetTransform gridGeneral
gridWriter Write
# read it back
vtkMNITransformReader gridReader
gridReader SetFileName "$dir/mni-grid.xfm"
set transform [gridReader GetTransform]
# apply the grid warp to the image
vtkImageReslice reslice
reslice SetInputConnection [blend GetOutputPort]
reslice SetResliceTransform $transform
reslice SetInterpolationModeToLinear
# set the window/level to 255.0/127.5 to view full range
vtkImageViewer viewer
viewer SetInputConnection [reslice GetOutputPort]
viewer SetColorWindow 255.0
viewer SetColorLevel 127.5
viewer SetZSlice 0
viewer Render
|