1
/*=========================================================================
3
Program: Insight Segmentation & Registration Toolkit
4
Module: $RCSfile: itkOptImageToImageMetricsTest.h,v $
6
Date: $Date: 2007-12-28 15:04:56 $
7
Version: $Revision: 1.4 $
9
Copyright (c) Insight Software Consortium. All rights reserved.
10
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
12
This software is distributed WITHOUT ANY WARRANTY; without even
13
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14
PURPOSE. See the above copyright notices for more information.
16
=========================================================================*/
18
#ifndef __itkOptImageToImageMetricsTest_h
19
#define __itkOptImageToImageMetricsTest_h
21
#include "itkTimeProbe.h"
22
#include "itkMersenneTwisterRandomVariateGenerator.h"
26
template <typename FixedImageType,
27
typename MovingImageType,
28
typename InterpolatorType,
29
typename TransformType,
31
typename MetricInitializerType >
32
class OptImageToImageMetricsTest
36
OptImageToImageMetricsTest() {}
38
int RunTest( FixedImageType* fixed,
39
MovingImageType* moving,
40
InterpolatorType* interpolator,
41
TransformType* transform,
43
MetricInitializerType metricInitializer)
45
typedef typename MetricType::ParametersType ParametersType;
47
std::cout << "-------------------------------------------------------------------" << std::endl;
48
std::cout << "Testing" << std::endl;
49
std::cout << "\tMetric : " << metric->GetNameOfClass() << std::endl;
50
std::cout << "\tInterpolator : " << interpolator->GetNameOfClass() << std::endl;
51
std::cout << "\tTransform : " << transform->GetNameOfClass() << std::endl;
52
std::cout << "-------------------------------------------------------------------" << std::endl;
53
std::cout << std::endl;
55
int result = EXIT_SUCCESS;
57
// connect the interpolator
58
metric->SetInterpolator( interpolator );
60
// connect the transform
61
metric->SetTransform( transform );
63
// connect the images to the metric
64
metric->SetFixedImage( fixed );
65
metric->SetMovingImage( moving );
67
// call custom initialization for the metric
68
metricInitializer.Initialize();
70
// Always use the same seed value.
71
// All instances are the same since MersenneTwisterRandomVariateGenerator
72
// uses a singleton pattern.
73
itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()->SetSeed( 42 );
75
// initialize the metric
76
// Samples are drawn here in metric->Initialize(),
77
// so we seed the random number generator
78
// immediately before this call.
81
// Set the transform to identity
82
transform->SetIdentity();
84
// Get the transform parameters for identity.
85
ParametersType parameters = transform->GetParameters();
87
typename MetricType::MeasureType value;
88
typename MetricType::DerivativeType derivative;
90
// Try GetValue and GetDerivative...
91
value = metric->GetValue( parameters );
92
metric->GetDerivative( parameters, derivative );
95
itk::TimeProbe timeProbe;
97
// Walk around the parameter value at parameterIdx
98
for (unsigned int parameterIdx = 0; parameterIdx < parameters.GetSize(); parameterIdx++)
100
std::cout << "Param[" << parameterIdx << "]\tValue\tDerivative " << std::endl;
101
double startVal = parameters[parameterIdx];
102
// endVal is 10% beyond startVal.
103
double endVal = 1.10 * startVal;
104
// If startVal is 0, endVal needs to be fixed up.
105
if( fabs(endVal - 0.0) < 1e-8 )
107
endVal = startVal + 1.0;
109
double incr = (endVal - startVal) / 10.0;
111
for( double pval = startVal; pval <= endVal; pval += incr )
113
parameters[parameterIdx] = pval;
116
metric->GetValueAndDerivative( parameters, value, derivative );
119
std::cout << pval << "\t" << value << "\t" << derivative << std::endl;
123
std::cout << std::endl;
124
std::cout << "Mean time for GetValueAndDerivative : " << timeProbe.GetMeanTime() << std::endl;
125
std::cout << std::endl;
126
std::cout << "------------------------------Done---------------------------------" << std::endl;
133
template <typename FixedImageType, typename MovingImageType>
134
class MeanSquaresMetricInitializer
137
typedef itk::MeanSquaresImageToImageMetric< FixedImageType,
138
MovingImageType> MetricType;
141
MeanSquaresMetricInitializer(MetricType* metric)
148
// Do stuff on m_Metric
149
#ifdef ITK_USE_OPTIMIZED_REGISTRATION_METHODS
150
m_Metric->UseAllPixelsOn();
155
MetricType* m_Metric;
159
template <typename FixedImageType, typename MovingImageType>
160
class MattesMIMetricInitializer
163
typedef itk::MattesMutualInformationImageToImageMetric< FixedImageType,
164
MovingImageType> MetricType;
167
MattesMIMetricInitializer(MetricType* metric)
174
// Do stuff on m_Metric
175
m_Metric->SetNumberOfHistogramBins( 50 );
176
m_Metric->SetNumberOfSpatialSamples( 5000 );
180
MetricType* m_Metric;
184
template <typename FixedImageType, typename MovingImageType>
185
class MIMetricInitializer
188
typedef itk::MutualInformationImageToImageMetric< FixedImageType,
189
MovingImageType> MetricType;
192
MIMetricInitializer(MetricType* metric)
199
// Do stuff on m_Metric
200
m_Metric->SetNumberOfSpatialSamples( 400 );
204
MetricType* m_Metric;
208
template < class InterpolatorType,
210
class FixedImageReaderType,
211
class MovingImageReaderType >
212
void BasicTest( FixedImageReaderType* fixedImageReader,
213
MovingImageReaderType* movingImageReader,
214
InterpolatorType* interpolator,
215
TransformType* transform
218
typedef typename FixedImageReaderType::OutputImageType FixedImageType;
219
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
221
fixedImageReader->Update();
222
movingImageReader->Update();
224
typename FixedImageType::Pointer fixed = fixedImageReader->GetOutput();
225
typename MovingImageType::Pointer moving = movingImageReader->GetOutput();
228
typedef itk::MeanSquaresImageToImageMetric< FixedImageType, MovingImageType > MetricType;
229
typedef MeanSquaresMetricInitializer< FixedImageType, MovingImageType > MetricInitializerType;
230
typename MetricType::Pointer msMetric = MetricType::New();
231
MeanSquaresMetricInitializer< FixedImageType, MovingImageType > msMetricInitializer( msMetric );
233
TestAMetric( fixedImageReader, movingImageReader, interpolator, transform, msMetric.GetPointer(), msMetricInitializer );
236
typedef itk::MattesMutualInformationImageToImageMetric< FixedImageType, MovingImageType > MattesMetricType;
237
typedef MattesMIMetricInitializer< FixedImageType, MovingImageType > MattesMetricInitializerType;
238
typename MattesMetricType::Pointer mattesMetric = MattesMetricType::New();
239
MattesMIMetricInitializer< FixedImageType, MovingImageType > mattesMetricInitializer( mattesMetric );
241
TestAMetric( fixedImageReader, movingImageReader, interpolator, transform, mattesMetric.GetPointer(), mattesMetricInitializer );
243
#if 0 // OptMutualInformationImageToImageMetric will be removed from Review.
245
typedef itk::MutualInformationImageToImageMetric< FixedImageType, MovingImageType > MIMetricType;
246
typedef MIMetricInitializer< FixedImageType, MovingImageType > MIMetricInitializerType;
247
typename MIMetricType::Pointer miMetric = MIMetricType::New();
248
MIMetricInitializer< FixedImageType, MovingImageType> miMetricInitializer( miMetric );
250
TestAMetric( fixedImageReader, movingImageReader, interpolator, transform, miMetric.GetPointer(), miMetricInitializer );
254
template <class FixedImageReaderType,
255
class MovingImageReaderType,
256
class InterpolatorType,
259
class MetricInitializerType>
260
void TestAMetric(FixedImageReaderType* fixedImageReader,
261
MovingImageReaderType* movingImageReader,
262
InterpolatorType* interpolator,
263
TransformType* transform,
265
MetricInitializerType metricInitializer)
267
typedef typename FixedImageReaderType::OutputImageType FixedImageType;
268
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
270
metric->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
272
OptImageToImageMetricsTest< FixedImageType,
277
MetricInitializerType > testMetric;
279
testMetric.RunTest( fixedImageReader->GetOutput(), movingImageReader->GetOutput(), interpolator, transform, metric, metricInitializer );
282
template <class FixedImageReaderType, class MovingImageReaderType>
283
void AffineLinearTest( FixedImageReaderType* fixedImageReader,
284
MovingImageReaderType* movingImageReader)
286
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
287
typedef itk::LinearInterpolateImageFunction< MovingImageType, double > InterpolatorType;
288
typedef itk::AffineTransform<double, 2> TransformType;
290
typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
291
TransformType::Pointer transform = TransformType::New();
293
BasicTest(fixedImageReader,
295
interpolator.GetPointer(),
296
transform.GetPointer());
300
template <class FixedImageReaderType, class MovingImageReaderType>
301
void RigidLinearTest( FixedImageReaderType* fixedImageReader,
302
MovingImageReaderType* movingImageReader)
304
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
306
typedef itk::LinearInterpolateImageFunction< MovingImageType, double > InterpolatorType;
307
typedef itk::Rigid2DTransform<double> TransformType;
309
typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
310
TransformType::Pointer transform = TransformType::New();
312
BasicTest(fixedImageReader,
314
interpolator.GetPointer(),
315
transform.GetPointer());
318
template <class FixedImageReaderType, class MovingImageReaderType>
319
void TranslationLinearTest( FixedImageReaderType* fixedImageReader,
320
MovingImageReaderType* movingImageReader)
322
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
324
typedef itk::LinearInterpolateImageFunction< MovingImageType, double > InterpolatorType;
325
typedef itk::TranslationTransform<double, 2> TransformType;
327
typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
328
TransformType::Pointer transform = TransformType::New();
330
BasicTest(fixedImageReader,
332
interpolator.GetPointer(),
333
transform.GetPointer());
337
template <class FixedImageReaderType, class MovingImageReaderType>
338
void DoDebugTest( FixedImageReaderType* fixedImageReader,
339
MovingImageReaderType* movingImageReader)
341
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
343
typedef itk::LinearInterpolateImageFunction< MovingImageType, double > InterpolatorType;
344
typedef itk::Rigid2DTransform<double> TransformType;
346
typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
347
TransformType::Pointer transform = TransformType::New();
349
typedef typename FixedImageReaderType::OutputImageType FixedImageType;
350
typedef typename MovingImageReaderType::OutputImageType MovingImageType;
352
fixedImageReader->Update();
353
movingImageReader->Update();
355
typename FixedImageType::Pointer fixed = fixedImageReader->GetOutput();
356
typename MovingImageType::Pointer moving = movingImageReader->GetOutput();
359
typedef itk::MeanSquaresImageToImageMetric< FixedImageType, MovingImageType > MetricType;
360
typedef MeanSquaresMetricInitializer< FixedImageType, MovingImageType > MetricInitializerType;
361
typename MetricType::Pointer metric = MetricType::New();
362
MeanSquaresMetricInitializer< FixedImageType, MovingImageType > metricInitializer( metric );
364
metric->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
366
typedef typename MetricType::ParametersType ParametersType;
368
std::cout << "-------------------------------------------------------------------" << std::endl;
369
std::cout << "Testing" << std::endl;
370
std::cout << "\tMetric : " << metric->GetNameOfClass() << std::endl;
371
std::cout << "\tInterpolator : " << interpolator->GetNameOfClass() << std::endl;
372
std::cout << "\tTransform : " << transform->GetNameOfClass() << std::endl;
373
std::cout << "-------------------------------------------------------------------" << std::endl;
374
std::cout << std::endl;
376
int result = EXIT_SUCCESS;
378
// connect the interpolator
379
metric->SetInterpolator( interpolator );
381
// connect the transform
382
metric->SetTransform( transform );
384
// connect the images to the metric
385
metric->SetFixedImage( fixed );
386
metric->SetMovingImage( moving );
388
// call custom initialization for the metric
389
metricInitializer.Initialize();
391
// initialize the metric
392
metric->Initialize();
394
// Set the transform to identity
395
transform->SetIdentity();
397
// Get the transform parameters for identity.
398
ParametersType parameters = transform->GetParameters();
400
typename MetricType::MeasureType value;
401
typename MetricType::DerivativeType derivative;
405
metric->GetValueAndDerivative( parameters,
409
//metric->StopDebug();
411
// Force the test to end here so the debug file
412
// ends at the right place.
416
} // end namespace itk