[Insight-users] MultiResMIRegistration - QuaternionRigid 2 Affine
(3)
Christos Panagiotou
C.Panagiotou at cs.ucl.ac.uk
Mon, 22 Mar 2004 00:27:49 +0000
Luis Ibanez wrote:
>
> Hi Christos,
>
> I was *not* suggesting you to change the values of
> pixel spacing. On the contrary, what you want to do
> is to make sure that your images have the correct
> values of pixel spacing. The number on my previous
> email were purely figurative, and were only there
> for the sake of presenting an example.
>
>
> *Do not change the values of pixel spacing*.
>
> Just, be aware of what they are and consider this
> information when you attempt to initialize and drive
> the registration process.
>
> You will get the translation for centering both
> volumes from the CenteredTransformInitializer.
>
> --
>
> Before you go further, Please *stop* programming,
> get some coffee and start reading the SoftwareGuide.
>
> http://www.itk.org/ItkSoftwareGuide.pdf
>
> That will save you from wasting time and going through
> unnecessary suffering.
>
> The answer to your question about reslicing is described
> in detail on the SoftwareGuide. Please read the section
> on the ResampleImageFilter:
>
> Section 6.7.1, pdf-page 199.
>
>
> You may want to run the associated examples
> available in:
>
> Insight/Examples/Filtering
>
>
> Then read the Registration chapter:
>
> Chapter 8, pdf-page 241.
>
>
> in particular, Centered Transforms are
> discussed in:
>
>
> Section 8.5, pdf-page 263.
>
>
>
> Almost all the examples on image registration
> show how to resample the moving image using
> the resulting transform. This code is
> available in
>
>
> Insight/Examples/Registration
>
>
>
>
>
> Regards,
>
>
>
> Luis
>
>
>
> --------------------------
> Christos Panagiotou wrote:
>
>> Dear Luis
>>
>> I see what you mean...
>> The MRI volume has 256 X 256 x 136 slices... and in the header file
>> its said that the voxel spacing is 1.0x1.0x1.0 mm
>>
>> The OT volume does not provide info about its spacing however
>> i was adviced to place it in 1.0x1.0x1.0 as well..
>>
>> What i dont get is that if i set the spacing of the MRI volume to
>> 0.5x0.5x1.0
>> am I not going to alter its information by "compressing" it on x and y?
>>
>> What I was expecting was to center both volumes and using information
>> from the metric (MI image2image metric) the moving volume would expand
>> accordingly to x y z to until convergence or until iterations have
>> reached an end...
>>
>> What I mean is by changing the voxel spacing in only 2 axis I would
>> force a change to the aspect ratio of the volume.
>> If I do this then the moving image would register to a volume that
>> does not correspond to reality
>> I thought I could leave this part to the metric to decide how it can
>> change the aspect ratio of the moving volume
>> accordingly, to fit the fixed volume.
>>
>> Please enlighten me :)
>> I see what you mean however i ll try to do this and see the results!
>>
>> thanks for your help - much appreciated
>>
>> p.s. luis, one more question, how could i reslice the volumes so i
>> could see the achieved registration in 2D slices?
>> lets say, after the registration when both have reached a similar
>> size, to be able and change both of them
>> to similar dimensions (i.e. 256x256x136 with 1.0mm spacing in all
>> directions)
>>
>>
>>
>> Luis Ibanez wrote:
>>
>>>
>>> Hi Christos,
>>>
>>> Registration in ITK is done in Physical coordinates.
>>> You must think in terms of millimeters instead of
>>> thinking in terms of number of pixels. A pixel is
>>> not a unit of measurement.
>>>
>>> The actual size of your images is computed by multiplying
>>> the number of pixels along each side of the image by the
>>> pixel spacing in millimeters.
>>>
>>> For example, your MRI image has number of pixels =
>>>
>>> 256 X 256 x 136
>>>
>>> and it should have pixel spacing of something like
>>>
>>> 0.5mm X 0.5mm X 1.0mm
>>>
>>> ( or probably you are lucky enough to have better
>>> resolution that can match the pixel spacing of
>>> the optical tomography volume.)
>>>
>>>
>>> The physical extent of the MRI image is then:
>>>
>>> 128.0 mm X 128.0 mm X 136 mm
>>>
>>>
>>> That's the dimension that you should have in mind when
>>> reasoning about the relative size of the images.
>>>
>>> What is the pixel spacing of your optical tomography
>>> image ?
>>>
>>> Please compute the physical extent of the OT image...
>>>
>>> What is the origin of the MRI image ?
>>>
>>> What is the origin of the OT image ?
>>>
>>>
>>>
>>> Note that if the pixel spacing of the OT image is
>>> calibrated correctly, there is no reason why you
>>> should be expecting any scaling. The pixel spacing
>>> in the image should provide a natural scaling between
>>> the image grid and the physical space.
>>>
>>>
>>> Regarding the use of the GradientDescentOptimizer
>>> versus the RegularStepGradientOptimizer, their
>>> selection depends on how noisy the image metric
>>> is. You cannot simply generalize a statement such
>>> as "one is faster than the other". There are many
>>> circumstances that will determine the performance
>>> of each one.
>>>
>>>
>>> You may find useful to look at the two following
>>> presentations:
>>>
>>>
>>> http://www.cs.rpi.edu/courses/spring04/imagereg/lecture07.ppt
>>> http://www.cs.rpi.edu/courses/spring04/imagereg/lecture08.ppt
>>>
>>>
>>>
>>>
>>> Regards,
>>>
>>>
>>>
>>> Luis
>>>
>>>
>>>
>>> ------------------------------------------------
>>> Christos Panagiotou wrote:
>>>
>>>> guys
>>>>
>>>> i am sorry for writing the third consecutive email without waiting
>>>> the answers for the other two...
>>>> i need to ask something about scaling (not the translation scale
>>>> factor) in the affine transformation.
>>>>
>>>> I register the two volumes from different modalities using the
>>>> MultiResMIRegistration which has been altered
>>>> and does not use quaternionRigidT but AffineT. Also the optimizer
>>>> now is RegularStepGradientDescent.
>>>>
>>>> The first volume (MRI) is 256x256x136 and the second volume is
>>>> 100x120x138 (Optical Tomography).
>>>> After the registration completes the volumes seem aligned enough.
>>>> Substantial translation has taken place however I dont see any
>>>> substantial scaling of the smaller volume
>>>> to reach at least a size similar to the fixed one. The output of
>>>> the application is the following:
>>>>
>>>> Final parameters: [0.99324, 0.00293927, 0.00176662, 0.00253656,
>>>> 0.998594, -0.000835126, 0.00168811, -0.00157159, 0.992728, 1.62397,
>>>> 3.78007, 1.85686]
>>>> Overall transform matrix:
>>>> 0.00168811 -0.00157159 0.992728
>>>> -0.99324 -0.00293927 -0.00176662
>>>> 0.00253656 0.998594 -0.000835126
>>>>
>>>> Overall transform offset:
>>>> -15.6672 185.008 -55.3077
>>>>
>>>> The code I use is the one found in the MIMRegistration.txx in the
>>>> MultiResMiRegistration application
>>>>
>>>> // Default parameters
>>>> m_NumberOfLevels = 1; //value from parameter file is 4
>>>> m_TranslationScale = 1.0; //value from parameter file is around 300
>>>> m_MovingImageStandardDeviation = 0.4;
>>>> m_FixedImageStandardDeviation = 0.4;
>>>> m_NumberOfSpatialSamples = 50;
>>>>
>>>> m_FixedImageShrinkFactors.Fill( 1 ); // shrink factor values come
>>>> from parameter file - these are skipped
>>>> m_MovingImageShrinkFactors.Fill( 1 );
>>>>
>>>> m_NumberOfIterations = UnsignedIntArray(1);
>>>> //Set elements of the array to the specified value
>>>> m_NumberOfIterations.Fill( 10 ); // from parameter file values are
>>>> 2000 iterations per level
>>>>
>>>> m_LearningRates = DoubleArray(1);
>>>> m_LearningRates.Fill( 1e-4 ); //updated from parameter file
>>>>
>>>> m_InitialParameters = ParametersType(m_Transform->GetParameters());
>>>>
>>>> }
>>>>
>>>>
>>>> template <typename TFixedImage, typename TMovingImage>
>>>> MIMRegistrator<TFixedImage,TMovingImage>
>>>> ::~MIMRegistrator()
>>>> {
>>>> m_Registration->RemoveObserver( m_Tag );
>>>>
>>>> }
>>>>
>>>>
>>>> template <typename TFixedImage, typename TMovingImage>
>>>> void
>>>> MIMRegistrator<TFixedImage,TMovingImage>
>>>> ::Execute()
>>>> {
>>>>
>>>> // Setup the optimizer
>>>> typename OptimizerType::ScalesType scales(
>>>> m_Transform->GetNumberOfParameters() );
>>>> scales.Fill(1.0)
>>>> for ( int j = 9; j < 12; j++ )
>>>> {
>>>> scales[j] = m_TranslationScale;
>>>> }
>>>>
>>>> m_Optimizer->SetScales( scales );
>>>> m_Optimizer->SetMaximumStepLength(1);
>>>> m_Optimizer->SetMinimumStepLength(0.005 );
>>>> m_Optimizer->MaximizeOn();
>>>>
>>>> // Setup the metric
>>>> m_Metric->SetMovingImageStandardDeviation(
>>>> m_MovingImageStandardDeviation );
>>>> m_Metric->SetFixedImageStandardDeviation(
>>>> m_FixedImageStandardDeviation );
>>>> m_Metric->SetNumberOfSpatialSamples( m_NumberOfSpatialSamples );
>>>>
>>>> // Setup the image pyramids
>>>> m_FixedImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
>>>> m_FixedImagePyramid->SetStartingShrinkFactors(
>>>> m_FixedImageShrinkFactors.GetDataPointer() );
>>>>
>>>> m_MovingImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
>>>> m_MovingImagePyramid->SetStartingShrinkFactors(
>>>> m_MovingImageShrinkFactors.GetDataPointer() );
>>>>
>>>> // Setup the registrator
>>>> m_Registration->SetFixedImage( m_FixedImage );
>>>> m_Registration->SetMovingImage( m_MovingImage );
>>>> m_Registration->SetNumberOfLevels( m_NumberOfLevels );
>>>>
>>>> m_Registration->SetInitialTransformParameters( m_InitialParameters );
>>>>
>>>> m_Registration->SetFixedImageRegion(
>>>> m_FixedImage->GetBufferedRegion() );
>>>>
>>>> try
>>>> {
>>>> m_Registration->StartRegistration();
>>>> }
>>>> catch( itk::ExceptionObject & err )
>>>> {
>>>> std::cout << "Caught an exception: " << std::endl;
>>>> std::cout << err << std::endl;
>>>> throw err;
>>>> }
>>>>
>>>> the weird thing is that i tried the method with both
>>>> gradientdescent and regularstepgradientdescent with 2000plus number
>>>> of iterations per level and
>>>> the regularStepGradientDescentOptimizer was faster than the
>>>> gradientDescent. I ve read in the mailing list that this is not the
>>>> case. Probably I do something very wrong
>>>>
>>>> I would appreciate any help on how to increase or implement (if i
>>>> forget something major here) the scaling of the moving image using
>>>> the affine transform.
>>>> Is it the AffineTransform::Scale() method? and if it is how can it
>>>> be used?
>>>>
>>>> sorry for the number of emails and questions - i appreciate your
>>>> tolerance!
>>>> thanks
>>>> chris
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Insight-users mailing list
>>>> Insight-users at itk.org
>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>>
>>>
>>>
>>>
>>>
>>
>
>
>
>
--
---------------------------------------------------
Christos Panagiotou
PhD student
University College London
Dept. of Computer Science
Tel 1: +44 (0)20 7679 3462 (Direct Dial)
Tel 2: 33462 (internal)
Fax: +44 (0)20 7387 1397
http://www.cs.ucl.ac.uk/people/C.Panagiotou.html
Return the Elgin marbles
http://www.marblesreunited.org.uk/default.asp
Vote for the return of the marbles
http://www.parthenonuk.com/vote_now.php