diff --git a/Testing/Unit/itkRegistration.cxx b/Testing/Unit/itkRegistration.cxx index 449ed7bd286373d1d15e2d5769b6ccf9b16d3715..3988f3089daaff475b4d1a4b359286d75eb6995d 100644 --- a/Testing/Unit/itkRegistration.cxx +++ b/Testing/Unit/itkRegistration.cxx @@ -3,27 +3,84 @@ #include "elxDataManager.h" #include "gtest/gtest.h" +#include "itkImageRegistrationMethod.h" +#include "itkTranslationTransform.h" +#include "itkMeanSquaresImageToImageMetric.h" +#include "itkLinearInterpolateImageFunction.h" +#include "itkRegularStepGradientDescentOptimizer.h" +#include "itkImage.h" +#include "itkImageFileReader.h" +#include "itkResampleImageFilter.h" +#include "itkCastImageFilter.h" + class itkRegistration : public ::testing::Test { public: virtual void SetUp() { - DataManager dataManager; - typedef itk::ImageFileReader< ImageType > ReaderType; + // TODO: Loading images here result in segfault + } - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName( dataManager.GetInput( "BrainProtonDensitySliceR10X13Y17.png" ) ); - inputImage = reader->GetOutput(); + typedef itk::Image< unsigned short, 2 > ImageType; - reader->SetFileName( dataManager.GetBaseline( "BrainProtonDensitySlice.png" ) ); - baselineImage = reader->GetOutput(); - } + typedef itk::ImageFileReader< ImageType > FixedImageReaderType; + typedef itk::ImageFileReader< ImageType > MovingImageReaderType; + + FixedImageReaderType::Pointer fixedImageReader; + MovingImageReaderType::Pointer movingImageReader; - typedef itk::Image< unsigned int, 2 > ImageType; - ImageType::Pointer inputImage; - ImageType::Pointer baselineImage; }; -TEST_F( itkRegistration, Affine2D ) -{ - ASSERT_TRUE( true ); +TEST_F( itkRegistration, ImageRegistration3 ) +{ + + typedef itk::TranslationTransform< double, ImageType::ImageDimension > TransformType; + typedef itk::RegularStepGradientDescentOptimizer OptimizerType; + typedef itk::LinearInterpolateImageFunction< ImageType, double > InterpolatorType; + typedef itk::ImageRegistrationMethod< ImageType, ImageType > RegistrationType; + + + typedef itk::MeanSquaresImageToImageMetric< ImageType, ImageType > MetricType; + + TransformType::Pointer transform = TransformType::New(); + OptimizerType::Pointer optimizer = OptimizerType::New(); + InterpolatorType::Pointer interpolator = InterpolatorType::New(); + RegistrationType::Pointer registration = RegistrationType::New(); + + MetricType::Pointer metric = MetricType::New(); + registration->SetMetric( metric ); + registration->SetOptimizer( optimizer ); + registration->SetTransform( transform ); + registration->SetInterpolator( interpolator ); + + FixedImageReaderType::Pointer fixedImageReader = FixedImageReaderType::New(); + MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New(); + + DataManager::Pointer dataManager = DataManager::New(); + + fixedImageReader->SetFileName( dataManager->GetInputFullPath( "BrainProtonDensitySlice.png" ) ); + movingImageReader->SetFileName( dataManager->GetInputFullPath( "BrainProtonDensitySliceR10X13Y17.png" ) ); + + registration->SetFixedImage( fixedImageReader->GetOutput() ); + registration->SetMovingImage( movingImageReader->GetOutput() ); + + fixedImageReader->Update(); // This is needed to make the BufferedRegion valid. + registration->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() ); + + typedef RegistrationType::ParametersType ParametersType; + ParametersType initialParameters( transform->GetNumberOfParameters() ); + + initialParameters[0] = 0.0; // Initial offset in mm along X + initialParameters[1] = 0.0; // Initial offset in mm along Y + + registration->SetInitialTransformParameters( initialParameters ); + + optimizer->SetMaximumStepLength( 4.00 ); + optimizer->SetMinimumStepLength( 0.01 ); + optimizer->SetNumberOfIterations( 200 ); + + optimizer->MaximizeOff(); + + EXPECT_NO_THROW( registration->Update() ); + RecordProperty( "MetricValue", optimizer->GetValue() ); } +