[Insight-users] rectangular image registration issue

Sabine Husse sabine.husse at polymtl.ca
Fri Jan 20 13:15:42 EST 2012


Hi all,

I am trying to register 2D images (spect modality) witk itk Mattes mutual
information. Visually, offsets between both images are very small
(translation of ~ 5 mms). I am initializing transform parameters to 0 for
the 3 parameters of euler 2D transform. However, after registration I got a
rotation around 90 degres. Plus, when I am observing optimizer iterations,
first iteration is already 1.6 radian for rotation parameter, even if my
initial rotation parameter was 0.

Here is the observer:

MultiResolution Level : 0
0 = -0.372419 : [1.7683, -0.0955618, -0.929501]
1 = -0.0383217 : [1.92583, -2.08874, -0.978926]
2 = -0.0362538 : [1.69325, -1.10031, -2.21542]
3 = -0.0377709 : [1.56321, -1.28384, -3.79953]
4 = -0.0419196 : [1.66387, -2.53705, -3.55923]
141 = -0.042436 : [1.51798, -17.6144, -6.53557]
142 = -0.0423536 : [1.52173, -17.635, -6.52587]
143 = -0.042424 : [1.51635, -17.6507, -6.54188]

Iterations    = 145
Metric value  = -0.0424182
Stop Condition  = RegularStepGradientDescentOptimizer: Step too small after
144
iterations. Current step (0.0184467) is less than minimum step (0.02).
Result =
Translation X = 17.6507 mm
Translation Y = 6.54188 mm
Rotation X = -86.8805 degres

Here is part of the print out of registration:
  CurrentLevel: 1
  InitialTransformParameters: [0, 0, 0]
  InitialTransformParametersOfNextLevel: [0, 0, 0]
  LastTransformParameters: [1.51635, -17.6507, -6.54188]
  FixedImageRegion: ImageRegion (103F17EC)
  Dimension: 2
  Index: [0, 0]
  Size: [256, 1024]

  FixedImageRegion at level 0: ImageRegion (04DA4C98)
  Dimension: 2
  Index: [0, 0]
  Size: [128, 512]

  FixedImageRegion at level 1: ImageRegion (04DA4CAC)
  Dimension: 2
  Index: [0, 0]
  Size: [256, 1024]


It's clear that I am missing something. Please help. Here is my code:

  ImageType::RegionType fixedImageRegion = fixedImage->GetBufferedRegion();
  ImageType::RegionType movingImageRegion =
movingImage->GetBufferedRegion();  typedef itk::Euler2DTransform< 
double > TransformType;
  TransformType::Pointer transform = TransformType::New();
  registration_->SetTransform(transform);

  // Initialize transform parameters
  int transformParametersTotal =
registration_->GetTransform()->GetNumberOfParameters();
  typedef RegistrationType::ParametersType ParametersType;
  ParametersType initialParameters(transformParametersTotal);
  initialParameters.Fill(0.0);
  registration_->SetInitialTransformParameters(initialParameters);

  metric_->SetNumberOfHistogramBins(50);
  metric_->UseAllPixelsOn();

  registration_->SetFixedImage(fixedImage);
  registration_->SetMovingImage(movingImage);    
registration_->SetFixedImageRegion(fixedImageRegion);

  typedef OptimizerType::ScalesType ScalesType;
  int transformParametersTotal =
registration_->GetTransform()->GetNumberOfParameters();
  ScalesType parametersScales(transformParametersTotal);
  parametersScales.Fill( 1.0 );

  for (int j = 1; j < transformParametersTotal; j++ ){
    parametersScales[j] = 1.0 / 1000;
  }        optimizer_->SetScales(parametersScales);

  // The initial step length is defined with SetMaximumStepLength()
  optimizer_->SetMaximumStepLength(2.0);
  optimizer_->SetMinimumStepLength(0.02);

  // Define number of iterations per multi-resolution level
  optimizer_->SetNumberOfIterations( 200);

  optimizer_->SetRelaxationFactor(0.8);    
OptimizerIterationUpdate::Pointer observer =
OptimizerIterationUpdate::New();
  optimizer_->AddObserver( itk::IterationEvent(), observer );

   typedef RegistrationInterfaceCommand<RegistrationType> CommandType;
   CommandType::Pointer command = CommandType::New();
   registration_->AddObserver( itk::IterationEvent(), command );

    registration_->Update();
    // Output parameters
    ParametersType finalParameters =
registration_->GetLastTransformParameters();
     result[0] = ;
      result[1] =
      result[2] = ;                    // Print out results
    std::cout << "Result = " << std::endl;
    std::cout << " Translation X = " << - finalParameters[1]  << std::endl;
    std::cout << " Translation Y = " <<- finalParameters[2]; << std::endl;
     std::cout << " Rotation X = " << - finalParameters[0] * RAD_TO_DEG <<
std::endl;

Sabine Husse




More information about the Insight-users mailing list