template<typename TFixedImage, typename TMovingImage, typename TDisplacementField, typename TImageForceFunction = MeanSquareRegistrationFunction< TFixedImage, TMovingImage, TDisplacementField >>
class itk::CurvatureRegistrationFilter< TFixedImage, TMovingImage, TDisplacementField, TImageForceFunction >
Deformably register two images using the fast curvature algorithm.
CurvatureRegistrationFilter implements the fast (i.e., O(n log n) ) registration method described in B. Fischer and J. Modersitzki, "A unified approach to fast image registration and a new curvature
based registration technique," Linear Algebra and its Applications, vol. 380, pp. 107-124, 2004.
A deformation field is represented as a image whose pixel type is some vector type with at least N elements, where N is the dimension of the fixed image. The vector type must support element access via operator []. It is assumed that the vector elements behave like floating point scalars.
This class is templated over the fixed image type, moving image type, the deformation field type, and the images forces function. Fundamentally, any image force function in the PDE framework should work (e.g., mean squares, demons, correlation, mutual information, etc.).
The input fixed and moving images are set via methods SetFixedImage and SetMovingImage respectively. An initial deformation field maybe set via SetInitialDisplacementField or SetInput. If no initial field is set, a zero field is used as the initial condition.
The output deformation field can be obtained via methods GetOutput or GetDisplacementField.
This class makes use of the finite difference solver hierarchy. Update for each iteration is computed in the function class defined by the template parameter TImageForceFunction.
The algorithm has three parameters: the number of iteration to be performed, the time step, and the weight of the curvature regularization term in the overall cost function.
- Warning
- The algorithm parameters (time step and constraint weight) as given by F&M (dt=100; alpha=0.01) do not seem to work with this implementation. In fact, they seem to be off by orders of magnitude. This may be an effect of different normalization of the image forces, or this implementation may be incorrect. Be aware.
-
This filter assumes that the fixed image type, moving image type and deformation field type all have the same number of dimensions.
-
There is something sketchy going on with the DCT (see FFTW documentation) regarding numerical stability of the "ordinary" DCT. Also, F&M are slightly ambiguous in their use of the DCT operator. So it is quite possible that the implementation of their algorithm is not quite correct. Ultimately, they are saying that the curvature smoother is equivalent to a special low-pass filter that is applied to the DCT coefficients.
- Note
- This class was developed with funding from:
"CNS Deficits: Interaction of Age and Alcoholism" NIAAA AA05965, PI: A. Pfefferbaum
"INIA: Imaging Core" NIAAA AA13521, PI: A. Pfefferbaum
- See Also
- CurvatureRegistrationFunction
- Author
- Torsten Rohlfing, SRI International, Neuroscience Program
- Examples:
- Examples/RegistrationITKv3/DeformableRegistration10.cxx, Examples/RegistrationITKv3/DeformableRegistration9.cxx, Examples/RegistrationITKv4/DeformableRegistration10.cxx, and Examples/RegistrationITKv4/DeformableRegistration9.cxx.
Definition at line 100 of file itkCurvatureRegistrationFilter.h.
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
DisplacementFieldComponentImageType::Pointer | DisplacementFieldComponentImagePointer |
|
typedef Image< RealTypeDFT,
TDisplacementField::ImageDimension > | DisplacementFieldComponentImageType |
|
typedef
DisplacementFieldPixelType::ValueType | DisplacementFieldComponentType |
|
typedef
TDisplacementField::PixelType | DisplacementFieldPixelType |
|
typedef
Superclass::DisplacementFieldPointer | DisplacementFieldPointer |
|
typedef
Superclass::DisplacementFieldType | DisplacementFieldType |
|
typedef
Superclass::FiniteDifferenceFunctionType | FiniteDifferenceFunctionType |
|
typedef
Superclass::FixedImagePointer | FixedImagePointer |
|
typedef Superclass::FixedImageType | FixedImageType |
|
typedef
Superclass::MovingImagePointer | MovingImagePointer |
|
typedef Superclass::MovingImageType | MovingImageType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef double | RealTypeDFT |
|
typedef TImageForceFunction | RegistrationFunctionType |
|
typedef CurvatureRegistrationFilter | Self |
|
typedef
PDEDeformableRegistrationFilter
< TFixedImage, TMovingImage,
TDisplacementField > | Superclass |
|
typedef Superclass::TimeStepType | TimeStepType |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
DisplacementFieldType::Pointer | DisplacementFieldPointer |
|
typedef TDisplacementField | DisplacementFieldType |
|
typedef
Superclass::FiniteDifferenceFunctionType | FiniteDifferenceFunctionType |
|
typedef
FixedImageType::ConstPointer | FixedImageConstPointer |
|
typedef FixedImageType::Pointer | FixedImagePointer |
|
typedef TFixedImage | FixedImageType |
|
typedef
MovingImageType::ConstPointer | MovingImageConstPointer |
|
typedef MovingImageType::Pointer | MovingImagePointer |
|
typedef TMovingImage | MovingImageType |
|
typedef Superclass::OutputImageType | OutputImageType |
|
typedef
PDEDeformableRegistrationFunction
< FixedImageType,
MovingImageType,
DisplacementFieldType > | PDEDeformableRegistrationFunctionType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef
PDEDeformableRegistrationFilter | Self |
|
typedef FixedArray< double,
ImageDimension > | StandardDeviationsType |
|
typedef
DenseFiniteDifferenceImageFilter
< TDisplacementField,
TDisplacementField > | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
Superclass::FiniteDifferenceFunctionType | FiniteDifferenceFunctionType |
|
typedef Superclass::InputImageType | InputImageType |
|
typedef Superclass::OutputImageType | OutputImageType |
|
typedef Superclass::PixelType | PixelType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef
DenseFiniteDifferenceImageFilter | Self |
|
typedef
FiniteDifferenceImageFilter
< TDisplacementField,
TDisplacementField > | Superclass |
|
typedef Superclass::TimeStepType | TimeStepType |
|
typedef OutputImageType | UpdateBufferType |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
FiniteDifferenceFunction
< TDisplacementField > | FiniteDifferenceFunctionType |
|
typedef TDisplacementField | InputImageType |
|
typedef
TDisplacementField::PixelType | InputPixelType |
|
typedef NumericTraits
< InputPixelType >::ValueType | InputPixelValueType |
|
typedef
FiniteDifferenceFunctionType::NeighborhoodScalesType | NeighborhoodScalesType |
|
typedef TDisplacementField | OutputImageType |
|
typedef
TDisplacementField::PixelType | OutputPixelType |
|
typedef NumericTraits
< OutputPixelType >::ValueType | OutputPixelValueType |
|
typedef OutputPixelType | PixelType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef
FiniteDifferenceFunctionType::RadiusType | RadiusType |
|
typedef FiniteDifferenceImageFilter | Self |
|
typedef InPlaceImageFilter
< TDisplacementField,
TDisplacementField > | Superclass |
|
typedef
FiniteDifferenceFunctionType::TimeStepType | TimeStepType |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
InputImageType::ConstPointer | InputImageConstPointer |
|
typedef InputImageType::PixelType | InputImagePixelType |
|
typedef InputImageType::Pointer | InputImagePointer |
|
typedef InputImageType::RegionType | InputImageRegionType |
|
typedef TDisplacementField | InputImageType |
|
typedef
Superclass::OutputImagePixelType | OutputImagePixelType |
|
typedef
Superclass::OutputImagePointer | OutputImagePointer |
|
typedef
Superclass::OutputImageRegionType | OutputImageRegionType |
|
typedef Superclass::OutputImageType | OutputImageType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef InPlaceImageFilter | Self |
|
typedef ImageToImageFilter
< TDisplacementField,
TDisplacementField > | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
InputImageType::ConstPointer | InputImageConstPointer |
|
typedef InputImageType::PixelType | InputImagePixelType |
|
typedef InputImageType::Pointer | InputImagePointer |
|
typedef InputImageType::RegionType | InputImageRegionType |
|
typedef TDisplacementField | InputImageType |
|
typedef
Superclass::OutputImagePixelType | OutputImagePixelType |
|
typedef
Superclass::OutputImageRegionType | OutputImageRegionType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef ImageToImageFilter | Self |
|
typedef ImageSource
< TDisplacementField > | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
Superclass::DataObjectIdentifierType | DataObjectIdentifierType |
|
typedef DataObject::Pointer | DataObjectPointer |
|
typedef
Superclass::DataObjectPointerArraySizeType | DataObjectPointerArraySizeType |
|
typedef OutputImageType::PixelType | OutputImagePixelType |
|
typedef OutputImageType::Pointer | OutputImagePointer |
|
typedef OutputImageType::RegionType | OutputImageRegionType |
|
typedef TDisplacementField | OutputImageType |
|
typedef SmartPointer< Self > | Pointer |
|
typedef ImageSource | Self |
|
typedef ProcessObject | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef
DataObject::DataObjectIdentifierType | DataObjectIdentifierType |
|
typedef DataObject::Pointer | DataObjectPointer |
|
typedef std::vector
< DataObjectPointer > | DataObjectPointerArray |
|
typedef
DataObjectPointerArray::size_type | DataObjectPointerArraySizeType |
|
typedef std::vector
< DataObjectIdentifierType > | NameArray |
|
typedef SmartPointer< Self > | Pointer |
|
typedef ProcessObject | Self |
|
typedef Object | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef SmartPointer< Self > | Pointer |
|
typedef Object | Self |
|
typedef LightObject | Superclass |
|
typedef SmartPointer< const Self > | ConstPointer |
|
typedef SmartPointer< Self > | Pointer |
|
typedef LightObject | Self |
|
|
virtual void | ApplyUpdate (const TimeStepType &dt) |
|
| CurvatureRegistrationFilter () |
|
virtual void | Initialize () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
| ~CurvatureRegistrationFilter () |
|
virtual void | CopyInputToOutput () override |
|
virtual void | GenerateInputRequestedRegion () override |
|
virtual void | GenerateOutputInformation () override |
|
virtual bool | Halt () override |
|
virtual void | InitializeIteration () override |
|
| PDEDeformableRegistrationFilter () |
|
virtual void | PostProcessOutput () override |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
virtual void | SmoothDisplacementField () |
|
virtual void | SmoothUpdateField () |
|
| ~PDEDeformableRegistrationFilter () |
|
virtual void | AllocateUpdateBuffer () override |
|
virtual TimeStepType | CalculateChange () override |
|
| DenseFiniteDifferenceImageFilter () |
|
virtual UpdateBufferType * | GetUpdateBuffer () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
virtual void | ThreadedApplyUpdate (const TimeStepType &dt, const ThreadRegionType ®ionToProcess, ThreadIdType threadId) |
|
virtual TimeStepType | ThreadedCalculateChange (const ThreadRegionType ®ionToProcess, ThreadIdType threadId) |
|
| ~DenseFiniteDifferenceImageFilter () |
|
virtual void | ApplyUpdate (const TimeStepType &dt)=0 |
|
| FiniteDifferenceImageFilter () |
|
virtual void | GenerateData () override |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
virtual TimeStepType | ResolveTimeStep (const std::vector< TimeStepType > &timeStepList, const std::vector< bool > &valid) const |
|
virtual void | SetElapsedIterations (IdentifierType _arg) |
|
virtual bool | ThreadedHalt (void *) |
|
virtual | ~FiniteDifferenceImageFilter () |
|
virtual void | AllocateOutputs () override |
|
virtual bool | GetRunningInPlace () const |
|
| InPlaceImageFilter () |
|
virtual void | ReleaseInputs () override |
|
| ~InPlaceImageFilter () |
|
virtual void | CallCopyInputRegionToOutputRegion (OutputImageRegionType &destRegion, const InputImageRegionType &srcRegion) |
|
virtual void | CallCopyOutputRegionToInputRegion (InputImageRegionType &destRegion, const OutputImageRegionType &srcRegion) |
|
| ImageToImageFilter () |
|
virtual void | VerifyInputInformation () override |
|
| ~ImageToImageFilter () |
|
void | PushBackInput (const DataObject *input) override |
|
void | PushFrontInput (const DataObject *input) override |
|
virtual void | AfterThreadedGenerateData () |
|
virtual void | BeforeThreadedGenerateData () |
|
virtual const
ImageRegionSplitterBase * | GetImageRegionSplitter () const |
|
| ImageSource () |
|
virtual unsigned int | SplitRequestedRegion (unsigned int i, unsigned int pieces, OutputImageRegionType &splitRegion) |
|
virtual void | ThreadedGenerateData (const OutputImageRegionType &outputRegionForThread, ThreadIdType threadId) |
|
virtual | ~ImageSource () |
|
virtual void | AddInput (DataObject *input) |
|
virtual void | AddOutput (DataObject *output) |
|
bool | AddRequiredInputName (const DataObjectIdentifierType &) |
|
bool | AddRequiredInputName (const DataObjectIdentifierType &, DataObjectPointerArraySizeType idx) |
|
virtual void | CacheInputReleaseDataFlags () |
|
virtual void | GenerateOutputRequestedRegion (DataObject *output) |
|
DataObject * | GetInput (const DataObjectIdentifierType &key) |
|
const DataObject * | GetInput (const DataObjectIdentifierType &key) const |
|
virtual const
DataObjectPointerArraySizeType & | GetNumberOfRequiredInputs () const |
|
virtual const
DataObjectPointerArraySizeType & | GetNumberOfRequiredOutputs () const |
|
bool | IsIndexedInputName (const DataObjectIdentifierType &) const |
|
bool | IsIndexedOutputName (const DataObjectIdentifierType &) const |
|
bool | IsRequiredInputName (const DataObjectIdentifierType &) const |
|
| itkLegacyMacro (virtual void RemoveOutput(DataObject *output)) |
|
| itkLegacyMacro (void SetNumberOfOutputs(DataObjectPointerArraySizeType num)) |
|
| itkLegacyMacro (virtual void RemoveInput(DataObject *input)) |
|
| itkLegacyMacro (void SetNumberOfInputs(DataObjectPointerArraySizeType num)) |
|
DataObjectPointerArraySizeType | MakeIndexFromInputName (const DataObjectIdentifierType &name) const |
|
DataObjectPointerArraySizeType | MakeIndexFromOutputName (const DataObjectIdentifierType &name) const |
|
DataObjectIdentifierType | MakeNameFromInputIndex (DataObjectPointerArraySizeType idx) const |
|
DataObjectIdentifierType | MakeNameFromOutputIndex (DataObjectPointerArraySizeType idx) const |
|
| ProcessObject () |
|
virtual void | PropagateResetPipeline () |
|
virtual void | RemoveInput (const DataObjectIdentifierType &key) |
|
virtual void | RemoveInput (DataObjectPointerArraySizeType) |
|
virtual void | RemoveOutput (const DataObjectIdentifierType &key) |
|
virtual void | RemoveOutput (DataObjectPointerArraySizeType idx) |
|
bool | RemoveRequiredInputName (const DataObjectIdentifierType &) |
|
virtual void | RestoreInputReleaseDataFlags () |
|
virtual void | SetInput (const DataObjectIdentifierType &key, DataObject *input) |
|
virtual void | SetNthInput (DataObjectPointerArraySizeType num, DataObject *input) |
|
virtual void | SetNthOutput (DataObjectPointerArraySizeType num, DataObject *output) |
|
void | SetNumberOfIndexedInputs (DataObjectPointerArraySizeType num) |
|
void | SetNumberOfIndexedOutputs (DataObjectPointerArraySizeType num) |
|
virtual void | SetNumberOfRequiredInputs (DataObjectPointerArraySizeType) |
|
virtual void | SetNumberOfRequiredOutputs (DataObjectPointerArraySizeType _arg) |
|
virtual void | SetOutput (const DataObjectIdentifierType &key, DataObject *output) |
|
virtual void | SetPrimaryInput (DataObject *input) |
|
virtual void | SetPrimaryOutput (DataObject *output) |
|
void | SetRequiredInputNames (const NameArray &) |
|
virtual void | VerifyPreconditions () |
|
| ~ProcessObject () |
|
DataObject * | GetInput (DataObjectPointerArraySizeType idx) |
|
const DataObject * | GetInput (DataObjectPointerArraySizeType idx) const |
|
DataObject * | GetPrimaryInput () |
|
const DataObject * | GetPrimaryInput () const |
|
virtual void | SetPrimaryInputName (const DataObjectIdentifierType &key) |
|
virtual const char * | GetPrimaryInputName (void) const |
|
DataObject * | GetOutput (const DataObjectIdentifierType &key) |
|
const DataObject * | GetOutput (const DataObjectIdentifierType &key) const |
|
virtual void | SetPrimaryOutputName (const DataObjectIdentifierType &key) |
|
virtual const char * | GetPrimaryOutputName (void) const |
|
DataObject * | GetOutput (DataObjectPointerArraySizeType idx) |
|
const DataObject * | GetOutput (DataObjectPointerArraySizeType idx) const |
|
DataObject * | GetPrimaryOutput () |
|
const DataObject * | GetPrimaryOutput () const |
|
| Object () |
|
bool | PrintObservers (std::ostream &os, Indent indent) const |
|
virtual void | SetTimeStamp (const TimeStamp &time) |
|
virtual | ~Object () |
|
virtual LightObject::Pointer | InternalClone () const |
|
| LightObject () |
|
virtual void | PrintHeader (std::ostream &os, Indent indent) const |
|
virtual void | PrintTrailer (std::ostream &os, Indent indent) const |
|
virtual | ~LightObject () |
|