csci 6971: image registration lecture 10: registration components february 13, 2004 prof. chuck...
Post on 21-Dec-2015
216 views
TRANSCRIPT
CSci 6971: Image Registration Lecture 10: Registration Components
February 13, 2004
CSci 6971: Image Registration Lecture 10: Registration Components
February 13, 2004
Prof. Chuck Stewart, RPIDr. Luis Ibanez, KitwareProf. Chuck Stewart, RPIDr. Luis Ibanez, Kitware
Image Registration Lecture 10 2
Registration ComponentsRegistration Components
Basic Registration Framework
Image Registration Lecture 10 3
Image Registration FrameworkImage Registration Framework
FixedImage
MovingImage
Metric
Transform
Interpolator Optimizer
Parameters
Image Registration Lecture 10 4
Image RegistrationImage Registration
#include ”itkImageRegistrationMethod.h”#include ”itkTranslationTransform.h”#include ”itkMeanSquaresImageToImageMetric.h”#include ”itkLinearInterpolateImageFunction.h”#include ”itkRegularStepGradientDescentOptimizer.h”#include ”itkImage.h”#include ”itkImageFileReader.h”#include ”itkImageFileWriter.h”#include ”itkResampleImageFilter.h”
Image Registration Lecture 10 5
Image RegistrationImage Registration
const unsigned int Dimension = 2;
typedef unsigned char PixelType;
typedef itk::Image< PixelType , Dimension > FixedImageType;
typedef itk::Image< PixelType , Dimension > MovingImageType;
typedef itk::TranslationTransform< double, Dimension > TransformType;
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
typedef itk::LinearInterpolateImageFunction< MovingImageType , double > InterpolatorType;
typedef itk::MeanSquaresImageToImageMetric< FixedImageType , MovingImageType > MetricType;
typedef itk::ImageRegistrationMethod< FixedImageType , MovingImageType > RegistrationType;
Image Registration Lecture 10 6
Image RegistrationImage Registration
TransformType::Pointer transform = TransformType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
MetricType::Pointer metric = MetricType::New();
RegistrationType::Pointer registrator = RegistrationType::New();
registrator->SetTransform( transform );
registrator->SetOptimizer( optimizer );
registrator->SetInterpolator( interpolator );
registrator->SetMetric( metric );
registrator->SetFixedImage( fixedImageReader->GetOutput() );
registrator->SetMovingImage( movingImageReader->GetOutput() );
Image Registration Lecture 10 7
Image RegistrationImage Registration
registrator->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
typedef RegistrationType::ParametersType ParametersType;
transform->SetIdentity();
registrator->SetInitialTransformParameters( transform->GetParameters() );
optimizer->SetMaximumStepLength( 4.00 );
optimizer->SetMinimumStepLength( 0.01 );
optimizer->SetNumberOfIterations( 100 );
optimizer->MaximizeOff();
Image Registration Lecture 10 8
Image RegistrationImage Registration
try { registrator->StartRegistration (); }catch( itk::ExceptionObject & excp ) { std::cerr << “Error in registration” << std::endl; std::cerr << excp << std::endl; }
transform->SetParameters( registrator->GetLastTransformParameters() );
Image Registration Lecture 10 9
Image Registration FrameworkImage Registration Framework
FixedImage
MovingImage
Metric
Transform
Interpolator
Optimizer
Parameters
Resampler
MovingRegistered
Image Registration Lecture 10 10
Image RegistrationImage Registration
typedef itk::ResampleImageFilter< FixedImageType , MovingImageType > ResamplerType;
ResamplerType ::Pointer resampler = ResamplerType::New();
resampler->SetTransform ( transform );
resampler->SetInput( movingImageReader->GetOutput() );
FixedImageType ::Pointer fixedImage = fixedImageReader->GetOutput();
resampler->SetOrigin( fixedImage->GetOrigin() );
resampler->SetSpacing( fixedImage->GetSpacing() );
resampler->SetSize( fixedImage->GetLargestPossibleRegion()->GetSize() );
resampler->Update();
Image Registration Lecture 10 11
Image RegistrationImage Registration
Tracking the
Registration Process
Image Registration Lecture 10 12
Observing RegistrationObserving Registration
#include ”itkCommand.h”
class CommandIteration : public itk::Command {
public: typedef CommandIteration Self;
typedef itk::Command SuperClass;
typedef itk::SmartPointer< Self > Pointer;
itkNewMacro( Self );
protected:
CommandIteration() {};
public:
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
typedef const OptimizerType * OptimizerPointer;
Image Registration Lecture 10 13
Observing RegistrationObserving Registration
void Execute( itk::Object * caller, const itk::EventObject & event ) { this-> Execute( (const itk::Object *) caller, event ); }
void Execute( const itk::Object * caller, const itk::EventObject & event ) { OptimizerPointer optimizer = dynamic_cast< OptimizerPointer >( caller );
if( typeid( event ) == typeid( itk::IterationEvent ) ) { std::cout << optimizer->GetCurrentIteration() << “ : “; std::cout << optimizer->GetValue() << “ : “; std::cout << optimizer->GetCurrentPosition() << std::endl; } }
Image Registration Lecture 10 14
Observing RegistrationObserving Registration
CommandIteration::Pointer observer = CommandIteration::New();
optimizer->AddObserver( itk::IterationEvent(), observer )
try { registrator->StartRegistration (); }catch( itk::ExceptionObject & excp ) { std::cerr << “Error in registration” << std::endl; std::cerr << excp << std::endl; }
Image Registration Lecture 10 15
Registration dirty little secretsRegistration dirty little secrets
Rotation – Translation
Parameter Scaling
Image Registration Lecture 10 16
Registration dirty little secretsRegistration dirty little secrets
Fixed Image Moving Image Registered Moving Image
Image Registration Lecture 10 17
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
Image Registration Lecture 10 18
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
Image Registration Lecture 10 19
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
Image Registration Lecture 10 20
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
Image Registration Lecture 10 21
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
Image Registration Lecture 10 22
Gradient Descent OptimizerGradient Descent Optimizer
f( x , y )
S = L ∙ G( x , y )f( x , y )
∆
G( x , y ) =
How about a factor 1:100 ?
Image Registration Lecture 10 23
Radians & MillimetersRadians & Millimeters
0.0 rad x
y
1.57 rad
180 mm
Image Registration Lecture 10 24
Radians & MillimetersRadians & Millimeters
0.0 rad x
y
1.57 rad
180 mm
1.57 rad
180 mm
1:100
Image Registration Lecture 10 26
Rotation around the Center Rotation around the Center
y
Fixed
Transform
10o
x
y
Moving
x
Image Registration Lecture 10 27
Centered Rigid 2D TransformCentered Rigid 2D Transform
#include ”itkImageRegistrationMethod.h”#include ”itkCenteredRigid2DTransform.h”#include ”itkMeanSquaresImageToImageMetric.h”#include ”itkLinearInterpolateImageFunction.h”#include ”itkRegularStepGradientDescentOptimizer.h”#include ”itkCenteredTransformInitializer.h”#include ”itkImage.h”#include ”itkImageFileReader.h”#include ”itkImageFileWriter.h”#include ”itkResampleImageFilter.h”
Image Registration Lecture 10 28
Centered Rigid 2D TransformCentered Rigid 2D Transform
const unsigned int Dimension = 2;typedef unsigned char PixelType;
typedef itk::Image< PixelType , Dimension > FixedImageType;typedef itk::Image< PixelType , Dimension > MovingImageType;
typedef itk::CenteredRigid2DTransform< double > TransformType;
typedef itk:: CenteredTransformInitializer< TransformType , FixedImageType , MovingImageType > InitializerType;
Image Registration Lecture 10 29
Centered Rigid 2D TransformCentered Rigid 2D Transform
TransformType::Pointer transform = TransformType::New();
InitializerType::Pointer initializer = InitializerType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
MetricType::Pointer metric = MetricType::New();
RegistrationType::Pointer registrator = RegistrationType::New();
registrator->SetTransform( transform );
registrator->SetOptimizer( optimizer );
registrator->SetInterpolator( interpolator );
registrator->SetMetric( metric );
registrator->SetFixedImage( fixedImageReader->GetOutput() );
registrator->SetMovingImage( movingImageReader->GetOutput() );
Image Registration Lecture 10 30
Centered Transform InitializerCentered Transform Initializer
y
Fixed Image
Transform
x
y
Moving Image
x
Geometry On
Image Registration Lecture 10 31
Centered Transform InitializerCentered Transform Initializer
y
Fixed Image
Transform
x
y
Moving Image
x
Moments On
Xm = Sum( x ∙ I ) / Sum( I )Ym = Sum( y ∙ I ) / Sum( I )
Image Registration Lecture 10 32
Centered Rigid 2D TransformCentered Rigid 2D Transform
registrator->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
initializer->SetTransform ( transform );
initializer->SetFixedImage( fixedImageReader->GetOutput() );
initializer->SetMovingImage( movingImageReader->GetOutput() );
initializer->MomentsOn();
initializer->InitializeTransform();
registrator->SetInitialTransformParameters( transform->GetParameters() );
Image Registration Lecture 10 33
Centered Rigid 2D TransformCentered Rigid 2D Transform
y
x
Array of
Parameters
P[ 0 ]
P[ 1 ]
P[ 2 ]
P[ 3 ]
P[ 4 ]
Angle
Center X
Center Y
Trans X
Trans Y
Image Registration Lecture 10 34
Centered Rigid 2D TransformCentered Rigid 2D Transform
typedef OptimizerType::ScaleType OptimizerScalesType;
OptimizerScalesType optimizerScales( optimizer->SetMaximumStepLength() );
const double translationScale = 1.0 / 1000.0 ;
optimizerScales[ 0 ] = 1.0;
optimizerScales[ 1 ] = translationScale;
optimizerScales[ 2 ] = translationScale;
optimizerScales[ 3 ] = translationScale;
optimizerScales[ 4 ] = translationScale;
optimizer->SetScales( optimizerScales );
Image Registration Lecture 10 35
Centered Rigid 2D TransformCentered Rigid 2D Transform
try { registrator->StartRegistration (); }catch( itk::ExceptionObject & excp ) { std::cerr << “Error in registration” << std::endl; std::cerr << excp << std::endl; }
transform->SetParameters( registrator->GetLastTransformParameters() );
Image Registration Lecture 10 36
Image Registration FrameworkImage Registration Framework
FixedImage
MovingImage
Metric
Transform
Interpolator
Optimizer
Parameters
Resampler
MovingRegistered
Image Registration Lecture 10 37
Centered Rigid 2D TransformCentered Rigid 2D Transform
typedef itk::ResampleImageFilter< FixedImageType , MovingImageType > ResamplerType;
ResamplerType ::Pointer resampler = ResamplerType::New();
resampler->SetTransform ( transform );
resampler->SetInput( movingImageReader->GetOutput() );
FixedImageType ::Pointer fixedImage = fixedImageReader->GetOutput();
resampler->SetOrigin( fixedImage->GetOrigin() );
resampler->SetSpacing( fixedImage->GetSpacing() );
resampler->SetSize( fixedImage->GetLargestPossibleRegion()->GetSize() );
resampler->Update();
Image Registration Lecture 10 40
Affine TransformsAffine Transforms
Qx M11 M12 Px T1
Qy M21 M22 Py T2
= ∙ +
Image Registration Lecture 10 41
Affine Transform – ShearingAffine Transform – Shearing
Qx 1 a Px T1
Qy 0 1 Py T2
= ∙ +
Image Registration Lecture 10 44
Affine Transform – ShearingAffine Transform – Shearing
Qx 1 0 Px T1
Qy b 1 Py T2
= ∙ +
Image Registration Lecture 10 47
Coefficients - Orders of MagnitudeCoefficients - Orders of Magnitude
Qx 1.0 0.1 Px 100
Qy 0.1 1.0 Py 100
= ∙ +
Image Registration Lecture 10 48
Affine Transform – RotationAffine Transform – Rotation
Qx cosθ -sinθ Px T1
Qy sinθ cosθ Py T2
= ∙ +
Image Registration Lecture 10 49
Affine Transform – ScalingAffine Transform – Scaling
Qx Sx 0 Px T1
Qy 0 Sy Py T2
= ∙ +
Image Registration Lecture 10 50
Affine Transform - ParameterizationAffine Transform - Parameterization
M11 M12 T1
M21 M22 T2
[ P0 P1 P2 P3 P4 P5 ]
Image Registration Lecture 10 51
Parameter ScalingParameter Scaling
M11 M12 T1
M21 M22 T2
[ P0 P1 P2 P3 P4 P5 ]
range [ 1.0 0.1 0.1 1.0 100 100 ]
scale [ 1.0 10 10 1.0 0.01 0.01 ]
Image Registration Lecture 10 52
Centered Affine TransformCentered Affine Transform
#include ”itkImageRegistrationMethod.h”#include ”itkCenteredAffineTransform.h”#include ”itkMeanSquaresImageToImageMetric.h”#include ”itkLinearInterpolateImageFunction.h”#include ”itkRegularStepGradientDescentOptimizer.h”#include ”itkCenteredTransformInitializer.h”#include ”itkImage.h”#include ”itkImageFileReader.h”#include ”itkImageFileWriter.h”#include ”itkResampleImageFilter.h”
Image Registration Lecture 10 53
Centered Affine TransformCentered Affine Transform
const unsigned int Dimension = 2;typedef unsigned char PixelType;
typedef itk::Image< PixelType , Dimension > FixedImageType;typedef itk::Image< PixelType , Dimension > MovingImageType;
typedef itk::CenteredAffineTransform< double > TransformType;
typedef itk:: CenteredTransformInitializer< TransformType , FixedImageType , MovingImageType > InitializerType;
Image Registration Lecture 10 54
Centered Affine TransformCentered Affine Transform
TransformType::Pointer transform = TransformType::New();
InitializerType::Pointer initializer = InitializerType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
MetricType::Pointer metric = MetricType::New();
RegistrationType::Pointer registrator = RegistrationType::New();
registrator->SetTransform( transform );
registrator->SetOptimizer( optimizer );
registrator->SetInterpolator( interpolator );
registrator->SetMetric( metric );
registrator->SetFixedImage( fixedImageReader->GetOutput() );
registrator->SetMovingImage( movingImageReader->GetOutput() );
Image Registration Lecture 10 55
Centered Transform InitializerCentered Transform Initializer
y
Fixed Image
Transform
x
y
Moving Image
x
Geometry On
Image Registration Lecture 10 56
Centered Transform InitializerCentered Transform Initializer
y
Fixed Image
Transform
x
y
Moving Image
x
Moments On
Xm = Sum( x ∙ I ) / Sum( I )Ym = Sum( y ∙ I ) / Sum( I )
Image Registration Lecture 10 57
Centered Affine TransformCentered Affine Transform
registrator->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
initializer->SetTransform ( transform );
initializer->SetFixedImage( fixedImageReader->GetOutput() );
initializer->SetMovingImage( movingImageReader->GetOutput() );
initializer->MomentsOn();
initializer->InitializeTransform();
registrator->SetInitialTransformParameters( transform->GetParameters() );
Image Registration Lecture 10 58
Affine Transform - ParameterizationAffine Transform - Parameterization
M11 M12 T1
M21 M22 T2
P[0] P[1] P[2] P[3] P[4] P[5]
Image Registration Lecture 10 59
Centered Affine TransformCentered Affine Transform
typedef OptimizerType::ScaleType OptimizerScalesType;
OptimizerScalesType optimizerScales( optimizer->GetNumberOfParameters() );
optimizerScales[ 0 ] = 1.0;
optimizerScales[ 1 ] = 10.0;
optimizerScales[ 2 ] = 10.0;
optimizerScales[ 3 ] = 1.0;
optimizerScales[ 4 ] = 0.01;
optimizerScales[ 5 ] = 0.01;
optimizer->SetScales( optimizerScales );
Image Registration Lecture 10 60
Centered Rigid 2D TransformCentered Rigid 2D Transform
try { registrator->StartRegistration (); }catch( itk::ExceptionObject & excp ) { std::cerr << “Error in registration” << std::endl; std::cerr << excp << std::endl; }
transform->SetParameters( registrator->GetLastTransformParameters() );
Image Registration Lecture 10 61
Image Registration FrameworkImage Registration Framework
FixedImage
MovingImage
Metric
Transform
Interpolator
Optimizer
Parameters
Resampler
MovingRegistered
Image Registration Lecture 10 62
Final ResamplingFinal Resampling
typedef itk::ResampleImageFilter< FixedImageType , MovingImageType > ResamplerType;
ResamplerType ::Pointer resampler = ResamplerType::New();
resampler->SetTransform ( transform );
resampler->SetInput( movingImageReader->GetOutput() );
FixedImageType ::Pointer fixedImage = fixedImageReader->GetOutput();
resampler->SetOrigin( fixedImage->GetOrigin() );
resampler->SetSpacing( fixedImage->GetSpacing() );
resampler->SetSize( fixedImage->GetLargestPossibleRegion()->GetSize() );
resampler->Update();