[Insight-users] Can not reproduce metric value
Bill Lorensen
bill.lorensen at gmail.com
Sun Oct 4 11:29:38 EDT 2009
The difference is because the two images have different regions.
On Sat, Oct 3, 2009 at 11:50 PM, Quy Pham Sy <phamsyquybk at gmail.com> wrote:
> Hi,
> I found what i missed in the code.
> I forgot set translation of the transform. Sorry for wasting your time!
> Here is the code, if you want to.
> ---------------------------------------------------
> ..........
> 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);
> .............
> ----------------------------------------------------
> The metric value is 4570.285. It is much closer to 4551.86, still not the
> same ???
> I found a strange problem, i played around with the images, i swap role of
> images (fixed.bmp <-> moving.bmp) and the result i got (2715.557) event
> smaller than the value from registration process (4551.86). As far as i
> know, the registration's result is supposed to produce minimum value of
> metric value (is that right?) if so, what is wrong here?
> You can reproduce the result with following two images
> fixed.bmp; moving.bmp
>
> Thanks,
> Quyps
> 2009/10/4 Quy Pham Sy <phamsyquybk at gmail.com>
>>
>> Hi, sorry for this lack,
>> /*For cases*/
>> transform->SetAngle(8.85397); --> metric value = 12528.007
>> transform->SetAngle(0.154531); --> metric value = 10993.347
>> result from example is 4551.86
>> I send you two image, could you please try to reproduce this?
>> Thanks,
>> Quyps
>> 2009/10/3 Bill Lorensen <bill.lorensen at gmail.com>
>>>
>>> What value did you get?
>>>
>>> On Sat, Oct 3, 2009 at 4:55 AM, Quy Pham Sy <phamsyquybk at gmail.com>
>>> wrote:
>>> > Hi,
>>> > I tried with radian,
>>> > --------------------------------------------
>>> > .....
>>> > transform->SetScale(1.08438);
>>> > transform->SetAngle(0.154531);
>>> > TransformType::TranslationType translation;
>>> > translation[0] = -26.6822;
>>> > translation[1] = -93.6822;
>>> > .....
>>> > --------------------------------------------
>>> > I got new value but still not '4551.86' (the value from example).
>>> > I read from "ITK software guide ver 2.4" textbook, page 366. they
>>> > explained
>>> > (as i understand) that the output transform params from registration
>>> > process
>>> > are actually applied to FixeImage, in order to get the minimum metric
>>> > value.
>>> > It is still not clear that, the transform params pass directly to
>>> > metric
>>> > object are interpreted same way as in registration process (i mean they
>>> > also
>>> > applied to Fixed image instead of Moving Image). I guess the reason may
>>> > come
>>> > from this unobvious understanding. Do you have any idea about this?
>>> >
>>> > Thanks,
>>> > Quyps
>>> >
>>> > 2009/10/3 Bill Lorensen <bill.lorensen at gmail.com>
>>> >>
>>> >> /** Set/Get the angle of rotation in radians */
>>> >> ----------
>>> >> void SetAngle(TScalarType angle);
>>> >> itkGetConstReferenceMacro( Angle, TScalarType );
>>> >>
>>> >> Try:
>>> >> transform->SetAngle(0.154531);
>>> >>
>>> >> On Fri, Oct 2, 2009 at 4:09 PM, Quy Pham Sy <phamsyquybk at gmail.com>
>>> >> wrote:
>>> >> > hi,
>>> >> > I run ImageRegistration7 example in ITK.
>>> >> > and the output like following
>>> >> > -------------------------------------
>>> >> > 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
>>> >> > ---------------------------------------
>>> >> > I made a program in which i use a same metric, transformation,
>>> >> > interpolate
>>> >> > object type as above example, with same two input image file. I set
>>> >> > above
>>> >> > value to calculate metric value directly from metric object, but the
>>> >> > result
>>> >> > is not same as what the example made..
>>> >> > here is the code, did i miss something?
>>> >> > I'm running out of time! really appreciate any help!
>>> >> >
>>> >> >
>>> >> > -------------------------------------------------------------------------
>>> >> > 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;
>>> >> > }
>>> >> > transform->SetScale(1.08438);
>>> >> > transform->SetAngle(0.154531);
>>> >> > TransformType::TranslationType translation;
>>> >> > translation[0] = -26.6822;
>>> >> > translation[1] = -93.6822;
>>> >> > MetricType::TransformParametersType transformParams =
>>> >> > transform->GetParameters();
>>> >> > double metricval = metric->GetValue(transformParams);
>>> >> > return EXIT_SUCCESS;
>>> >> > }
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> > _____________________________________
>>> >> > Powered by www.kitware.com
>>> >> >
>>> >> > Visit other Kitware open-source projects at
>>> >> > http://www.kitware.com/opensource/opensource.html
>>> >> >
>>> >> > Please keep messages on-topic and check the ITK FAQ at:
>>> >> > http://www.itk.org/Wiki/ITK_FAQ
>>> >> >
>>> >> > Follow this link to subscribe/unsubscribe:
>>> >> > http://www.itk.org/mailman/listinfo/insight-users
>>> >> >
>>> >> >
>>> >
>>> >
>>> >> _____________________________________
>>> > Powered by www.kitware.com
>>> >
>>> > Visit other Kitware open-source projects at
>>> > http://www.kitware.com/opensource/opensource.html
>>> >
>>> > Please keep messages on-topic and check the ITK FAQ at:
>>> > http://www.itk.org/Wiki/ITK_FAQ
>>> >
>>> > Follow this link to subscribe/unsubscribe:
>>> > http://www.itk.org/mailman/listinfo/insight-users
>>> >
>>> >
>>
>
>
>
More information about the Insight-users
mailing list