Class AlgorithmIHN3Correction

  • All Implemented Interfaces:
    java.awt.event.ActionListener, java.awt.event.WindowListener, java.lang.Runnable, java.util.EventListener

    public class AlgorithmIHN3Correction
    extends AlgorithmBase

    N3 Inhomogeneity correction This is based on code by John G. Sled, McConnell Brain Imaging Centre, Montreal Neurological Institute, McGill University Information may be found at: http://www.bic.mni.mcgill.ca/software/N3/ Bibliography:

    1. J.G. Sled, A.P. Zijdenbos, and A.C. Evans, "A non-parametric method for automatic correction of intensity non-uniformity in MRI data," IEEE Transactions on Medical Imaging, vol. 17, pp. 87-97, February, 1998.

    2. J.G. Sled, A.P. Zijdenbos, and A.C. Evans, "A comparison of retrospective intensity non-uniformity correction methods for MRI," in Information Processing in Medical Imaging, pp. 459-464, 1997.

    3. J.G. Sled, "A non-parametric method for automatic correction of intensity non-uniformity in MRI data," Master's thesis, McGill University, Montreal, QC, May, 1997.

    The N3 method should work with any MR volume including raw (non-stereotaxic) data.

    An artifact often seen in MRI is for the signal intensity to vary smoothly across an image. Variously referred to as RF inhomogeneity, shading artifact, or intensity non-uniformity, it is usually attributed to such factors as poor radio frequency(RF) field uniformity, eddy currents driven by switching of field gradients, and patient anatomy both inside and outside the field of view.

    This code corrects intensity non-uniformity in MR data without requiring supervision. This method can be applied without a tissue intensity or geometric model. Described as Non-parametric Non_uniform intensity Normalization (N3), the method is independent of pulse sequence and insensitive to pathological data that might otherwise violate model assumptions. To eliminate the dependence of the field estimate on anatomy, an iterative approach is employed to estimate both the multiplicative bias field and the distribution of true tissue intensities. Preprocessing of MR data using N3 has been shown to substantially improve the accuracy of anatomical analysis techniques such as tissue classification and cortical surface extraction.


    From John G. Sled's original N3 code:

     Copyright 1996, John G. Sled
     McConnell Brain Imaging Centre,
     Montreal Neurological Institute, McGill University.
     
     Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee
     is hereby granted, provided that the above copyright notice appear in all copies. The author and McGill University
     make no representations about the suitability of this software for any purpose. It is provided "as is" without
     express or implied warranty.
     

    • Field Detail

      • AtA

        private float[][] AtA
        DOCUMENT ME!
      • AtAP

        private int AtAP
        DOCUMENT ME!
      • AtFP

        private int AtFP
        DOCUMENT ME!
      • UP

        private int UP
        DOCUMENT ME!
      • DP

        private int DP
        DOCUMENT ME!
      • FP

        private int FP
        DOCUMENT ME!
      • AtF

        private double[][] AtF
        DOCUMENT ME!
      • autoThreshold

        private boolean autoThreshold
        If true determines the threshold by histogram analysis. If true a VOI cannot be used and the input threshold is ignored.
      • bendingMatrix

        private float[][][][] bendingMatrix
        DOCUMENT ME!
      • binWidth

        private float binWidth
        Histogram bin width.
      • blockInt

        private int blockInt
        DOCUMENT ME!
      • currentOffset

        private int currentOffset
        DOCUMENT ME!
      • blurI

        private float[] blurI
        DOCUMENT ME!
      • blurR

        private float[] blurR
        DOCUMENT ME!
      • buffer

        private float[] buffer
        Buffer for original source image.
      • bW

        private final float[][] bW
        DOCUMENT ME!
      • CArray

        private float[] CArray
        DOCUMENT ME!
      • class_max

        private float class_max
        DOCUMENT ME!
      • class_min

        private float class_min
        DOCUMENT ME!
      • coef

        private double[][] coef
        DOCUMENT ME!
      • correctedBuffer

        private float[] correctedBuffer
        DOCUMENT ME!
      • d1Spline

        private float[][] d1Spline
        DOCUMENT ME!
      • DArray

        private float[][] DArray
        DOCUMENT ME!
      • denom

        private float denom
        DOCUMENT ME!
      • derivative

        private int[] derivative
        DOCUMENT ME!
      • dloc_i

        private int[] dloc_i
        DOCUMENT ME!
      • dloc_j

        private int[] dloc_j
        DOCUMENT ME!
      • domain

        private float[][] domain
        DOCUMENT ME!
      • endTol

        private float endTol
        The measure used to terminate the iterations is the coefficient of variation of change in field estimates between successive iterations.
      • entireImage

        private boolean entireImage
        Ideally the Weiner filter noise equals the white noise of the image. The performance of the N3 method is enhanced by supplying a mask for the region of interest. If true, the N3 method is applied to the entire image.
      • estimateBuffer

        private float[] estimateBuffer
        DOCUMENT ME!
      • estimateOffset

        private float estimateOffset
        DOCUMENT ME!
      • estimateScale

        private float estimateScale
        DOCUMENT ME!
      • estimateSlope

        private float estimateSlope
        DOCUMENT ME!
      • fHist

        private float[] fHist
        DOCUMENT ME!
      • fHistPaddedI

        private float[] fHistPaddedI
        DOCUMENT ME!
      • fHistPaddedR

        private float[] fHistPaddedR
        DOCUMENT ME!
      • field_floor

        private final float field_floor
        Lowest allowable field value.
        See Also:
        Constant Field Values
      • fieldBuffer

        private float[] fieldBuffer
        DOCUMENT ME!
      • fieldDistance

        private float fieldDistance
        Characteristic distance over which the field varies. The distance between adjacent knots in bspline fitting with at least 4 knots going in every dimension. The default in the dialog is one third the distance (resolution * extents) of the smallest dimension.
      • fieldImage

        private ModelImage fieldImage
        DOCUMENT ME!
      • filterI

        private float[] filterI
        DOCUMENT ME!
      • filterR

        private float[] filterR
        DOCUMENT ME!
      • fIndex

        private float fIndex
        DOCUMENT ME!
      • firstMoment0

        private double firstMoment0
        DOCUMENT ME!
      • firstMoment1

        private double firstMoment1
        DOCUMENT ME!
      • fOffset

        private float fOffset
        DOCUMENT ME!
      • fwhm

        private double fwhm
        DOCUMENT ME!
      • fwhmFactor

        private double fwhmFactor
        DOCUMENT ME!
      • fwhmScale

        private double fwhmScale
        DOCUMENT ME!
      • halfBin

        private double halfBin
        DOCUMENT ME!
      • hist

        private int[] hist
        DOCUMENT ME!
      • histFactor

        private float histFactor
        DOCUMENT ME!
      • histMean

        private double histMean
        DOCUMENT ME!
      • histOffset

        private float histOffset
        DOCUMENT ME!
      • histSum

        private double histSum
        Sum of contents of hisotogram bins.
      • iLoc

        private int iLoc
        DOCUMENT ME!
      • incr

        private float incr
        DOCUMENT ME!
      • value_k

        private float value_k
        DOCUMENT ME!
      • index

        private int index
        DOCUMENT ME!
      • index1

        private int index1
        DOCUMENT ME!
      • integral

        private float[][] integral
        DOCUMENT ME!
      • interval

        private int interval
        DOCUMENT ME!
      • iters

        private int iters
        DOCUMENT ME!
      • JArray

        private double[][] JArray
        DOCUMENT ME!
      • kernelfwhm

        private float kernelfwhm
        Width of deconvolution kernel used to sharpen the histogram. Larger values give faster convergence while smaller values give greater accuracy.
      • knots

        private float[][] knots
        DOCUMENT ME!
      • lambda

        private float lambda
        DOCUMENT ME!
      • loc

        private float loc
        DOCUMENT ME!
      • locations

        private int[] locations
        DOCUMENT ME!
      • logBuffer

        private float[] logBuffer
        Log transformed data.
      • logOffset

        private float logOffset
        If minimum value of shrunken buffer < 1.0f, amount that must be added to make it 1.0f. Otherwise == 0.0f.
      • lower

        private int[] lower
        DOCUMENT ME!
      • mask

        private java.util.BitSet mask
        DOCUMENT ME!
      • maxIters

        private int maxIters
        Maximum number of iterations.
      • momentI

        private float[] momentI
        DOCUMENT ME!
      • momentR

        private float[] momentR
        DOCUMENT ME!
      • nArray

        private int[] nArray
        Number of basis functions in each dimension.
      • nBins

        private int nBins
        Number of histogram bins for shrunken buffer.
      • nDimensions

        private int nDimensions
        DOCUMENT ME!
      • newDim

        private int[] newDim
        DOCUMENT ME!
      • newRes

        private float newRes
        DOCUMENT ME!
      • newResol

        private float[] newResol
        DOCUMENT ME!
      • newSliceSize

        private int newSliceSize
        DOCUMENT ME!
      • newVolSize

        private int newVolSize
        DOCUMENT ME!
      • nMax

        private int nMax
        DOCUMENT ME!
      • noise

        private float noise
        Noise used in Weiner filter.
      • nProduct

        private int nProduct
        DOCUMENT ME!
      • four

        private int four
        DOCUMENT ME!
      • offset

        private int offset
        DOCUMENT ME!
      • offset1

        private int offset1
        DOCUMENT ME!
      • offset2

        private int offset2
        DOCUMENT ME!
      • offsetSp

        private int[][] offsetSp
        DOCUMENT ME!
      • offsetStep

        private int offsetStep
        DOCUMENT ME!
      • first

        private int first
        DOCUMENT ME!
      • last

        private int last
        DOCUMENT ME!
      • order

        private int order
        DOCUMENT ME!
      • orgDim

        private int[] orgDim
        DOCUMENT ME!
      • orgResol

        private final float[] orgResol
        Distance per pixel in millimeters.
      • padded_size

        private int padded_size
        DOCUMENT ME!
      • pLocation

        private int pLocation
        DOCUMENT ME!
      • pLocation2

        private int pLocation2
        DOCUMENT ME!
      • pValue

        private int pValue
        DOCUMENT ME!
      • pDloc_i

        private int pDloc_i
        DOCUMENT ME!
      • pDloc_j

        private int pDloc_j
        DOCUMENT ME!
      • product

        private float product
        DOCUMENT ME!
      • pSpline

        private int pSpline
        DOCUMENT ME!
      • pOffset

        private int pOffset
        DOCUMENT ME!
      • region

        private int region
        DOCUMENT ME!
      • residueBuffer

        private float[] residueBuffer
        DOCUMENT ME!
      • sBuffer

        private float[] sBuffer
        Buffer for sampled image.
      • scale

        private float scale
        DOCUMENT ME!
      • shrink

        private float shrink
        The factor by which the data is subsampled to a lower resolution in estimating the slowly varying non-uniformity field. Reduce sampling in the finest sampling direction by the shrink factor. Reduce other sampling directions only if resolution is less than shrink times original minimum resolution. Uses nearest neighbor resampling.
      • sizeC

        private int sizeC
        DOCUMENT ME!
      • sliceSize

        private int sliceSize
        DOCUMENT ME!
      • slope

        private double slope
        DOCUMENT ME!
      • smallN

        private int[] smallN
        DOCUMENT ME!
      • sMask

        private java.util.BitSet sMask
        Mask for shrunken buffer.
      • sMax

        private float sMax
        Maximum value of shrunken buffer.
      • sMin

        private float sMin
        Minimum value of shrunken buffer.
      • sourceMin

        private float sourceMin
        DOCUMENT ME!
      • sourceMax

        private float sourceMax
        DOCUMENT ME!
      • sqrtNum

        private double sqrtNum
        DOCUMENT ME!
      • start

        private int start
        DOCUMENT ME!
      • length

        private int length
        DOCUMENT ME!
      • mid

        private int mid
        DOCUMENT ME!
      • startK

        private float startK
        DOCUMENT ME!
      • stddev

        private float stddev
        DOCUMENT ME!
      • mean

        private float mean
        DOCUMENT ME!
      • numVoxels

        private float numVoxels
        DOCUMENT ME!
      • sumValue

        private float sumValue
        DOCUMENT ME!
      • sum2Value

        private float sum2Value
        DOCUMENT ME!
      • step

        private int[] step
        DOCUMENT ME!
      • Sx

        private double Sx
        DOCUMENT ME!
      • Sy

        private double Sy
        DOCUMENT ME!
      • Sz

        private double Sz
        DOCUMENT ME!
      • temp

        private float temp
        DOCUMENT ME!
      • temp2

        private float temp2
        DOCUMENT ME!
      • threshold

        private float threshold
        Values at less than threshold are treated as part of the background.
      • tiflat

        private int tiflat
        DOCUMENT ME!
      • tiindex

        private int[] tiindex
        DOCUMENT ME!
      • tistep

        private int[] tistep
        DOCUMENT ME!
      • tjflat

        private int tjflat
        DOCUMENT ME!
      • tjindex

        private int[] tjindex
        DOCUMENT ME!
      • tjstep

        private int[] tjstep
        DOCUMENT ME!
      • tMask

        private java.util.BitSet tMask
        Mask that meets threshold and sMask requirements for shrunken volume.
      • transformDir

        private int transformDir
        FORWARD or INVERSE for FFT.
      • upper

        private int[] upper
        DOCUMENT ME!
      • useScript

        private boolean useScript
        If true, the program is run from a script.
      • value

        private float value
        DOCUMENT ME!
      • value1

        private float value1
        DOCUMENT ME!
      • value2

        private float value2
        DOCUMENT ME!
      • frac

        private float frac
        DOCUMENT ME!
      • rfrac

        private float rfrac
        DOCUMENT ME!
      • values

        private float[] values
        DOCUMENT ME!
      • vari

        private double vari
        DOCUMENT ME!
      • varMax

        private double varMax
        DOCUMENT ME!
      • volSize

        private int volSize
        DOCUMENT ME!
      • volumeFactor

        private float volumeFactor
        Factor by which to shrink volume.
      • workingBuffer

        private float[] workingBuffer
        DOCUMENT ME!
      • xf

        private float xf
        DOCUMENT ME!
      • xo

        private int xo
        DOCUMENT ME!
      • xyo

        private int xyo
        DOCUMENT ME!
      • xv

        private float xv
        DOCUMENT ME!
      • xyv

        private float xyv
        DOCUMENT ME!
      • yMat

        private float[] yMat
        DOCUMENT ME!
      • ys

        private float[] ys
        DOCUMENT ME!
      • zero

        private float[] zero
        DOCUMENT ME!
      • zeroMoment0

        private double zeroMoment0
        DOCUMENT ME!
      • zeroMoment1

        private double zeroMoment1
        DOCUMENT ME!
    • Constructor Detail

      • AlgorithmIHN3Correction

        public AlgorithmIHN3Correction​(ModelImage destImg,
                                       ModelImage fieldImg,
                                       ModelImage srcImg,
                                       float _threshold,
                                       int _maxIters,
                                       float _endTol,
                                       float _fieldDistance,
                                       float _shrink,
                                       float _kernelfwhm,
                                       float _noise,
                                       boolean _entireImage,
                                       boolean _autoThreshold,
                                       boolean useScript)
        Creates a new AlgorithmIHN3Correction object.
        Parameters:
        destImg - image model where result image is to stored
        fieldImg - image model where used field is stored
        srcImg - source image model
        _threshold - Values at less than _threshold are treated as part of the background
        _maxIters - Maximum number of iterations
        _endTol - The measure used to terminate the iterations is the coefficient of variation of change in field estimates between successive iterations.
        _fieldDistance - Characteristic distance over which the field varies. The distance between adjacent knots in bspline fitting with at least 4 knots going in every dimension. The default in the dialog is one third the distance (resolution * extents) of the smallest dimension.
        _shrink - The factor by which the data is subsampled to a lower resolution in estimating the slowly varying non-uniformity field. Reduce sampling in the finest sampling direction by the shrink factor.
        _kernelfwhm - Width of deconvolution kernel used to sharpen the histogram. Larger values give faster convergence while smaller values give greater accuracy.
        _noise - Noise used in Weiner filter
        _entireImage - If true, the N3 method is applied to the entire image. If false, the N3 method is applied only to the region of interest.
        _autoThreshold - If true determines the threshold by histogram analysis. If true a VOI cannot be used and the input threshold is ignored.
        useScript - If true, the program is run from a script
    • Method Detail

      • finalize

        public void finalize()
        Prepares this class for destruction.
        Overrides:
        finalize in class AlgorithmBase
      • cleanUp

        private void cleanUp()
        Prepares this class for destruction.
      • fft

        private void fft​(float[] rData,
                         float[] iData)
        This is the method that calculates the FFT.
        Parameters:
        rData - real data
        iData - imaginary data
      • fitSplinesToVolumeLookup2D

        private void fitSplinesToVolumeLookup2D()
        DOCUMENT ME!
      • fitSplinesToVolumeLookup3D

        private void fitSplinesToVolumeLookup3D()
        DOCUMENT ME!
      • IHN3Correction2

        private void IHN3Correction2()
        IHN3Correction2(). Derived from PERL file nu_estimate_np_and_em.in Iteratively estimates intensity non-uniformity artifacts in MRI areas.
      • IHN3Correction3

        private void IHN3Correction3()
        IHN3Correction3. Derived from PERL file nu_estimate_np_and_em.in Iteratively estimates intensity non-uniformity artifacts in MRI volumes.
      • smoothVolumeLookup2D

        private void smoothVolumeLookup2D()
        DOCUMENT ME!
      • smoothVolumeLookup3D

        private void smoothVolumeLookup3D()
        DOCUMENT ME!
      • TBSplineVolume

        private void TBSplineVolume()
        DOCUMENT ME!
      • transformBilinear

        private void transformBilinear​(float[] imgBuf,
                                       TransMatrix xfrm)
        Transforms and resamples volume using bilinear interpolation.
        Parameters:
        imgBuf - - image array
        xfrm - - TransMatrix to be applied
      • transformNearestNeighbor2D

        private void transformNearestNeighbor2D​(float[] imgBuf,
                                                TransMatrix xfrm)
        Transforms and resamples volume using nearest neighbor interpolation.
        Parameters:
        imgBuf - image array
        xfrm - transformation matrix to be applied
      • transformNearestNeighbor3D

        private void transformNearestNeighbor3D​(float[] imgBuf,
                                                TransMatrix xfrm)
        Transforms and resamples volume using nearest neighbor interpolation.
        Parameters:
        imgBuf - image array
        xfrm - transformation matrix to be applied
      • transformTrilinear

        private void transformTrilinear​(float[] imgBuffer,
                                        TransMatrix matrix)
        Transforms and resamples volume using trilinear interpolation.
        Parameters:
        imgBuffer - image array
        xfrm - transformation matrix to be applied
      • volumeDomain

        private void volumeDomain()
        Allocates and initializes important buffers.