[Insight-users] trouble using the bulktransform
Luis Ibanez
luis.ibanez at kitware.com
Mon Mar 1 18:38:18 EST 2010
Hi Erik,
When you request the parameters of a BSpline transform,
the returned array does NOT include the parameters of the
Bulk Transform.
Also, the registration process will NOT change the Bulk
transform at all. It will only compute new parameters for
the BSpline Transform.
Ideally, you should have run first an Affine registration,
and used the resulting affine transform as the Bulk
transform of the BSpline deformable transform registration.
You may find useful to look at
Insight/Examples/Registration/
ImageRegistration15.cxx
Regards,
Luis
----------------------------------------------------------------------------------
On Sun, Feb 28, 2010 at 6:11 PM, Erik Türke <tuerke at cbs.mpg.de> 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
>
More information about the Insight-users
mailing list