|
|
(One intermediate revision by one other user not shown) |
Line 1: |
Line 1: |
| Image to image metrics are typically used for image registration. However, they can be used independent of registration to compute the metric between two images. The set-up to compute the metric is a bit complex, since the set-up is normally done by the registration method. This example computes the mean squares difference between two images. 25 samples are taken, translating the second image over the first image. If the two images specify the same image, the example illustrates how the metric varies over the samples. In this case, the metric at (0,0) should be 0.
| | {{warning|1=The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases. In many cases, the examples on this page no longer conform to the best practices for modern ITK versions.}} |
| ==MeanSquaresImageToImageMetric.cxx==
| |
| <source lang="cpp">
| |
| #include "itkImage.h"
| |
| #include "itkImageFileReader.h"
| |
| #include "itkMeanSquaresImageToImageMetric.h"
| |
| #include "itkLinearInterpolateImageFunction.h"
| |
| #include "itkTranslationTransform.h"
| |
| | |
| int main(int argc, char *argv[])
| |
| { | |
| typedef itk::Image< double, 2 > ImageType;
| |
| typedef itk::ImageFileReader<ImageType> ReaderType;
| |
| | |
| if (argc < 3)
| |
| {
| |
| std::cout << "Usage: " << argv[0] << " imageFile1 imageFile2" << std::endl;
| |
| return EXIT_FAILURE;
| |
| }
| |
| ReaderType::Pointer fixedReader = ReaderType::New();
| |
| fixedReader->SetFileName(argv[1]);
| |
| fixedReader->Update();
| |
| | |
| ReaderType::Pointer movingReader = ReaderType::New();
| |
| movingReader->SetFileName(argv[2]); | |
| movingReader->Update();
| |
| | |
| ImageType::Pointer fixedImage = fixedReader->GetOutput();
| |
| ImageType::Pointer movingImage = movingReader->GetOutput();
| |
| | |
| typedef itk::MeanSquaresImageToImageMetric < ImageType , ImageType >
| |
| MetricType;
| |
| typedef itk::LinearInterpolateImageFunction<ImageType, double >
| |
| InterpolatorType;
| |
| typedef itk::TranslationTransform < double , 2 > TransformType;
| |
| | |
| MetricType::Pointer metric = MetricType::New();
| |
| TransformType::Pointer transform = TransformType::New();
| |
| | |
| InterpolatorType::Pointer interpolator = InterpolatorType::New();
| |
| interpolator->SetInputImage( fixedImage );
| |
| | |
| metric->SetFixedImage( fixedImage );
| |
| metric->SetMovingImage( movingImage );
| |
| metric->SetFixedImageRegion( fixedImage->GetLargestPossibleRegion() );
| |
| metric->SetTransform( transform );
| |
| metric->SetInterpolator( interpolator );
| |
| | |
| TransformType::ParametersType params(transform->GetNumberOfParameters());
| |
| params.Fill(0.0);
| |
| | |
| metric->Initialize(); | |
| for (double x = -10.0; x <= 10.0; x+=5.0)
| |
| {
| |
| params(0) = x;
| |
| for (double y = -10.0; y <= 10.0; y+=5.0)
| |
| {
| |
| params(1) = y;
| |
| std::cout << params << ": " << metric->GetValue( params ) << std::endl ;
| |
| }
| |
| }
| |
| | |
| return EXIT_SUCCESS;
| |
| }
| |
| </source>
| |
| | |
| {{ITKCMakeLists|MeanSquaresImagetoImageMetric}}
| |