[Insight-users] NormalizedMutualInformationMetric

Giorgos Pichis gpichis at gmail.com
Wed May 28 08:31:54 EDT 2008


Hi Luis

I changed the transform to Similarity2DTransform as you proposed and had
much better results.
The changes were ...
////  METRIC SCALES
typedef MetricType::ScalesType ScalesType;
ScalesType scales( numberOfParameters );
scales[0] =  10.0; //scale
scales[1] =  1.0; //angle
scales[2] =  0.01; //Translation X
scales[3] =  0.01; //Translation Y
 metric->SetDerivativeStepLengthScales(scales);
.......
///// OPTIMIZER SCALES

   FixedImageType::RegionType region =
fixedImage->GetLargestPossibleRegion();
  FixedImageType::SizeType size = region.GetSize();
  FixedImageType::SpacingType spacing = fixedImage->GetSpacing();

  typedef OptimizerType::ScalesType       OptimizerScalesType;
  OptimizerScalesType optimizerScales( transform->GetNumberOfParameters() );
  optimizerScales[0] = 10.0;
  optimizerScales[1] =  10.0;
  optimizerScales[2] =   1.0 / ( 0.1 * size[0] * spacing[0] );
  optimizerScales[3] =   1.0 / ( 0.1 * size[1] * spacing[1] );
  optimizer->SetScales( optimizerScales );
...............


results (5000
iterations)

scale 0.833371,  angle -0.175554,  TrX      7.3605,  TrY      7.89029, Metric
1.31231,MSDafter 204.473, CCafter    0.984774

MSD=MeanSquareDifference after registration, CC=CorrelationCoefficient after
registration

 results (7000 iterations)
scale 0.833493, angle -0.175483,   TrX      7.21419,TrY      7.7625,   Metric
1.33357,MSDafter 153.119,  CCafter    0.988688

results (15000 iterations)
scale 0.833746, angle -0.174136,   TrX      6.86705,TrY      7.43349,Metric
1.31354, MSDafter 182.968,  CCafter    0.986441

The "optimum" results taken from mattes metric where

results
scale 0.832628 angle -0.174455  TrX   7.37987    TrY      8.52768  Metric
-1.42415  MSDafter 77.9344    CCafter    0.994369

The problem with the results I got, and which are presented above are:
1) NMI metric reached the maximum number of iterations, (and took a rather
long time (approx 3sec/iteration.) although that was expected) Should I set
the number of iterations, approx in that number, that I take the better
results?
2) With the parameters I set the optimizer,  and metric scales, the
algorithm was pretty close to the optimum results. But when it reached some
of them, it kept running in a steady mode, not converging towards them.

Is there any possible solution to these problems?
Thanks,
Giorgos


On Mon, May 12, 2008 at 6:49 PM, Luis Ibanez <luis.ibanez at kitware.com>
wrote:

>
> Hi Giorgos,
>
> Thanks for posting your progress on this problem.
>
> Here are some comments:
>
> 1) Yes, when using Normalized Mutual Information
>   you should set the optimizer to "maximize".
>   You are doing this right by calling
>   "optimizer->MaximizeOn();"
>
>   see for example
>
>   Insight/Examples/Registration/ImageRegistration14.cxx
>
>
> 2) The Optimizer scales are definitely a good place
>   to look for a culprit.
>
>   With your current scale selection you are actually
>   telling the optimizer to avoid changing the values
>   of the Transform's center of rotation, which is a
>   good thing.
>
>   One thing you should try is replacing the
>
>        itkCenteredSimilarity2DTransform
>
>   with the
>
>        itkSimilarity2DTransform
>
>   The second one still offers the user the possibility
>   of setting a customized a center of rotation, but
>   as opposed to the first one, it doesn't include the
>   center coordinates in the list of parameters to be
>   optimized. In other words, with the second transform
>   the optimizer will not try to change the center of
>   rotation.
>
>   Historical note: initially ITK transforms didn't
>   provided a SetCenter() method. E.g. by default,
>   all rotations and scalings were performed with
>   respect to the origin (0,0).
>
>   Later on we introduced the variants of Transform with
>   center of rotation, and we called "Centered" transforms,
>   however, we made the mistake of including the coordinate
>   of the center of rotation in the list of parameters to
>   optimize.
>
>   Later on it was decided that almost all transforms
>   needed a customizable center of rotation, and the
>   functionality was added to the basic transform, but
>   without inserting the coordinates of the center of
>   rotation in to the parameters array.
>
>   Allowing the optimizer to move the center of rotation
>   makes the Transform to behave very unstably, and therefore
>   should only be done by allowing the optimizer to make
>   very small changes in the center of rotation (as you
>   already discovered).
>
>   Switching to the itkSimilarity2DTransform may alleviate
>   some of the stability problems that you are facing.
>
>   Please note that the Similarity2DTransform have *less*
>   parameters. Only four, instead of the six parameters
>   in the CenteredSimilarity2DTransform.
>
>   Note also that the "Scale" and "Angle" parameters are
>   still critical in this transforms and you should apply
>   the same approach that you have used for the Centered
>   transform. (e.g. using different optimizer scalings
>   for these two first parameters of the Transform).
>
>
>
> Please give it a try at this modification and
> let us know how it works for you.
>
>
>   Thanks
>
>
>      Luis
>
>
> ---------------------
> Giorgos Pichis wrote:
>
>> Hi,
>> I made some changes to the code,
>> and it seems as it is having better results,
>> but they are still far from the optimum.
>>
>> I am using the BrainProtonDensitySlice.png  and
>> BrainProtonDensitySliceR10X13Y17S12.png from
>> the examples data to test the algorithm.
>>
>> As far as the metric parameters are concerned , I did the following
>> changes:
>> //////////////////////
>>  const unsigned int numberOfParameters =
>> transform->GetNumberOfParameters();
>>
>>  typedef MetricType::ScalesType ScalesType;
>>  ScalesType scales( numberOfParameters );
>> double t_scale;
>> double center_scale;
>>  //scales.Fill( 1.0 );
>>    std::cout<<" enter center_scale : ";
>>  std::cin>>center_scale;
>>  std::cout<<" enter t_scale : ";
>>  std::cin>>t_scale;
>>  std::cout<<" enter scales[0] : "; //scaling
>>  std::cin>>scales[0];
>>    std::cout<<" enter scales[1] : "; //angle
>>  std::cin>>scales[1];
>>    //const double t_scale=0.1; //translation scale
>>  //scales[0] =  10.0;
>>  //scales[1] =  1.0;
>>  scales[2] =  center_scale;
>>  scales[3] =  center_scale;
>>  scales[4] =  t_scale;
>>  scales[5] =  t_scale;
>>
>>    metric->SetDerivativeStepLengthScales(scales);
>>  metric->SetDerivativeStepLength(1.0);
>>
>> /////////
>> ... and had some relatively (to the previous ones) good results, using:
>> center_scale :10000,
>> t_scale: 0.1
>> scale[0] :0.1  //for scaling
>> scale[1] :1  //for the angle
>>
>> Also the optimizer setting where changes to:
>>
>>
>>  typedef OptimizerType::ScalesType       OptimizerScalesType;
>>  OptimizerScalesType optimizerScales( transform->GetNumberOfParameters()
>> );
>>  const double translationScale = 1.0 / 100.0;
>>  const double centerScale =1.0/100.0;
>>
>>  optimizerScales[0] = 10.0;
>>  optimizerScales[1] =  1.0;
>>  optimizerScales[2] =  centerScale;
>>  optimizerScales[3] =  centerScale;
>>  optimizerScales[4] =  translationScale;
>>  optimizerScales[5] =  translationScale;
>>
>>  optimizer->SetScales( optimizerScales );
>>
>>  double steplength = 1.0;
>>    if( argc > 9 )
>>    {
>>    steplength = atof( argv[9] );
>>    }
>>  optimizer->SetMaximumStepLength( steplength );
>>  optimizer->SetMinimumStepLength( 0.00001 );
>>  optimizer->SetNumberOfIterations( 500 );
>>  optimizer->MaximizeOn(); //change
>> .... using step lenght=0.5
>> The algorithm exited, at iteration number 70,
>> with
>> Scale 1.00275
>> Angle (radians) -0.160493
>> Angle (degrees) -9.19556
>> Center X = 90.318
>> Center Y = 108.849
>> Translation X=15.2579
>> Translation Y= 15.4322
>> Metric Value= 1.07114
>>
>> Can I get some help , on what further changes should I do,
>> in order to get better results?
>> I had almost optimum results working with Mattes MI,
>> Scale 0.832628
>> Angle (radians) -0.174455
>> Angle (degrees) -9.99554
>> Center X = 87.1628
>> Center Y = 107.813
>> Translation X=7.37987
>> Translation Y= 8.52768
>> Metric Value= -1.42415,
>> but I want to get familiar and work with NMI.
>> What changes to the scales parameters, should I do?
>>
>> Thanks in advance,
>> Giorgos
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20080528/056b9e1a/attachment-0001.htm>


More information about the Insight-users mailing list