[Insight-users] Initializing a BSplineTransform in ITK 4.4

Frank Preiswerk frank.preiswerk at unibas.ch
Wed Jul 31 11:10:37 EDT 2013


Hi Nick,

I have noticed that the error is not thrown if I do not set the initial 
transform for the moving image via 
registrationMethod->SetMovingInitialTransform (although the optimizer 
then produces a constant error value and the registration simply 
iterates without altering the deformation field - I don't know if this 
is an unrelated problem).

My setup is simple, i.e. no multi-resolution involved. I'm doing 
essentially this:

typedef itk::BSplineTransform< PixelType, ImageDimension > TransformType;
typedef itk::MeanSquaresImageToImageMetricv4< ImageType, ImageType >     
MetricType;
typedef itk::GradientDescentOptimizerv4 OptimizerType;
typedef itk::ImageRegistrationMethodv4< ImageType, ImageType, 
TransformType > RegistrationMethodType;
typedef itk::RegistrationParameterScalesFromPhysicalShift< MetricType > 
ScalesEstimatorType;

MetricType::Pointer metric = MetricType::New();

OptimizerType::Pointer optimizer = OptimizerType::New();
optimizer->SetNumberOfIterations( 200 );
optimizer->SetDoEstimateLearningRateOnce( true );
optimizer->SetMinimumConvergenceValue( 1e-16 );
optimizer->SetConvergenceWindowSize( 20 );
optimizer->SetMaximumStepSizeInPhysicalUnits( 2 );

ScalesEstimatorType::Pointer scalesEstimator = ScalesEstimatorType::New();
scalesEstimator->SetMetric( metric );
scalesEstimator->SetTransformForward( true );
optimizer->SetScalesEstimator( scalesEstimator );
optimizer->SetDoEstimateScales( true );

RegistrationMethodType::Pointer registrationMethod = 
RegistrationMethodType::New();
registrationMethod->SetOptimizer( optimizer );
registrationMethod->SetFixedImage( fixedImage );
registrationMethod->SetMovingImage( movingImage );
registrationMethod->SetFixedInitialTransform( initialFixedTransform );
registrationMethod->SetMovingInitialTransform( initialMovingTransform );
registrationMethod->SetNumberOfLevels( 1 );
registrationMethod->SetMetric( metric );
registrationMethod->SetMetricSamplingStrategy( 
RegistrationMethodType::NONE );




The initial transforms are initialized like this:

TransformType::PhysicalDimensionsType fixedPhysicalDimensions;
TransformType::MeshSizeType meshSize;
for( unsigned int i=0; i < ImageDimension; i++ )
{
   fixedPhysicalDimensions[i] = fixedImage->GetSpacing()[i] *
   static_cast<double>(
     movingImage->GetLargestPossibleRegion().GetSize()[i] - 1 );
}
unsigned int SplineOrder = 3;
unsigned int numberOfGridNodesInOneDimension = 5;
meshSize.Fill( numberOfGridNodesInOneDimension - SplineOrder );
initialMovingTransform->SetTransformDomainOrigin( 
movingImage->GetOrigin() );
initialMovingTransform->SetTransformDomainPhysicalDimensions( 
fixedPhysicalDimensions );
initialMovingTransform->SetTransformDomainMeshSize( meshSize );
initialMovingTransform->SetTransformDomainDirection( 
movingImage->GetDirection() );
TransformType::ParametersType initialMovingParameters( 
initialMovingTransform->GetNumberOfParameters() );
initialMovingParameters.Fill(0.0);
initialMovingTransform->SetParameters(initialMovingParameters);


Thanks for the link to the relevant ANTs class. I took a look at the 
relevant lines but it didn't help me either.

Many thanks,
Frank





On 07/31/2013 01:21 PM, Nick Tustison wrote:
> Hi Frank,
>
> I'm cc'ing the insight users list as others might be interested.
>
> How are you setting up the registration? In case you were interested, 
> we have
> a pretty comprehensive application which ties in all the new 
> registration stuff
> in a single application. In it, we set up the B-spline transform which 
> you can
> view at
>
> https://github.com/stnava/ANTs/blob/master/Examples/itkantsRegistrationHelper.hxx
>
> starting at line 1896.
>
> Nick
>
> On Jul 31, 2013, at 4:45 AM, Frank Preiswerk 
> <frank.preiswerk at unibas.ch <mailto:frank.preiswerk at unibas.ch>> wrote:
>
>> Hi Nick,
>>
>> I have adapted my code to work with the new ITKv4 classes. For the 
>> affine registration this worked well. But for the BSplineTransform, I 
>> get the following error during optimization:
>>
>> /usr/local/include/ITK-4.4/itkImageToImageMetricv4GetValueAndDerivativeThreaderBase.hxx:258:
>> Exception in GetValueAndDerivativeProcessPoint:
>> /usr/local/include/ITK-4.4/itkBSplineBaseTransform.h:282:
>> itk::ERROR: BSplineTransform(0x384cb00): 
>> ComputeJacobianWithRespectToPosition not yet implemented for 
>> BSplineTransform
>>
>> I use GradientDescentOptimizerv4 and MeanSquaresImageToImageMetricv4 
>> and also tried substituting them with QuasiNewtonOptimizerv4 and 
>> MattesMutualInformationImageToImageMetricv4 but to no avail.
>>
>> Sorry to bother you but I could not find any examples on the web that 
>> shows how the BSplineTransform can be used in the new framework.
>>
>> Many thanks!
>> Frank
>>
>>
>>
>>
>> On 07/30/2013 04:09 PM, Nick Tustison wrote:
>>> Hi Frank,
>>>
>>> I don't think that anybody on the registration team has tried to use the composite
>>> transform with the old registration framework.  I'm not even sure that it would work
>>> as both the optimization and metrics are completely separate between ITKv3 and
>>> ITKv4.  In suggesting the use of the CompositeTransform class, I didn't catch that
>>> you were sticking with ITKv3.  Sorry about that.
>>>
>>> There was some earlier work by Torsten and Marius & Stefan who gave us some
>>> ideas for the current composite transform.  Perhaps one of those contributions would
>>> fit your needs.
>>>
>>> http://www.insight-journal.org/browse/publication/143
>>> http://www.insight-journal.org/browse/publication/91
>>>
>>> Also, I would be remiss if I didn't at least proselyte concerning the utility of the new
>>> registration framework.  There's quite a few advantages in addition to the composite
>>> transform:
>>>
>>> http://www.itk.org/Wiki/ITK/Release_4/Why_Switch_to_ITKv4#New_Registration_Framework
>>>
>>> Nick
>>>
>>>
>>> On Jul 30, 2013, at 7:35 AM, Frank Preiswerk<frank.preiswerk at unibas.ch>  wrote:
>>>
>>>> Hi Nick,
>>>>
>>>> I have a few additional questions and I would be very glad if you could help me getting on the right track.
>>>>
>>>> Your suggestion to use the CompositeTransform guided me to the new registration framework. I have played around a bit and now I'm unsure which version to use.
>>>>
>>>> First of all, in ImageRegistrationMethodv4 there is a method SetMovingInitialTransform that probably does exactly what I need. As far as I understand it, one can achieve the same with the old framework by using CompositeTransform like this:
>>>>
>>>> compositeTransform->AddTransform(affineTransform); // the output from the prior affine step
>>>> compositeTransform->AddTransform(bsplineTransform);
>>>> compositeTransform->SetOnlyMostRecentTransformToOptimizeOn(); // activate the bspline transform for the next optimization
>>>> registration->SetTransform( compositeTransform );
>>>>
>>>> Is this the way how to properly use CompositeTransform in the old registration framework? And is my assumption correct that SetMovingInitialTransform would be sufficient when using the new framework?
>>>>
>>>> Thanks a lot for your efforts,
>>>> Frank
>>>>
>>>>
>>>>
>>>> On 07/29/2013 12:16 PM, Nick Tustison wrote:
>>>>> You should try using the composite transform
>>>>>
>>>>> http://www.itk.org/Doxygen/html/classitk_1_1CompositeTransform.html
>>>>>
>>>>> Nick
>>>>>
>>>>> On Jul 29, 2013, at 4:49 AM, Frank Preiswerk<frank.preiswerk at unibas.ch>  wrote:
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I'm writing a program that performs image registration by first computing an
>>>>>> affine transformation followed by a bspline deformation. The bspline
>>>>>> registration should be initialized with the output of the affine
>>>>>> registration.
>>>>>>
>>>>>> I'm using ITK 4.4. The example DeformableRegistration15.cxx intends to do
>>>>>> the above but it seems that the BSplineTransform is actually not initialized
>>>>>> with the output of the affine step, as already reported earlier:
>>>>>> http://www.itk.org/pipermail/insight-users/2012-May/044623.html
>>>>>>
>>>>>> ITK 3's BSplineDeformableTransform had a method SetBulkTransform to concat
>>>>>> the bspline transform with another transform, but in ITK 4's
>>>>>> BSplineTransform this method was removed. So the question remains how to
>>>>>> properly initialize a BSplineTransform with an affine (or any other)
>>>>>> registration output.
>>>>>>
>>>>>> Computing the parameters of the bspline transform by applying the affine
>>>>>> transform to the grid nodes is an option. But something like
>>>>>> SetBulkTransform would be much more convenient.
>>>>>>
>>>>>> I'm thankful for any hints.
>>>>>>
>>>>>> Regards,
>>>>>> Frank
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> View this message in context:http://itk-insight-users.2283740.n2.nabble.com/Initializing-a-BSplineTransform-in-ITK-4-4-tp7583607.html
>>>>>> Sent from the ITK Insight Users mailing list archive atNabble.com  <http://Nabble.com>.
>>>>>> _____________________________________
>>>>>> Powered bywww.kitware.com
>>>>>>
>>>>>> Visit other Kitware open-source projects at
>>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>>
>>>>>> Kitware offers ITK Training Courses, for more information visit:
>>>>>> http://www.kitware.com/products/protraining.php
>>>>>>
>>>>>> 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
>>>> -- 
>>>> Frank Preiswerk, Senior Researcher
>>>> Medical Image Analysis Center (MIAC)
>>>> University of Basel c/o University Hospital Basel
>>>> Spitalstrasse 21
>>>> CH-4031 Basel
>>>> Switzerland
>>>>
>>>> Tel: +41 61 265 96 58
>>>> Fax: +41 61 265 96 68
>>>> Office:Schanzenstrasse 46, Room 321
>>>>
>>
>>
>> -- 
>> Frank Preiswerk, Senior Researcher
>> Medical Image Analysis Center (MIAC)
>> University of Basel c/o University Hospital Basel
>> Spitalstrasse 21
>> CH-4031 Basel
>> Switzerland
>>
>> Tel: +41 61 265 96 58
>> Fax: +41 61 265 96 68
>> Office:Schanzenstrasse 46, Room 321
>


-- 
Frank Preiswerk, Senior Researcher
Medical Image Analysis Center (MIAC)
University of Basel c/o University Hospital Basel
Spitalstrasse 21
CH-4031 Basel
Switzerland

Tel: +41 61 265 96 58
Fax: +41 61 265 96 68
Office:Schanzenstrasse 46, Room 321

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130731/ad3ccee4/attachment.htm>


More information about the Insight-users mailing list