Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::BSplineRegistration Class Reference

This class performes a b-spline registration between two images. More...

#include <mitkBSplineRegistration.h>

Inheritance diagram for mitk::BSplineRegistration:
Inheritance graph
[legend]
Collaboration diagram for mitk::BSplineRegistration:
Collaboration graph
[legend]

List of all members.

Public Types

typedef BSplineRegistration Self
typedef RegistrationBase Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
void SetNumberOfIterations (int iterations)
 Sets the number of iterations which will be performed during the registration process.
void SetSaveResult (bool saveResult)
 Sets whether the result should be saved or not.
void SetResultFileName (const char *resultName)
 Sets the filename for the resulting deformed image.
virtual void GenerateData ()
 Starts the B-Spline registration.
void SetOptimizerParameters (mitk::OptimizerParameters::Pointer optimizerParameters)
 Set the optimizer parameters.
virtual void SetNumberOfGridPoints (int _arg)
virtual void SetSaveDeformationField (bool _arg)
virtual void SetUpdateInputImage (bool _arg)
virtual void SetDeformationFileName (std::string _arg)
virtual void SetMetric (int _arg)
virtual void SetMatchHistograms (bool _arg)

Static Public Member Functions

static Pointer New ()
 Method for creation through the object factory.

Protected Member Functions

 BSplineRegistration ()
 Default constructor.
virtual ~BSplineRegistration ()
 Default destructor.
template<typename TPixel , unsigned int VImageDimension>
void GenerateData2 (itk::Image< TPixel, VImageDimension > *itkImage1)
 Template class to perform the demons registration with any kind of image. Called by GenerateData().

Protected Attributes

int m_Iterations
const char * m_ResultName
bool m_SaveResult
mitk::OptimizerParameters::Pointer m_OptimizerParameters
int m_NumberOfGridPoints
bool m_SaveDeformationField
bool m_UpdateInputImage
std::string m_DeformationFileName
bool m_MatchHistograms
int m_Metric
RigidRegistrationObserver::Pointer m_Observer

Detailed Description

This class performes a b-spline registration between two images.

Author:
Thomas van Bruggen

Definition at line 42 of file mitkBSplineRegistration.h.


Member Typedef Documentation

typedef itk::SmartPointer<const Self> mitk::BSplineRegistration::ConstPointer

Reimplemented from mitk::RegistrationBase.

Definition at line 48 of file mitkBSplineRegistration.h.

typedef itk::SmartPointer<Self> mitk::BSplineRegistration::Pointer

Reimplemented from mitk::RegistrationBase.

Definition at line 48 of file mitkBSplineRegistration.h.

Reimplemented from mitk::RegistrationBase.

Definition at line 48 of file mitkBSplineRegistration.h.

Reimplemented from mitk::RegistrationBase.

Definition at line 48 of file mitkBSplineRegistration.h.


Constructor & Destructor Documentation

mitk::BSplineRegistration::BSplineRegistration (  ) [protected]

Default constructor.

Definition at line 26 of file mitkBSplineRegistration.cpp.

               {
mitk::BSplineRegistration::~BSplineRegistration (  ) [protected, virtual]

Default destructor.

Definition at line 38 of file mitkBSplineRegistration.cpp.

               {


Member Function Documentation

virtual void mitk::BSplineRegistration::GenerateData (  ) [inline, virtual]

Starts the B-Spline registration.

Reimplemented from mitk::ImageSource.

Definition at line 76 of file mitkBSplineRegistration.h.

References AccessByItk.

    {
      if (this->GetInput())
      {
        AccessByItk(this->GetInput(), GenerateData2);
      }
    }
template<typename TPixel , unsigned int VImageDimension>
void mitk::BSplineRegistration::GenerateData2 ( itk::Image< TPixel, VImageDimension > *  itkImage1 ) [protected]

Template class to perform the demons registration with any kind of image. Called by GenerateData().

Definition at line 61 of file mitkBSplineRegistration.cpp.

  {
    m_SaveResult = saveResult;
  }

  void BSplineRegistration::SetResultFileName(const char* resultName)
  {
    m_ResultName = resultName;
  }


  

  template < typename TPixel, unsigned int VImageDimension >
    void BSplineRegistration::GenerateData2( itk::Image<TPixel, VImageDimension>* itkImage1)
  {
    std::cout << "start bspline registration" << std::endl;
    
    // Typedefs
    typedef typename itk::Image< TPixel, VImageDimension >  InternalImageType;
       
    typedef typename itk::Vector< float, VImageDimension >    VectorPixelType;
    typedef typename itk::Image<  VectorPixelType, VImageDimension > DeformationFieldType;

    typedef itk::BSplineDeformableTransform<
                                double,
                                VImageDimension,
                                3 >                         TransformType;

    typedef typename TransformType::ParametersType          ParametersType;



    
    //typedef itk::LBFGSOptimizer                             OptimizerType;
    typedef itk::SingleValuedNonLinearOptimizer             OptimizerType;
    //typedef itk::SingleValuedCostFunction                   MetricType;

    typedef itk::MattesMutualInformationImageToImageMetric<
                                InternalImageType,
                                InternalImageType >           MetricType;

    typedef itk::MeanSquaresImageToImageMetric<
                                InternalImageType,
                                InternalImageType >           MetricTypeMS;

    typedef itk::LinearInterpolateImageFunction<
                                InternalImageType,
                                double >                    InterpolatorType;

    typedef itk::ImageRegistrationMethod<
                                InternalImageType,
                                InternalImageType >           RegistrationType;

    typedef typename itk::WarpImageFilter<
                            InternalImageType, 
                            InternalImageType,
                            DeformationFieldType  >         WarperType;

    typedef typename TransformType::SpacingType                      SpacingType;

    typedef typename TransformType::OriginType                       OriginType;

    typedef itk::ResampleImageFilter< 
                                InternalImageType, 
                                InternalImageType >            ResampleFilterType;

    typedef itk::Image< TPixel, VImageDimension >           OutputImageType;
  

    // Sample new image with the same image type as the fixed image
    typedef itk::CastImageFilter< 
                                InternalImageType,
                                InternalImageType >            CastFilterType;
                    
    
    typedef itk::Vector< float, VImageDimension >           VectorType;
    typedef itk::Image< VectorType, VImageDimension >       DeformationFieldType;


    typedef itk::BSplineDeformableTransformInitializer <
                                TransformType,
                                InternalImageType >            InitializerType;
    

    typename InterpolatorType::Pointer   interpolator  = InterpolatorType::New();
    typename RegistrationType::Pointer   registration  = RegistrationType::New();   
    typename InitializerType::Pointer    initializer   = InitializerType::New();
    typename TransformType::Pointer      transform     = TransformType::New();
    
    
    if(m_Metric==0 || m_Metric==1)
    {
      typename MetricType::Pointer metric = MetricType::New();
      metric->SetNumberOfHistogramBins( 32);
      metric->SetNumberOfSpatialSamples(90000);
      registration->SetMetric(          metric       );
    }
    else{
      typename MetricTypeMS::Pointer metric = MetricTypeMS::New();  
      registration->SetMetric(          metric       );
    }
     
    typename OptimizerFactory::Pointer optFac = OptimizerFactory::New();
    optFac->SetOptimizerParameters(m_OptimizerParameters);
    optFac->SetNumberOfTransformParameters(transform->GetNumberOfParameters());
    OptimizerType::Pointer optimizer = optFac->GetOptimizer();    

    optimizer->AddObserver(itk::AnyEvent(), m_Observer);
    
    //typedef mitk::MetricFactory <TPixel, VImageDimension> MetricFactoryType;
    //typename MetricFactoryType::Pointer metricFac = MetricFactoryType::New();
    //metricFac->SetMetricParameters(m_MetricParameters);


    typename InternalImageType::Pointer fixedImage = InternalImageType::New();
    mitk::CastToItkImage(m_ReferenceImage, fixedImage);    
    typename InternalImageType::Pointer movingImage = itkImage1;
    typename InternalImageType::RegionType fixedRegion = fixedImage->GetBufferedRegion();
    typename InternalImageType::RegionType movingRegion = movingImage->GetBufferedRegion();

    
    if(m_MatchHistograms)
    {
      typedef itk::RescaleIntensityImageFilter<InternalImageType,InternalImageType> FilterType;   
      typedef itk::HistogramMatchingImageFilter<InternalImageType,InternalImageType> HEFilterType;

      typename FilterType::Pointer inputRescaleFilter = FilterType::New();  
      typename FilterType::Pointer referenceRescaleFilter = FilterType::New();  

      referenceRescaleFilter->SetInput(fixedImage);
      inputRescaleFilter->SetInput(movingImage);

      TPixel desiredMinimum =  0;
      TPixel desiredMaximum =  255;
      
      referenceRescaleFilter->SetOutputMinimum( desiredMinimum );
      referenceRescaleFilter->SetOutputMaximum( desiredMaximum );
      referenceRescaleFilter->UpdateLargestPossibleRegion();  
      inputRescaleFilter->SetOutputMinimum( desiredMinimum );
      inputRescaleFilter->SetOutputMaximum( desiredMaximum );
      inputRescaleFilter->UpdateLargestPossibleRegion();

      // Histogram match the images
      typename HEFilterType::Pointer intensityEqualizeFilter = HEFilterType::New();

      intensityEqualizeFilter->SetReferenceImage( inputRescaleFilter->GetOutput() );
      intensityEqualizeFilter->SetInput( referenceRescaleFilter->GetOutput() );
      intensityEqualizeFilter->SetNumberOfHistogramLevels( 64 );
      intensityEqualizeFilter->SetNumberOfMatchPoints( 12 );
      intensityEqualizeFilter->ThresholdAtMeanIntensityOn();
      intensityEqualizeFilter->Update();

      //fixedImage = referenceRescaleFilter->GetOutput();
      //movingImage = IntensityEqualizeFilter->GetOutput();

      fixedImage = intensityEqualizeFilter->GetOutput();
      movingImage = inputRescaleFilter->GetOutput();
    }


    //
    registration->SetOptimizer(       optimizer     );
    registration->SetInterpolator(    interpolator  );  
    registration->SetFixedImage(      fixedImage    );
    registration->SetMovingImage(     movingImage   );    
    registration->SetFixedImageRegion(fixedRegion   );

    initializer->SetTransform(transform);
    initializer->SetImage(fixedImage);
    initializer->SetNumberOfGridNodesInsideTheImage( m_NumberOfGridPoints );
    initializer->InitializeTransform();

    registration->SetTransform( transform );    

    const unsigned int numberOfParameters = transform->GetNumberOfParameters();
    
    typename itk::BSplineDeformableTransform<
                                double,
                                VImageDimension,
                                3 >::ParametersType  parameters;

    parameters.set_size(numberOfParameters);
    parameters.Fill( 0.0 );
    transform->SetParameters( parameters );

    // We now pass the parameters of the current transform as the initial
    // parameters to be used when the registration process starts.
    registration->SetInitialTransformParameters( transform->GetParameters() );
    
    std::cout << "Intial Parameters = " << std::endl;
    std::cout << transform->GetParameters() << std::endl;
 

    std::cout << std::endl << "Starting Registration" << std::endl;

    try 
    { 
      double tstart(clock());     
      registration->StartRegistration();    
      double time = clock() - tstart;
      time = time / CLOCKS_PER_SEC;
      MITK_INFO << "Registration time: " << time;
    } 
    catch( itk::ExceptionObject & err ) 
    { 
      std::cerr << "ExceptionObject caught !" << std::endl; 
      std::cerr << err << std::endl;       
    } 
    
    typename OptimizerType::ParametersType finalParameters = 
                      registration->GetLastTransformParameters();

    std::cout << "Last Transform Parameters" << std::endl;
    std::cout << finalParameters << std::endl;

    transform->SetParameters( finalParameters );

/*
    ResampleFilterType::Pointer       resampler = ResampleFilterType::New();
    resampler->SetTransform(          transform );
    resampler->SetInput(              movingImage );
    resampler->SetSize(               fixedImage->GetLargestPossibleRegion().GetSize() );
    resampler->SetOutputOrigin(       fixedImage->GetOrigin() );
    resampler->SetOutputSpacing(      fixedImage->GetSpacing() );
    resampler->SetOutputDirection(    fixedImage->GetDirection() );
    resampler->SetDefaultPixelValue(  100 );
    resampler->SetInterpolator(       interpolator);
    resampler->Update();*/



    // Generate deformation field
    typename DeformationFieldType::Pointer field = DeformationFieldType::New();    
    field->SetRegions( movingRegion );
    field->SetOrigin( movingImage->GetOrigin() );
    field->SetSpacing( movingImage->GetSpacing() );
    field->SetDirection( movingImage->GetDirection() );   
    field->Allocate();


    typedef itk::ImageRegionIterator< DeformationFieldType > FieldIterator;
    FieldIterator fi( field, movingRegion );
    fi.GoToBegin();

    typename TransformType::InputPointType  fixedPoint;
    typename TransformType::OutputPointType movingPoint;
    typename DeformationFieldType::IndexType index;

    VectorType displacement;

    while( ! fi.IsAtEnd() )
    {
      index = fi.GetIndex();
      field->TransformIndexToPhysicalPoint( index, fixedPoint );
      movingPoint = transform->TransformPoint( fixedPoint );
      displacement = movingPoint - fixedPoint;
      fi.Set( displacement );
      ++fi;
    }


    // Use the deformation field to warp the moving image
    typename WarperType::Pointer warper = WarperType::New();    
    warper->SetInput( movingImage );
    warper->SetInterpolator( interpolator );
    warper->SetOutputSpacing( movingImage->GetSpacing() );
    warper->SetOutputOrigin( movingImage->GetOrigin() );
    warper->SetOutputDirection( movingImage->GetDirection() );
    warper->SetDeformationField( field );
    warper->Update();

    typename InternalImageType::Pointer result = warper->GetOutput();    

    if(m_UpdateInputImage)
    {   
      Image::Pointer outputImage = this->GetOutput();
      mitk::CastToMitkImage( result, outputImage );
    }


    // Save the deformationfield resulting from the registration    
    if(m_SaveDeformationField)
    {      
      typedef itk::ImageFileWriter< DeformationFieldType >  FieldWriterType;
      typename FieldWriterType::Pointer fieldWriter = FieldWriterType::New();

      fieldWriter->SetInput( field );
      
virtual const char* mitk::BSplineRegistration::GetClassName (  ) const [virtual]

Reimplemented from mitk::RegistrationBase.

static Pointer mitk::BSplineRegistration::New (  ) [static]

Method for creation through the object factory.

Reimplemented from mitk::RegistrationBase.

Referenced by QmitkBSplineRegistrationView::CalculateTransformation().

virtual void mitk::BSplineRegistration::SetDeformationFileName ( std::string  _arg ) [virtual]
virtual void mitk::BSplineRegistration::SetMatchHistograms ( bool  _arg ) [virtual]
virtual void mitk::BSplineRegistration::SetMetric ( int  _arg ) [virtual]
virtual void mitk::BSplineRegistration::SetNumberOfGridPoints ( int  _arg ) [virtual]
void mitk::BSplineRegistration::SetNumberOfIterations ( int  iterations )

Sets the number of iterations which will be performed during the registration process.

Definition at line 42 of file mitkBSplineRegistration.cpp.

                                          :
    m_Iterations(50),    
    m_ResultName("deformedImage.mhd"),   
    m_SaveResult(true),
void mitk::BSplineRegistration::SetOptimizerParameters ( mitk::OptimizerParameters::Pointer  optimizerParameters ) [inline]

Set the optimizer parameters.

Definition at line 89 of file mitkBSplineRegistration.h.

    {
      m_OptimizerParameters = optimizerParameters;
    }
void mitk::BSplineRegistration::SetResultFileName ( const char *  resultName )

Sets the filename for the resulting deformed image.

Definition at line 52 of file mitkBSplineRegistration.cpp.

  {
virtual void mitk::BSplineRegistration::SetSaveDeformationField ( bool  _arg ) [virtual]
void mitk::BSplineRegistration::SetSaveResult ( bool  saveResult )

Sets whether the result should be saved or not.

Definition at line 47 of file mitkBSplineRegistration.cpp.

References mitk::RigidRegistrationObserver::New().

  {
virtual void mitk::BSplineRegistration::SetUpdateInputImage ( bool  _arg ) [virtual]

Member Data Documentation

Definition at line 143 of file mitkBSplineRegistration.h.

Definition at line 133 of file mitkBSplineRegistration.h.

Definition at line 145 of file mitkBSplineRegistration.h.

Definition at line 147 of file mitkBSplineRegistration.h.

Definition at line 140 of file mitkBSplineRegistration.h.

Definition at line 149 of file mitkBSplineRegistration.h.

Definition at line 137 of file mitkBSplineRegistration.h.

const char* mitk::BSplineRegistration::m_ResultName [protected]

Definition at line 134 of file mitkBSplineRegistration.h.

Definition at line 141 of file mitkBSplineRegistration.h.

Definition at line 135 of file mitkBSplineRegistration.h.

Definition at line 142 of file mitkBSplineRegistration.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines