Advanced Normalization Tools (ANTs)#
ANTs extracts information from complex datasets that include imaging (Word Cloud). Paired with ANTsR (answer), ANTs is useful for managing, interpreting and visualizing multidimensional data. ANTs is popularly considered a state-of-the-art medical image registration and segmentation toolkit. ANTsR is an emerging tool supporting standardized multimodality image analysis. ANTs depends on the Insight ToolKit (ITK), a widely used medical image processing library to which ANTs developers contribute. A summary of some ANTs findings and tutorial material (most of which is on this page) is here.
~ Source: ANTs webpage
Installation#
http://brianavants.wordpress.com/
Once you’ve compiled the binaries, you can copy the bin
folder and the lib
folder here: /usr/local/ants/
.
In case you have previously installed ANTs binaries into /usr/bin
and you would like to remove them without manually do each for each file, here is a python script that does it.
To copy ants binaries for SCT, go to your antsbin folder. Then, copy the build_ants_sct.sh
script found in SCT_DIR/bin/osx
or linux and then execute it.
Parameters for antsRegistration#
transform#
-transform SyN[gradientStep, updateFieldVarianceInVoxelSpace, totalFieldVarianceInVoxelSpace]
gradientStep
: the higher, the more high frequency deformations (and less stable)
updateFieldVarianceInVoxelSpace
(default=3) –> the higher, the less high frequency deformations.
totalFieldVarianceInVoxelSpace
: default=0.
Exponential[1,5,5]
does not seem to move a lot
BSplineSyN[0.1,5,5,2]
gradientStep
: 0.5 –> the smaller, the smaller the distortion
updateFieldMeshSizeAtBaseLevel
:
totalFieldMeshSizeAtBaseLevel
: The larger, the larger the deform.
splineOrder
=3
metric#
-metric CC[x, x, weight, radius]
weight
: 1. This param has no influence if there is only one transform.
radius
: 4
CC is much slower than MI on large images.
MI[x,x,weight,nbBins]
nbBins
: 32
fast! however, does not work if using small mask (not enough values).
smoothing-sigmas#
-smoothing-sigmas
Can have a HUGE impact on the result. Don’t hesitate to try without smoothing, i.e., 0x0 (if you have 2 iterations).
convergence#
-convergence 20×3 –shrink-factors 2×1 –smoothing-sigmas 1x1mm –Restrict-Deformation 1x1x0 –output [tmp_reg,tmp.src_pad_reg.nii] –collapse-output-transforms 1 –interpolation BSpline[3] –winsorize-image-intensities [0.005,0.995]
Visualizing Warping Field#
ANTs saves the warping field as a component image (5D), not in vector format (4D). Therefore, it cannot be interpreted by FSL. To convert the warping field in component, you can use c3d:
c3d -mcs warp_comp.nii -oo warp_vecx.nii warp_vecy.nii warp_vecz.nii
To convert vector-based warping field into component image readable by ANTS, use the following command
c3d warp_vecx.nii warp_vecy.nii warp_vecz.nii -omc 3 warp_comp.nii
Translation#
-t Translation[GradientStep]
Example:
antsRegistration -d $ImageDimension -r [${FILE_DEST}.${EXT},${FILE_SRC}.${EXT} ,1] -m ${MetricType}
${FILE_DEST}.${EXT},${FILE_SRC}.${EXT},1,4] -o $OutPrefix -t Translation -c [10000x10000x10000,1.e-8,20] -s 4x2x1vox -f 3x2x1
Restrict Gradient Deformation#
–Restrict-Deformation XxYxZ
Example: restrict the gradient in two dimensions (axial)
ants $ImageDimension -m ${MetricType}[${FILE_DEST}.${EXT_ANAT},${FILE_SRC}.${EXT},1,4] --Restrict-Deformation 1x1x0 -t SyN -r Gauss[6,3] -o ${PATH_OUTPUT}/ -i ${MaxIteration}
Note: this restriction does not apply to the affine transformation
Point-Set Expectation (PSE)#
From the ANTs Manual PDF:
-m PSE [fixedImage, movingImage, fixedPoints, movingPoints, weight, pointSetPercentage, pointSetSigma, boundaryPointsOnly, kNeighborhood, PartialMatchingIterations=100000]
– fixedImage
: defines the space domain of the fixed point set.
– movingImage
: defines the space domain of the moving point set.
– fixedPoints/Image
: defines the coordinates of the fixed point set or label image. It can be an image with discrete positive labels, a VTK format point set file, or a text file. Details can be found in I/O section (TODO).
– movingPoints/Image
: defines the coordinates of the moving point set or label image.
– weight
: weight for this metric. 1 weights are relative to the weights on the N other metrics passed to ANTs — N is unlimited.
– pointSetPercentage
: the percentage of points to be randomly sampled used in the registration.
– pointSetSigma
: the standard deviation of the Parzen window used to estimate the expectation.
– boundaryPointsOnly
: 1 (or “true”) means only the boundary points in the label image is used to drive registration.
– kNeighborhood
is a positive discrete number. The first k neighbours are used to compute the deformation during the registration.
– PartialMatchingIterations
controls the symmetry in the matching. This option assumes the complete labeling is in the first set of label parameters … more iterations leads to more symmetry in the matching - 0 iterations means full asymmetry
Example#
ants 3 -m PSE[destination.nii,source.nii,mask_destination.nii,mask_source.nii,0.8,100,1,0,1,100000] -o source_reg -i 0 --rigid-affine true --number-of-affine-iterations 100x10x5 -m MI[destination.nii,source.nii,0.2,4] --use-all-metrics-for-convergence 1
This line does an affine registration of the moving to the fixed image. There are 2 metrics used: PSE (point-set expectation) and MI (mutual information). The weight of each of them is the first “non-string” argument (0.8 for PSE and 0.2 for MI here). To do a diffeomorphic transformation, change the -i paramater to something like 50x50x50 (number of iteration to do for the diffeomorphic transformation). The MARKER files can be done with the ITK-snap labelling utility
# apply the transformation
WarpImageMultiTransform $DIM ${FILE_SRC}.${EXT} ${FILE_SRC}_reg_diffeo.${EXT} -R ${FILE_DEST}.${EXT} --use-BSpline
${FILE_SRC}Warp.nii.gz ${FILE_SRC}Affine.txt
This line applies the affine transformation to the moving image. For a diffeomorphic case, simply add ${FILE_SRC}Warp.nii.gz in the transformation parameter (end of the line)
Affine-only point-match transformation#
Cannot be done with ANTs. Use the following command:
ANTSUseLandmarkImagesToGetAffineTransform fixed_image moving_image affine regAffine.txt
Non-affine point-match transformation#
Alternatively to ANTS, you can use the following command:
ANTSUseLandmarkImagesToGetBSplineDisplacementField
Note: Images should be in the same space! Otherwise you receive a Segmentation 11 error. Suggestion is to first run ANTSUseLandmarkImagesToGetAffineTransform
, then this command.
ITK Transform File#
The FixedCenterOfRotationAffineTransform
performs the following computation:
X′ = R·(S·X −C)+C+V
Where R is the rotation matrix, S is a scaling factor, C is the center of rotation and V is a translation vector or offset. Therefore the affine matrix M and the affine offset T are defined as:
M=R·S
T =C+V−R·C
NOTES ON ITK Transform Files:
T2d = [
a b o
c d p
0 0 1
]
T3d = [
a b c o
d e f p
g h i q
0 0 0 1
]
The “o p q” are the “offset”, which actually is not given in the file. The offset is computed from the 3×3 matrix (the first 9 parameters), from the translation “l m n” (the last three parameters), and from the center “x y z” (the three fixed parameters). To see how this is done, look at the code for ComputeOffset() itkMatrixOffsetTransformBase.hxx.
How centered transforms work: p’ = R (p - C) + C + T where p’ = transformed point, p = original point, C = Center, T= Translation. R= Rotation matrix.
Format for 2d affine transfo:
#Insight Transform File V1.0
#Transform 0
Transform: AffineTransform_double_2_2
Parameters: a b c d o p
FixedParameters: 0 0
Format for 3d affine transfo:
#Insight Transform File V1.0
#Transform 0
Transform: AffineTransform_double_3_3
Parameters: a b c d e f g h i o p q
FixedParameters: 0 0
Documentation:
ITK Documentation (700 pages): https://itk.org/ItkSoftwareGuide.pdf
http://public.kitware.com/pipermail/insight-users/2014-January/049703.html
Conversion world-image coordinate:
Discussions about ITK world coordinates: