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.
1.7.2