[Insight-users] trouble using the bulktransform

Erik Türke tuerke at cbs.mpg.de
Fri Feb 26 10:42:02 EST 2010


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!




More information about the Insight-users mailing list