[Insight-users] MultiResMIRegistration - QuaternionRigid 2 Affine (3)

Christos Panagiotou C.Panagiotou at cs.ucl.ac.uk
Sun, 21 Mar 2004 14:41:21 +0000


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