This class performes a b-spline registration between two images. More...
#include <mitkBSplineRegistration.h>
Public Types | |
typedef BSplineRegistration | Self |
typedef RegistrationBase | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
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 |
This class performes a b-spline registration between two images.
Definition at line 42 of file mitkBSplineRegistration.h.
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.
mitk::BSplineRegistration::BSplineRegistration | ( | ) | [protected] |
mitk::BSplineRegistration::~BSplineRegistration | ( | ) | [protected, virtual] |
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); } }
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] |
std::string mitk::BSplineRegistration::m_DeformationFileName [protected] |
Definition at line 143 of file mitkBSplineRegistration.h.
int mitk::BSplineRegistration::m_Iterations [protected] |
Definition at line 133 of file mitkBSplineRegistration.h.
bool mitk::BSplineRegistration::m_MatchHistograms [protected] |
Definition at line 145 of file mitkBSplineRegistration.h.
int mitk::BSplineRegistration::m_Metric [protected] |
Definition at line 147 of file mitkBSplineRegistration.h.
int mitk::BSplineRegistration::m_NumberOfGridPoints [protected] |
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.
bool mitk::BSplineRegistration::m_SaveDeformationField [protected] |
Definition at line 141 of file mitkBSplineRegistration.h.
bool mitk::BSplineRegistration::m_SaveResult [protected] |
Definition at line 135 of file mitkBSplineRegistration.h.
bool mitk::BSplineRegistration::m_UpdateInputImage [protected] |
Definition at line 142 of file mitkBSplineRegistration.h.