[Insight-users] trouble using the bulktransform

Erik Tuerke tuerke at cbs.mpg.de
Thu Mar 4 05:30:54 EST 2010


Erik Tuerke wrote:
> Erik Türke wrote:
>> Erik Türke wrote:
>>> Luis Ibanez wrote:
>>>> Hi Erik,
>>>>
>>>>
>>>> Why are you using a static_cast in ?:
>>>>
>>>>
>>>>   m_BSplineTransform->SetBulkTransform(
>>>>       static_cast<VersorRigid3DTransformType*> (initialTransform));
>>>>
>>>>
>>>> That static_cast should be necessary.
>>>>
>>>> ---
>>>>
>>>> I suspect that the problem is mostly related to
>>>> the initialization of the BSpline Transform itself.
>>>>
>>>> Particularly related to the image Direction.
>>>>
>>>>
>>>> You may want to use the following class:
>>>>
>>>>    Insight/Code/Review/
>>>>        itkBSplineDeformableTransformInitializer.h
>>>>        itkBSplineDeformableTransformInitializer.txx
>>>>
>>>>
>>>> That is described in this Insight Journal paper:
>>>>
>>>>
>>>> "Helper class for initializing the grid parameters of a
>>>>  BSpline deformable transform by using an image as reference"
>>>> http://www.insight-journal.org/browse/publication/216
>>>> http://hdl.handle.net/1926/1338
>>>>
>>>>
>>>> Note that is simply a complement to the use of the
>>>> Bulk Transform, not a replacement for it.
>>>>
>>>>
>>>>
>>>>       Regards,
>>>>
>>>>
>>>>
>>>>             Luis
>>>>
>>>>
>>>>
>>>> ----------------------------------------------------------------------- 
>>>>
>>>> On Fri, Feb 26, 2010 at 10:42 AM, Erik Türke <tuerke at cbs.mpg.de> 
>>>> wrote:
>>>>  
>>>>> Hi!
>>>>>
>>>>> I am trying to use the SetBulkTransform method of the
>>>>> BSplineDeformableTransform.
>>>>>
>>>>> The two images which i want to register are totally shifted, so i 
>>>>> want to
>>>>> use a simple translation as the bulk transform.
>>>>>
>>>>> So what  i am doing is:
>>>>>
>>>>> m_BSplineTransform->SetBulkTransform(static_cast<VersorRigid3DTransformType*> 
>>>>>
>>>>> (initialTransform));
>>>>>
>>>>> If i print out the parameters of the initialTransform with:
>>>>>
>>>>> std::cout << static_cast<VersorRigid3DTransformType*>
>>>>> (initialTransform)->GetParameters() << std::endl;
>>>>>
>>>>> the output is: [0, 0, 0, 96.2941, 92.5804, 38.6559], what is 
>>>>> totally right.
>>>>>
>>>>> Now i setup the BSplineTransform:
>>>>>
>>>>>               typedef typename BSplineTransformType::RegionType
>>>>> BSplineRegionType;
>>>>>               typedef typename BSplineTransformType::SpacingType
>>>>> BSplineSpacingType;
>>>>>               typedef typename BSplineTransformType::OriginType
>>>>> BSplineOriginType;
>>>>>               typedef typename BSplineTransformType::DirectionType
>>>>> BSplineDirectionType;
>>>>>
>>>>>               BSplineRegionType bsplineRegion;
>>>>>               typename BSplineRegionType::SizeType gridSizeOnImage;
>>>>>               typename BSplineRegionType::SizeType gridBorderSize;
>>>>>               typename BSplineRegionType::SizeType totalGridSize;
>>>>>
>>>>>               gridSizeOnImage.Fill(UserOptions.BSplineGridSize);
>>>>>               gridBorderSize.Fill(3); //Border for spline order = 
>>>>> 3 (1
>>>>> lower, 2 upper)
>>>>>               totalGridSize = gridSizeOnImage + gridBorderSize;
>>>>>
>>>>>               bsplineRegion.SetSize(totalGridSize);
>>>>>               BSplineSpacingType bsplineSpacing =
>>>>> m_FixedImage->GetSpacing();
>>>>>
>>>>>               BSplineOriginType bsplineOrigin = 
>>>>> m_FixedImage->GetOrigin();
>>>>>
>>>>>               typename FixedImageType::SizeType fixedImageSize =
>>>>> m_FixedImage->GetBufferedRegion().GetSize();
>>>>>
>>>>>               for (unsigned int r = 0; r < FixedImageDimension; 
>>>>> r++) {
>>>>>                   bsplineSpacing[r] *= static_cast<double>
>>>>> (fixedImageSize[r] - 1) / static_cast<double> (gridSizeOnImage[r]
>>>>>                           - 1);
>>>>>               }
>>>>>
>>>>>               BSplineDirectionType bsplineDirection =
>>>>> m_FixedImage->GetDirection();
>>>>>               BSplineSpacingType gridOriginOffset = 
>>>>> bsplineDirection *
>>>>> bsplineSpacing;
>>>>>
>>>>>               bsplineOrigin = bsplineOrigin - gridOriginOffset;
>>>>>
>>>>>               m_BSplineTransform->SetGridSpacing(bsplineSpacing);
>>>>>               m_BSplineTransform->SetGridOrigin(bsplineOrigin);
>>>>>               m_BSplineTransform->SetGridRegion(bsplineRegion);
>>>>>               m_BSplineTransform->SetGridDirection(bsplineDirection);
>>>>>
>>>>>               typedef typename BSplineTransformType::ParametersType
>>>>> BSplineParametersType;
>>>>>
>>>>>               m_NumberOfParameters =
>>>>> m_BSplineTransform->GetNumberOfParameters();
>>>>>
>>>>>               BSplineParametersType 
>>>>> bsplineParameters(m_NumberOfParameters);
>>>>>               bsplineParameters.Fill(0.0);
>>>>>
>>>>> m_BSplineTransform->SetParameters(bsplineParameters);
>>>>>
>>>>> m_RegistrationObject->SetInitialTransformParameters(m_BSplineTransform->GetParameters()); 
>>>>>
>>>>>       If i now start the registration with 1 iteration, the result is
>>>>> totally shifted again.
>>>>> I am sure, the initial transform is right, because i got those 
>>>>> values by
>>>>> using the itk initializer class and tested the values as the initial
>>>>> parameters of a VersorRigid3DTransform with iterations= 0 as well.
>>>>> With the VersorRigid3DTransform, the images are aligned.
>>>>> Why is the bulktransform not working here?
>>>>>
>>>>> I becoming a little desperate now :-( . Can somebody give me a hint?
>>>>>
>>>>> Thanks!
>>>>>
>>>>>
>>>>> _____________________________________
>>>>> Powered by www.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.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
>>>>>
>>>>>     
>>> Hi!
>>>
>>> I was recognizing the same, when i browsed the examplecode.
>>> But unfortunately that is not the source of trouble.
>>>
>>> It is quiet odd, but tomorrow i will examine my code for the 10 th 
>>> time :-)
>>>
>>> Thanks anyway!
>>> _____________________________________
>>> Powered by www.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.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
>> Hi!
>>
>> I have one more question regarding the bulktransform.
>>
>> My bulk transform has the following parameters: 0.945735, 0.113925, 
>> -0.00285777, -0.079356, 1.00047, -0.103143, 0.0578154, 0.0547296, 
>> 0.993574, 92.1006, 93.1594, 40.8156
>>
>> Now i start the registration and print out the last transform 
>> parameters. But this transform only contains values below 1.
>> Isnt the translation (92.1006, 93.1594, 40.8156) stored in the last 
>> transform parameters?? Or are they just lost?
>>
>> Or are the translation stored in the FixedParameters, which after the 
>> registration looks like [8, 8, 8, -119.25, 149.25, -121.25, 39.75, 
>> 49.75, 39.75, -3.42285e-08, -5.23956e-25, 1, 3.06152e-17, -1, 
>> 5.23956e-25, 1, 3.06152e-17, 3.42285e-08] ?
>>
>> Thanks a lot!
>>
>>
>>
>> _____________________________________
>> Powered by www.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.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
> Hi!
>
> Now i am realizing, that the bulktransform method works fine!
>
> I think the problem is the resampling process.
>
> The translation of the transform is stored in the fixedparameters of 
> the bsplineDeformable transform, is that right?
> But when i manipulate fixed parameters, this has not any effect on the 
> resampling result.
> The shift of the resampled image remains the same.  However, if i 
> manipulate the fixed parameters of an affine transform, the resampling 
> result changes.
>
> Is this normal??
>
> Thanks
>
> _____________________________________
> Powered by www.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.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
Ok, now i tested the example DeformableRegistration15 and it worked all 
fine.

So the error must be appearing because of storing my transform in a file 
an load it before starting the resampling effect. (registration and 
resampling are two different programs)
This is the only difference between my code and the example code, i 
discovered.

I will report.



More information about the Insight-users mailing list