[Insight-users] trouble using the bulktransform
Erik Türke
tuerke at cbs.mpg.de
Sun Feb 28 18:11:14 EST 2010
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!
More information about the Insight-users
mailing list