[Insight-users] Can not reproduce metric value

Quy Pham Sy phamsyquybk at gmail.com
Sun Oct 4 13:51:49 EDT 2009


hi,  Bill
Thanks very much for you help. I tried adding your code. Actually your code
outputs the metric value to screen, am i right?

To make all my question clearer
here is the summary, there're issues:


1 - When I used the output (final transform parameters) from
ImageRegistration7 example (in ITK source code)
to reproduce the metric  value directly from Metric Object (same as metric
object type used in ImageRegistration7 example)
I can not reproduce the same metric value as the example. Why?


Output from ImageRegistration7
-------------------------------------
 Scale         = 1.08438
 Angle (radians) 0.154531
 Angle (degrees) 8.85397
 Center X      = 170.327
 Center Y      = 148.556
 Translation X = -26.6822
 Translation Y = -93.4428
 Iterations    = 500
 Metric value  = 4551.86
---------------------------------------

Two input image:
fixed.bmp<http://picasaweb.google.com/lh/photo/qq5iA-PTGX6o3ZtslBX5HQ?authkey=Gv1sRgCPfxyPeBwITjkwE&feat=directlink>;
moving.bmp<http://picasaweb.google.com/phamsyquybk/DropBox?authkey=Gv1sRgCPfxyPeBwITjkwE#5388585730742727138>

Set params code for transformation of metric
---------------------------------------------------
transform->SetScale(1.08438);
transform->SetAngle(0.154531);
TransformType::TranslationType translation;
translation[0] = -26.6822;
translation[1] = -93.6822;
transform->SetTranslation(translation);
MetricType::TransformParametersType transformParams =
transform->GetParameters();

double metricval = metric->GetValue(transformParams);

/*result: metricval = 4570.285 still != 4551.86*/
----------------------------------------------------


2. In theory,  the metric value from registration (determined by: transform
type, metric type, interpolate type) of two images (fixed image, moving
image) is supposed to be "MINIMUM METRIC VALUE".
But when i try a set of params (as following) i get a smaller value, event
down to 0 (still use two input image as above) the value which is impossible
since two images are not identical !!!

----------------------------------------------
transform->SetScale(0.92632);
transform->SetAngle(0.15095);
TransformType::TranslationType translation;
translation[0] = 28.29828;
translation[1] = 94.07266;
transform->SetTranslation(translation);

MetricType::TransformParametersType transformParams =
transform->GetParameters();

double metricval = metric->GetValue(transformParams);

/*result: metricval == 0 !!!! */
-------------------------------------------------

Really appreciate any suggest and help!

//========================================================================
//              HERE IS THE SOURCE CODE TO REPRODUCE THESE PROBLEMS
//========================================================================

int main( int argc, char * argv[] )
{
const     unsigned int   Dimension = 2;
typedef   unsigned char  PixelType;
typedef itk::Image< PixelType, Dimension >   ImageType;
typedef itk::ImageFileReader< ImageType >  ReaderType;

ReaderType::Pointer fixedReader  = ReaderType::New();
ReaderType::Pointer movingReader = ReaderType::New();

  fixedReader->SetFileName(  "fixed.bmp" );
  movingReader->SetFileName( "moving.bmp" );


try
{
fixedReader->Update();
movingReader->Update();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception catched !" << std::endl;
std::cerr << excep << std::endl;
}


typedef itk::MeanSquaresImageToImageMetric< ImageType, ImageType >
 MetricType;
MetricType::Pointer metric = MetricType::New();

typedef itk::CenteredSimilarity2DTransform < double >  TransformType;
TransformType::Pointer transform = TransformType::New();

typedef itk::LinearInterpolateImageFunction< ImageType, double >
 InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();

ImageType::Pointer fixedImage  = fixedReader->GetOutput();
ImageType::Pointer movingImage = movingReader->GetOutput();

typedef itk::CenteredTransformInitializer< TransformType, ImageType,
ImageType >  TransformInitializerType;
TransformInitializerType::Pointer initializer =
TransformInitializerType::New();

initializer->SetTransform(   transform );
initializer->SetFixedImage(  fixedImage );
initializer->SetMovingImage( movingImage );
initializer->MomentsOn();

initializer->InitializeTransform();

metric->SetTransform( transform );
metric->SetInterpolator( interpolator );
metric->SetFixedImage(  fixedImage  );
metric->SetMovingImage( movingImage );
metric->SetFixedImageRegion(  fixedImage->GetBufferedRegion()  );

try
{
metric->Initialize();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception catched !" << std::endl;
std::cerr << excep << std::endl;
return EXIT_FAILURE;
}
 //************************************************************************/
        //  CHANGE PARAMETERS HERE TO REPRODUCE PROBLEM

transform->SetScale(0.92632);
transform->SetAngle(0.15095);
TransformType::TranslationType translation;
translation[0] = 28.29828;
translation[1] = 94.07266;

//*************************************************************************/


transform->SetTranslation(translation);

MetricType::TransformParametersType transformParams =
transform->GetParameters();

double metricval = 0.0;
try
{
metricval = metric->GetValue(transformParams);
std::cout << "metricval: " << metricval << std::endl;
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception catched !" << std::endl;
std::cerr << excep << std::endl;
std::cout << "metricval: " << metricval << std::endl;
return EXIT_FAILURE;
}
 return EXIT_SUCCESS;
}
=======================================================================================
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20091005/b4f8f052/attachment.htm>


More information about the Insight-users mailing list