Class AlgorithmConstrainedELSUNCOAR3D
- All Implemented Interfaces:
ActionListener,WindowListener,Runnable,EventListener
Jenkinson, M. and Smith, S. (2001a).
A global optimisation method for robust affine registration of brain images.
Medical Image Analysis, 5(2):143-156.
Our algorithm works as follows:
1.) We find the minimum resolution of the images and blur them if neccessary.
2.) We transform the images into isotropic voxels.
3.) We subsample the images by 2, 4, and 8, depending on the resolution.
Subsampling can be performed for x, y, and z or for only x and y. 4.) With the images that were subsampled by 8, we
call levelEight. This function will use the coarse sampling rate and optimize translations and global scale at the
given rotation. So for example, if the coarse sampling range were -30 to 30 at every 15 degrees, we would optimize at
rotations of (-30, -30, -30), (-30, -30, -15), (-30, -30, 0), etc. In this case there would be a total of 125 calls
to the optimization method.
5.) Still in levelEight, we now measure the cost at the fine sampling rate. We interpolate the translations and
global scale to come up with a good guess as to what the optimized translation would be at that point.
6.) We take the top 20% of the points and optimize them.
7.) We now have a large multi-array of costs. 20% of those have been optimized and placed back into their original
position in the multi-array. We look at the 9 neighbors of a point: +, =, or - one fine sample in each of the three
directions. If our point has a cost greater than any of these, it is not a minima. Otherwise it is. We save it in a
vector of minima.
8.) We optimize the minima over rotations as well as translations and global scale. (Previously we had not optimized
over rotations.) We return two vectors, one containing the minima before optimization, one containing the minima
after optimization.
9.) We now call levelFour with the images subsampled by 4 and the vectors of minima. We measure the costs of the
minima on the new images and sort them. We take the top numMinima in each vector (pre-optimization and
post-optimization) and optimize them. We put them all into one vector.
10.) We perturb the rotations in each dimension by zero and plus-minus fineDelta. If it's not a rigid transformation,
we then perturb the scaling by factors of 0.8, 0.9, 1.0, 1.1, and 1.2.
11.) We optimize the perturbations. We return a vector of the perturbed, optimized minima.
12.) We now call levelTwo with the images subsampled by 2. We measure the costs of the minima at the new images. We
optimize the best minimum with 7 degrees of freedom, then 9, then 12. If the user has limited the degrees of freedom
to 6, there will only be one optimization run, with 6 degrees of freedom. The function returns the best minimum after
optimization.
13.) We call levelOne with the un-subsampled images. At levelOne, one optimization run is performed, with the maximum
allowable degrees of freedom, as specified by the user (the max is 12).
14.) The best answer is returned from levelOne. The matrix from this answer is saved in a file and also accessed by
the dialog that called this algorithm.
Only subsample if 16 or more z slices are present so that the number of z slices will not be reduced below 8.
- Author:
- Neva Cherniavsky, Matthew McAuliffe
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) classHelper class to make it easy to store the necessary information about a minimum.Nested classes/interfaces inherited from class java.lang.Thread
Thread.Builder, Thread.State, Thread.UncaughtExceptionHandler -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!private booleanDOCUMENT ME!Final answer after registration.private intAdvanced optimization settings maxIter in the call to ELSUNC will be an integer multiple of baseNumIter.DOCUMENT ME!private ModelImageBlurred input image.private ModelImageBlurred reference image.private intSets minimum and maximum limits as initial guess -+ unit_tolerance[i]*bracketBound.private booleanIf true calculate the center of gravity (mass) and use the difference to intialize the translation.private intNumber of passes that will be made in the coarse sampling and fine sampling.private intDOCUMENT ME!private intDOCUMENT ME!private floatCoarse and fine sampling parameters.private floatDOCUMENT ME!private floatDOCUMENT ME!private intChoice of which cost function to use.private booleanDOCUMENT ME!private intMaximum degrees of freedom when running the optimization.private booleanIf true subsample for levelEight, levelFour and levelTwo analyses.private double[]Dummy initial values used to create a ELSUNC algorithm instance before setting initial.private booleanIf true this algorithm skips all subsample and goes directly to the level 1 optimization.private intNumber of passes that will be made in the coarse sampling and fine sampling.private intDOCUMENT ME!private intDOCUMENT ME!private floatCoarse and fine sampling parameters.private floatDOCUMENT ME!private floatDOCUMENT ME!private booleanIf true this algorithm skips all subsample and goes directly to the level 1 optimization.private ModelImageIsotropic input image.private ModelImageIsotropic reference image.private ModelImageIsotropic weighted input image.private ModelImageIsotropic weighted reference image.(package private) doubleDOCUMENT ME!private StringDOCUMENT ME!private ModelImageThis image is to registered to the reference image.private ModelImageThis gives weights for the input image - higher weights mean a greater impact in that area on the registration.private intInterpolation method.private floatMultiplication factor for level 1 - will be set based on subsampling.private floatDOCUMENT ME!private floatMultiplication factor for level 2 - will be set based on subsampling.private floatDOCUMENT ME!private floatMultiplication factor for level 4 - will be set based on subsampling.private floatDOCUMENT ME!private float[][]Translation limits.private float[][]DOCUMENT ME!private intDOCUMENT ME!private intAdvanced optimization settings maxIter in the call to ELSUNC will be an integer multiple of baseNumIter.(package private) doubleDOCUMENT ME!private booleanFlag to determine if the maximum of the minimum resolutions of the two datasets should be used.private static final intDOCUMENT ME!private intNumber of minima from level 8 to test at level 4.private ModelImageThe inputImage will be registered to this reference image.private ModelImageThis gives weights for the reference image - higher weights mean a greater impact in that area on the registration.private booleanDOCUMENT ME!private booleanDOCUMENT ME!private float[]The voxel resolutions of the image to be registered to the reference image.private float[]The voxel resolutions of the reference image.private floatCoarse and fine sampling parameters.private floatDOCUMENT ME!private floatDOCUMENT ME!private floatCoarse and fine sampling parameters.private floatDOCUMENT ME!private floatDOCUMENT ME!private ModelSimpleImageSimple version of input image.private ModelSimpleImageSimple version of input image, subsampled by 2.private ModelSimpleImageSimple version of input image, subsampled by 4.private ModelSimpleImageSimple version of input image, subsampled by 8.private ModelSimpleImageSimple version of reference image.private ModelSimpleImageSimple version of reference image, subsampled by 2.private ModelSimpleImageSimple version of reference image, subsampled by 4.private ModelSimpleImageSimple version of reference image, subsampled by 8.private ModelSimpleImageSimple version of weighted input image.private ModelSimpleImageSimple version of weighted input image, subsampled by 2.private ModelSimpleImageSimple version of weighted input image, subsampled by 4.private ModelSimpleImageSimple version of weighted input image, subsampled by 8.private ModelSimpleImageSimple version of weighted reference image.private ModelSimpleImageSimple version of weighted reference image, subsampled by 2.private ModelSimpleImageSimple version of weighted reference image, subsampled by 4.private ModelSimpleImageSimple version of weighted reference image, subsampled by 8.(package private) longDOCUMENT ME!(package private) longDOCUMENT ME!(package private) longDOCUMENT ME!(package private) TransMatrixDOCUMENT ME!private AlgorithmTransformTransformation algorithm for creating an isotropic reference image.private AlgorithmTransformTransformation algorithm for creating an isotropic input image.private booleanFlag to determine if there are weighted images or not.private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!private intDOCUMENT ME!Fields inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
destFlag, destImage, image25D, mask, maxProgressValue, minProgressValue, multiThreadingEnabled, nthreads, progress, progressModulus, progressStep, runningInSeparateThread, separable, srcImage, threadStoppedFields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY -
Constructor Summary
ConstructorsConstructorDescriptionAlgorithmConstrainedELSUNCOAR3D(ModelImage _imageA, ModelImage _imageB, int _costChoice, int _DOF, int _interp, float _rotateBeginX, float _rotateRangeX, float _rotateBeginY, float _rotateRangeY, float _rotateBeginZ, float _rotateRangeZ, int _nCoarseX, int _nCoarseY, int _nCoarseZ, float[][] _transLimits, boolean _maxResol, boolean _doSubsample, boolean _fastMode, boolean _calcCOG, int _bracketBound, int _baseNumIter, int _numMinima) Creates new automatic linear registration algorithm and sets necessary variables.AlgorithmConstrainedELSUNCOAR3D(ModelImage _imageA, ModelImage _imageB, ModelImage _refWeight, ModelImage _inputWeight, int _costChoice, int _DOF, int _interp, float _rotateBeginX, float _rotateRangeX, float _rotateBeginY, float _rotateRangeY, float _rotateBeginZ, float _rotateRangeZ, int _nCoarseX, int _nCoarseY, int _nCoarseZ, float[][] _transLimits, boolean _maxResol, boolean _doSubsample, boolean _fastMode, boolean _calcCOG, int _bracketBound, int _baseNumIter, int _numMinima) Creates new automatic linear registration algorithm and sets necessary variables. -
Method Summary
Modifier and TypeMethodDescriptionstatic WildMagic.LibFoundation.Mathematics.Vector3fcalculateCenterOfMass3D(ModelSimpleImage image, ModelSimpleImage wgtImage, boolean isColor) Calculates the center of mass (gravity) of a 3D image.private booleanCheck if the given minimum is within the translation and rotation bounds.voidDispose of local variables that may be taking up lots of room.voidfinalize()Prepares this class for destruction.doubleAccessor that returns the final cost function.private StringCreates a string with the parameters that the image was constructed with.private double[]getTolerance(int DOF) Gets the tolerance vector based on the degrees of freedom (the length of the tolerance is the degrees of freedom) and the level of subsampling (1, 2, 4, 8).double[]Access that returns an array containing the transformation parameters.Accessor that returns the matrix calculated in this algorithm.Accessor that returns the matrix calculated in this algorithm divided by 2.Accessor that returns the z rot and x and y trans from the matrix calculated in this algorithm.private voidinterpolate(double x, double y, double z, double[] initial, double[][][][] tranforms, boolean scale) Performs a trilinear interpolation on points.levelEight(ModelSimpleImage ref, ModelSimpleImage input) Takes two images that have been subsampled by a factor of eight.levelFour(ModelSimpleImage ref, ModelSimpleImage input, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> minima, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> optMinima) Takes two images that have been subsampled by a factor of four, and two vectors of minima.levelOne(ModelSimpleImage ref, ModelSimpleImage input, AlgorithmConstrainedELSUNCOAR3D.MatrixListItem item, int maxIter) Takes the two images, no subsampling, and the best minimum so far.levelTwo(ModelSimpleImage ref, ModelSimpleImage input, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> minima) Takes two images that have been subsampled by a factor of 2 and a vector of minima.voidRuns the image registration.private static ModelSimpleImagesubsampleBy2(ModelSimpleImage srcImage, boolean isColor) Takes a simple image and subsamples it by 2, interpolating so that the new values are averages.private static ModelSimpleImagesubsampleBy2XY(ModelSimpleImage srcImage, boolean isColor) Takes a simple image and subsamples XY by 2, interpolating so that the new XY values are averages.protected booleantestBounds3D(double[] point, String message) DOCUMENT ME!Methods inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
actionPerformed, addListener, addProgressChangeListener, calculateImageSize, calculatePrincipleAxis, computeElapsedTime, computeElapsedTime, convertIntoFloat, delinkProgressToAlgorithm, delinkProgressToAlgorithmMulti, displayError, errorCleanUp, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, generateProgressValues, getDestImage, getElapsedTime, getMask, getMaxProgressValue, getMinProgressValue, getNumberOfThreads, getProgress, getProgressChangeListener, getProgressChangeListeners, getProgressModulus, getProgressStep, getProgressValues, getSrcImage, isCompleted, isImage25D, isMultiThreadingEnabled, isRunningInSeparateThread, isThreadStopped, linkProgressToAlgorithm, linkProgressToAlgorithm, makeProgress, notifyListeners, removeListener, removeProgressChangeListener, run, setCompleted, setImage25D, setMask, setMaxProgressValue, setMinProgressValue, setMultiThreadingEnabled, setNumberOfThreads, setProgress, setProgressModulus, setProgressStep, setProgressValues, setProgressValues, setRunningInSeparateThread, setSrcImage, setStartTime, setThreadStopped, startMethod, windowActivated, windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpenedMethods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, isVirtual, join, join, join, join, ofPlatform, ofVirtual, onSpinWait, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, sleep, start, startVirtualThread, stop, suspend, threadId, toString, yield
-
Field Details
-
minimumZForSub
private static final int minimumZForSubDOCUMENT ME!- See Also:
-
initialCost
double initialCostDOCUMENT ME! -
maxPossibleCost
double maxPossibleCostDOCUMENT ME! -
timeElapsed
long timeElapsedDOCUMENT ME! -
timeLater
long timeLaterDOCUMENT ME! -
timeNow
long timeNowDOCUMENT ME! -
tMatrix
TransMatrix tMatrixDOCUMENT ME! -
allowLevel16XY
private boolean allowLevel16XYDOCUMENT ME! -
allowLevel16Z
private boolean allowLevel16ZDOCUMENT ME! -
allowLevel2XY
private boolean allowLevel2XYDOCUMENT ME! -
allowLevel2Z
private boolean allowLevel2ZDOCUMENT ME! -
allowLevel4XY
private boolean allowLevel4XYDOCUMENT ME! -
allowLevel4Z
private boolean allowLevel4ZDOCUMENT ME! -
allowLevel8XY
private boolean allowLevel8XYDOCUMENT ME! -
allowLevel8Z
private boolean allowLevel8ZDOCUMENT ME! -
answer
Final answer after registration. -
bestGuessLevel2
DOCUMENT ME! -
blurredInput
Blurred input image. -
blurredRef
Blurred reference image. -
bracketBound
private int bracketBoundSets minimum and maximum limits as initial guess -+ unit_tolerance[i]*bracketBound. -
calcCOG
private boolean calcCOGIf true calculate the center of gravity (mass) and use the difference to intialize the translation. If false, images are pretty much aligned then don't calculated COG. -
coarseNumX
private int coarseNumXNumber of passes that will be made in the coarse sampling and fine sampling. -
fineNumX
private int fineNumXNumber of passes that will be made in the coarse sampling and fine sampling. -
coarseNumY
private int coarseNumYDOCUMENT ME! -
fineNumY
private int fineNumYDOCUMENT ME! -
coarseNumZ
private int coarseNumZDOCUMENT ME! -
fineNumZ
private int fineNumZDOCUMENT ME! -
costChoice
private int costChoiceChoice of which cost function to use. -
doColor
private boolean doColorDOCUMENT ME! -
DOF
private int DOFMaximum degrees of freedom when running the optimization. -
doSubsample
private boolean doSubsampleIf true subsample for levelEight, levelFour and levelTwo analyses. -
dummy
private double[] dummyDummy initial values used to create a ELSUNC algorithm instance before setting initial. -
fastMode
private boolean fastModeIf true this algorithm skips all subsample and goes directly to the level 1 optimization. This assumes that images are fairly well aligned to begin with and therefore no sophisticated search is needed. -
fullAnalysisMode
private boolean fullAnalysisModeIf true this algorithm skips all subsample and goes directly to the level 1 optimization. This assumes that images are fairly well aligned to begin with and therefore no sophisticated search is needed. -
imageInputIso
Isotropic input image. -
imageRefIso
Isotropic reference image. -
imageWeightInputIso
Isotropic weighted input image. -
imageWeightRefIso
Isotropic weighted reference image. -
initialMessage
DOCUMENT ME! -
inputImage
This image is to registered to the reference image. -
inputWeight
This gives weights for the input image - higher weights mean a greater impact in that area on the registration. -
interp
private int interpInterpolation method. -
level1FactorXY
private float level1FactorXYMultiplication factor for level 1 - will be set based on subsampling. -
level1FactorZ
private float level1FactorZDOCUMENT ME! -
level2FactorXY
private float level2FactorXYMultiplication factor for level 2 - will be set based on subsampling. -
level2FactorZ
private float level2FactorZDOCUMENT ME! -
level4FactorXY
private float level4FactorXYMultiplication factor for level 4 - will be set based on subsampling. -
level4FactorZ
private float level4FactorZDOCUMENT ME! -
limits
private float[][] limitsTranslation limits. -
limits_mm
private float[][] limits_mmDOCUMENT ME! -
maxDim
private int maxDimDOCUMENT ME! -
maxIter
private int maxIterAdvanced optimization settings maxIter in the call to ELSUNC will be an integer multiple of baseNumIter. -
baseNumIter
private int baseNumIterAdvanced optimization settings maxIter in the call to ELSUNC will be an integer multiple of baseNumIter. -
maxResol
private boolean maxResolFlag to determine if the maximum of the minimum resolutions of the two datasets should be used. If true use the maximum resolution of the two dataset. Throws away information some image information but is faster. If false the algorithms uses the minimum of the resolutions when resampling the images. Can be slower but does not "lose" informaton. -
numMinima
private int numMinimaNumber of minima from level 8 to test at level 4. -
refImage
The inputImage will be registered to this reference image. -
refWeight
This gives weights for the reference image - higher weights mean a greater impact in that area on the registration. -
resampleInput
private boolean resampleInputDOCUMENT ME! -
resampleRef
private boolean resampleRefDOCUMENT ME! -
resInput
private float[] resInputThe voxel resolutions of the image to be registered to the reference image. -
resRef
private float[] resRefThe voxel resolutions of the reference image. -
rotateBeginX
private float rotateBeginXCoarse and fine sampling parameters. -
rotateRangeX
private float rotateRangeXCoarse and fine sampling parameters. -
coarseRateX
private float coarseRateXCoarse and fine sampling parameters. -
fineRateX
private float fineRateXCoarse and fine sampling parameters. -
rotateBeginY
private float rotateBeginYDOCUMENT ME! -
rotateRangeY
private float rotateRangeYDOCUMENT ME! -
coarseRateY
private float coarseRateYDOCUMENT ME! -
fineRateY
private float fineRateYDOCUMENT ME! -
rotateBeginZ
private float rotateBeginZDOCUMENT ME! -
rotateRangeZ
private float rotateRangeZDOCUMENT ME! -
coarseRateZ
private float coarseRateZDOCUMENT ME! -
fineRateZ
private float fineRateZDOCUMENT ME! -
simpleInput
Simple version of input image. -
simpleInputSub2
Simple version of input image, subsampled by 2. -
simpleInputSub4
Simple version of input image, subsampled by 4. -
simpleInputSub8
Simple version of input image, subsampled by 8. -
simpleRef
Simple version of reference image. -
simpleRefSub2
Simple version of reference image, subsampled by 2. -
simpleRefSub4
Simple version of reference image, subsampled by 4. -
simpleRefSub8
Simple version of reference image, subsampled by 8. -
simpleWeightInput
Simple version of weighted input image. -
simpleWeightInputSub2
Simple version of weighted input image, subsampled by 2. -
simpleWeightInputSub4
Simple version of weighted input image, subsampled by 4. -
simpleWeightInputSub8
Simple version of weighted input image, subsampled by 8. -
simpleWeightRef
Simple version of weighted reference image. -
simpleWeightRefSub2
Simple version of weighted reference image, subsampled by 2. -
simpleWeightRefSub4
Simple version of weighted reference image, subsampled by 4. -
simpleWeightRefSub8
Simple version of weighted reference image, subsampled by 8. -
transform
Transformation algorithm for creating an isotropic reference image. -
transform2
Transformation algorithm for creating an isotropic input image. -
weighted
private boolean weightedFlag to determine if there are weighted images or not. -
weightedInputPixels
private int weightedInputPixelsDOCUMENT ME! -
weightedInputPixelsSub2
private int weightedInputPixelsSub2DOCUMENT ME! -
weightedInputPixelsSub4
private int weightedInputPixelsSub4DOCUMENT ME! -
weightedInputPixelsSub8
private int weightedInputPixelsSub8DOCUMENT ME! -
weightedRefPixels
private int weightedRefPixelsDOCUMENT ME! -
weightedRefPixelsSub2
private int weightedRefPixelsSub2DOCUMENT ME! -
weightedRefPixelsSub4
private int weightedRefPixelsSub4DOCUMENT ME! -
weightedRefPixelsSub8
private int weightedRefPixelsSub8DOCUMENT ME!
-
-
Constructor Details
-
AlgorithmConstrainedELSUNCOAR3D
public AlgorithmConstrainedELSUNCOAR3D(ModelImage _imageA, ModelImage _imageB, int _costChoice, int _DOF, int _interp, float _rotateBeginX, float _rotateRangeX, float _rotateBeginY, float _rotateRangeY, float _rotateBeginZ, float _rotateRangeZ, int _nCoarseX, int _nCoarseY, int _nCoarseZ, float[][] _transLimits, boolean _maxResol, boolean _doSubsample, boolean _fastMode, boolean _calcCOG, int _bracketBound, int _baseNumIter, int _numMinima) Creates new automatic linear registration algorithm and sets necessary variables.- Parameters:
_imageA- Reference image (register input image to reference image)._imageB- Input image (register input image to reference image)._costChoice- Choice of cost functions, like correlation ratio or mutual information._DOF- Degrees of freedom for registration_interp- Interpolation method used in transformations._rotateBeginX- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeX- DOCUMENT ME!_rotateBeginY- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeY- DOCUMENT ME!_rotateBeginZ- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeZ- DOCUMENT ME!_nCoarseX- DOCUMENT ME!_nCoarseY- DOCUMENT ME!_nCoarseZ- DOCUMENT ME!_transLimits- Limitations on translations._maxResol- If true is the maximum of the minimum resolution of the two datasets when resampling._doSubsample- If true then subsample_fastMode- If true then searching the parameter space is not conducted and the algorithm proceeds to level one immediately_calcCOG- If true calculate the center of gravity (mass) to initialize registration._bracketBound- Sets minimum and maximum limits as initial guess -+ unit_tolerance[i]*bracketBound._baseNumIter- Limits the number of iterations of Powell's algorithm. maxIter in the call to Powell's will be an integer multiple of baseNumIter_numMinima- Number of minima from level 8 to test at level 4
-
AlgorithmConstrainedELSUNCOAR3D
public AlgorithmConstrainedELSUNCOAR3D(ModelImage _imageA, ModelImage _imageB, ModelImage _refWeight, ModelImage _inputWeight, int _costChoice, int _DOF, int _interp, float _rotateBeginX, float _rotateRangeX, float _rotateBeginY, float _rotateRangeY, float _rotateBeginZ, float _rotateRangeZ, int _nCoarseX, int _nCoarseY, int _nCoarseZ, float[][] _transLimits, boolean _maxResol, boolean _doSubsample, boolean _fastMode, boolean _calcCOG, int _bracketBound, int _baseNumIter, int _numMinima) Creates new automatic linear registration algorithm and sets necessary variables.- Parameters:
_imageA- Reference image (register input image to reference image)._imageB- Input image (register input image to reference image)._refWeight- Reference weighted image, used to give certain areas of the image greater impact on the registration._inputWeight- Input weighted image, used to give certain areas of the image greater impact on the registration._costChoice- Choice of cost functions, like correlation ratio or mutual information._DOF- Degrees of freedom for registration_interp- Interpolation method used in transformations._rotateBeginX- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeX- DOCUMENT ME!_rotateBeginY- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeY- DOCUMENT ME!_rotateBeginZ- Beginning of coarse sampling range (i.e., -60 degrees)._rotateRangeZ- DOCUMENT ME!_nCoarseX- DOCUMENT ME!_nCoarseY- DOCUMENT ME!_nCoarseZ- DOCUMENT ME!_transLimits- DOCUMENT ME!_maxResol- If true is the maximum of the minimum resolution of the two datasets when resampling._doSubsample- If true then subsample_fastMode- If true then searching the parameter space is not conducted and the algorithm proceeds to level one immediately_calcCOG- If true calculate the center of gravity (mass) to initialize registration._bracketBound- Sets minimum and maximum limits as initial guess -+ unit_tolerance[i]*bracketBound._baseNumIter- Limits the number of iterations of Powell's algorithm. maxIter in the call to Powell's will be an integer multiple of baseNumIter_numMinima- Number of minima from level 8 to test at level 4
-
-
Method Details
-
calculateCenterOfMass3D
public static WildMagic.LibFoundation.Mathematics.Vector3f calculateCenterOfMass3D(ModelSimpleImage image, ModelSimpleImage wgtImage, boolean isColor) Calculates the center of mass (gravity) of a 3D image. In image space where the upper left hand corner of the image is 0,0. The x axis goes left to right, y axis goes top to bottom and z axis goes into the screen. (i.e. the right hand rule). One could simply multiply by voxel resolutions.- Parameters:
image- the center of mass will be calculated from this image datawgtImage- DOCUMENT ME!isColor- DOCUMENT ME!- Returns:
- the center of mass as a 3D point
-
disposeLocal
public void disposeLocal()Dispose of local variables that may be taking up lots of room. -
finalize
public void finalize()Prepares this class for destruction.- Overrides:
finalizein classAlgorithmBase
-
getAnswer
public double getAnswer()Accessor that returns the final cost function.- Returns:
- Matrix found at the end of algorithm.
-
getTransArray
public double[] getTransArray()Access that returns an array containing the transformation parameters.- Returns:
- transformation array (0-2 rot, 3-5 trans, 6-9 scale, 9-12 skew)
-
getTransform
Accessor that returns the matrix calculated in this algorithm.- Returns:
- Matrix found at the end of algorithm.
-
getTransformHalf
Accessor that returns the matrix calculated in this algorithm divided by 2.- Returns:
- Matrix found at the end of algorithm with the compoents halved.
-
getTransformMigsagittal
Accessor that returns the z rot and x and y trans from the matrix calculated in this algorithm.- Returns:
- z rotation and x and y translations from the matrix found at the end of algorithm.
-
runAlgorithm
public void runAlgorithm()Runs the image registration. Blurs the images based on what their minimum resolutions are. The reference image is blurred if one of the input image resolutions is 50% or more bigger than the corresponding resolution in the reference image; likewise, the input image is blurred if one of the reference resolutions is 50% or more bigger than the corresponding resolution in the input image. Thus, it is unlikely, though not impossible, that both images will be blurred. The images are then transformed into isotropic voxels. The resolutions of the two images after the isotropic transformation will be the same in all dimensions. If maxResol is true, that resolution will equal the maximum of the minimums of each image's resolutions: Max( Min (resolutions of ref image, resolutions of input image) ). If the images are weighted, the weight images are blurred and transformed into isotropic voxels in the same manner as the originals. Then the images are subsampled by 2, 4, and 8. If the images are too small they will not be subsampled down to the smallest level; if they are too big, they will be subsampled to 16. The same is done with the weight images if necessary. The function levelEight is called with the images subsampled by 8; it returns two vectors with minima. Then the function levelFour is called with images subsampled by 4 and the two vectors; it returns one vector of minima. The function levelTwo is called with images subsampled by 2 and the vector; it returns an "answer" in the form of a MatrixListItem, which is a convenient way of storing the point, the matrix, and the cost of the minimum. Then the function levelOne is called with the minimum; it returns a final "answer", or minimum, which will then be accessed by the dialog that called this algorithm.- Specified by:
runAlgorithmin classAlgorithmBase
-
testBounds3D
DOCUMENT ME!- Parameters:
point- DOCUMENT ME!message- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
subsampleBy2
Takes a simple image and subsamples it by 2, interpolating so that the new values are averages.- Parameters:
srcImage- Image to subsample.isColor- DOCUMENT ME!- Returns:
- Subsampled image.
-
subsampleBy2XY
Takes a simple image and subsamples XY by 2, interpolating so that the new XY values are averages.- Parameters:
srcImage- Image to subsample.isColor- DOCUMENT ME!- Returns:
- Subsampled image.
-
checkMinimum
Check if the given minimum is within the translation and rotation bounds.- Parameters:
item- MatrixListItem- Returns:
- good true if minimum is in bounds.
-
getConstructionInfo
Creates a string with the parameters that the image was constructed with.- Returns:
- Construction info.
-
getTolerance
private double[] getTolerance(int DOF) Gets the tolerance vector based on the degrees of freedom (the length of the tolerance is the degrees of freedom) and the level of subsampling (1, 2, 4, 8).- Parameters:
DOF- Degrees of freedom, will be length of vector.- Returns:
- New tolerance vector to send to optimization.
Based on FLIRT paper: let n=pixel dimension (in one dimension) R=brain radius, here assumed to be half of field-of-view Translation tolerance = n/2 Rotation tolerance = (180/PI)*n/(2R) (converted to degrees because AlgorithmConstELSUNC works in degrees) Scaling tolerance = n/(2R) Skewing tolerance = n/(2R)
-
interpolate
private void interpolate(double x, double y, double z, double[] initial, double[][][][] tranforms, boolean scale) Performs a trilinear interpolation on points. Takes 3 initial points, a vector of values to set, and an array in which to look at neighbors of those points. Sets the appropriate values in the vector. Does not set scale if the scale parameter isfalse.- Parameters:
x- X rotation initial index into array.y- Y rotation initial index into array.z- Z rotation initial index into array.initial- Vector to set; if scale istrue, set three translations and a scale. Otherwise just set translations.tranforms- DOCUMENT ME!scale-truemeans set the scale in the vector.
-
levelEight
private Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem>[] levelEight(ModelSimpleImage ref, ModelSimpleImage input) Takes two images that have been subsampled by a factor of eight. Sets up the cost function with the images and the weighted images, if necessary. Uses the coarse sampling rate and optimizes translations and global scale at the given rotation. So for example, if the coarse sampling range were -30 to 30 at every 15 degrees, we would optimize at rotations of (-30, -30, -30), (-30, -30, -15), (-30, -30, 0), etc. In this case there would be a total of 125 calls to the optimization method. Measures the cost at the fine sampling rate. Interpolates the translations and global scale to come up with a good guess as to what the optimized translation would be at that point. Takes the top 20% of the points and optimizes them. Now have a large multi-array of costs. 20% of those have been optimized and placed back into their original position in the multi-array. Removes those items that are outisde the rotation begin and end limits. Looks at the 8 neighbors of a point: +, =, or - one fine sample in each of the three directions. If the point has a cost greater than any of these, it is not a minima. Otherwise it is. Saves it in a vector of minima. Optimizes the minima over rotations as well as translations and global scale. (Previously had not optimized over rotations.) Returns two vectors, one containing the minima before optimization, one containing the minima after optimization.- Parameters:
ref- Subsampled by 8 reference image.input- Subsampled by 8 input image.- Returns:
- List of preoptimized and optimized points.
-
levelFour
private Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> levelFour(ModelSimpleImage ref, ModelSimpleImage input, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> minima, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> optMinima) Takes two images that have been subsampled by a factor of four, and two vectors of minima. Sets up the cost function with the images and the weighted images, if necessary. Adds the level4Factor determined during subsampling. Measures the costs of the minima on the images and sort them. Takes the top three in each vector (pre-optimization and post-optimization) and optimizes them. Puts them all into one vector. Perturbs the rotations in each dimension by zero and plus-minus fineDelta. If it's not a rigid transformation, perturbs the scales by factors of 0.8, 0.9, 1.0, 1.1, and 1.2. Optimize the perturbations. Returns a vector of the perturbed, optimized minima.- Parameters:
ref- Reference image, subsampled by 4.input- Input image, subsampled by 4.minima- Preoptimized minima.optMinima- Optimized minima.- Returns:
- A vector of perturbed, optimized minima.
-
levelOne
private AlgorithmConstrainedELSUNCOAR3D.MatrixListItem levelOne(ModelSimpleImage ref, ModelSimpleImage input, AlgorithmConstrainedELSUNCOAR3D.MatrixListItem item, int maxIter) Takes the two images, no subsampling, and the best minimum so far. Sets up the cost function with the images and the weighted images, if necessary. Adds the level1Factor determined during subsampling. Performs one optimization run, with the maximum allowable degrees of freedom as specified by the user (the max is 12). Returns the best minimum.- Parameters:
ref- Reference image.input- Input image.item- Best minimum so far.maxIter- DOCUMENT ME!- Returns:
- Best minimum after optimization.
-
levelTwo
private AlgorithmConstrainedELSUNCOAR3D.MatrixListItem levelTwo(ModelSimpleImage ref, ModelSimpleImage input, Vector<AlgorithmConstrainedELSUNCOAR3D.MatrixListItem> minima) Takes two images that have been subsampled by a factor of 2 and a vector of minima. Sets up the cost function with the images and the weighted images, if necessary. Adds the level2Factor determined during subsampling. Measures the costs of the minima at the images. Optimizes the best minimum with 7 degrees of freedom, then 9, then 12. If the user has limited the degrees of freedom to 6, there will only be one optimization run, with 6 degrees of freedom. Returns the best minimum after optimization.- Parameters:
ref- Reference image, subsampled by 2.input- Input image, subsampled by 2.minima- Minima.- Returns:
- The optimized minimum.
-