[Insight-users] Transformation in ModelToImageRegistration example

Luis Ibanez luis.ibanez at kitware.com
Tue Apr 18 10:30:45 EDT 2006


Hi Bradley,

Thanks for pointing this out.

The conversion between index and point has been fixed
for using the image method TransformIndexToPhysicalPoint.

You may have to update your CVS checkout of ITK in order
to get these fixes.



As you pointed out, this example is taking some shorcuts.
The metrics in the SetSpatialObjectMethods samples the
spatial object using the grid of the image. This is not
the best way of getting a pointset for representing the
spatial object, and as you indicated, it only works because
the example is set up in such a way that the images and
the spatial object are originally aligned. The misalignment
is introduced later on, just before running the registration
algorithm.

A more realistic way of using the Spatial Objects to sample
them in order to generate a PointSet, then use the PointSet
toImage registration method.

What creates ambiguity in the case of the ModelToImage registration
is that the concept of what is Fixed and what is Moving has been
reversed.

In the rest of ITK the registration framework defines the Fixed
object as the source of points to be mapped into the space of the
Moving object. In the exceptional case of the ImageToSpatial object
registration, the SpatialObject is considered to be the moving
element even though it is the source of points to be mapped.
In this context the transform that is being optimized here is the
one that maps points from the SpatialObject into the Image.

This choice was mostly driven by the fact that applications using
SpatialObjects has a large visualization component and tend to use
the transform resulting from the registration as the transfrom to
pass to vtkActors that will display the Spatial Object representation
in the appropriate location of space on top of the image.



In general it is more eficient to chose the "Moving" object as
the one that can easily be sampled by points, and the "Fixed"
object as the one that can be used as a source of points.


   Please let us know if you have further questions.


     Thanks


       Luis



------------------------
Karthik Krishnan wrote:
> Looks like a bug to me too.
> 
> The example seems to swap index and physical points and won't work for 
> images with spacing not equal to 1. (for instance if you say 
> imageFilter->SetSpacing(..)) and it seems to swap the notion of Fixed 
> and moving image.
> 
> 
> Bradley Lowekamp wrote:
> 
>> Hello all,
>>
>> I am confused by the transformations going on in the example 
>> ModelToImageRegistration.cxx with regards to the custom Metric. Here 
>> are some highlights of the code:
>>
>> In SetMovingSpacialObject():
>>       ...
>>       typedef itk::ImageRegionConstIteratorWithIndex<TFixedImage> 
>> myIteratorType;
>>       myIteratorType 
>> it(this->m_FixedImage,this->m_FixedImage->GetBufferedRegion());
>>       itk::Point<double,2> point;
>>       while(!it.IsAtEnd())
>>         {
>>         for(unsigned int i=0;i<Self::ObjectDimension;i++)
>>           {
>>           point[i]=it.GetIndex()[i];
>>           }
>>
>>         if(this->m_MovingSpatialObject->IsInside(point,99999))
>>           {
>>           m_PointList.push_back(point);
>>           }
>>         ++it;
>> ....
>> In GetValue():
>>        ...
>>        PointListType::const_iterator it = m_PointList.begin();
>>        ...
>>        while(it != m_PointList.end())
>>         {
>>         PointType transformedPoint = 
>> this->m_Transform->TransformPoint(*it);
>>         
>> this->m_FixedImage->TransformPhysicalPointToIndex(transformedPoint,index); 
>>
>>         ...
>>
>> I have been reading and rereading the relevant sections in the ITK 
>> software guide book, especially the "Direction of the Transform 
>> Mapping". I believe I understand the usage and direction of the 
>> transformations is the registration process. Perhaps this is a poor 
>> example, which takes some short cuts. But this is my understanding of 
>> this code:
>>
>> The created m_PointList contains a points in "image grid" space. 
>> (Slightly ambiguous as to which since the two are already aligned).
>>
>> Then the m_Transform is applied. This transform maps points from 
>> physical space of the fixed image to the physical space of the moving 
>> model according to the definition of said transform. (We can overlook 
>> the lack of image grid to physical space transformation since it is 
>> the identity in both cases.) So "transformedPoint" ought to be in the 
>> physical space of the moving model.
>>
>> Last the fixed image's physical to image grid index transform is 
>> applied. So "transformedPoint" must be in fixed image's physical space.
>>
>> So this is a contradiction, and I am confused. What am I missing here?
>>
>> Sorry for the repost. I am hoping that this one doesn't get hijacked 
>> too :)
>>
>> Thanks,
>> Brad
>>
>>
>>
>> ========================================================
>>
>> Bradley Lowekamp 
>> Management Systems Designers Contractor for
>>
>> Office of High Performance Computing and Communications
>>
>> National Library of Medicine
>> blowekamp at mail.nih.gov <mailto:blowekamp at mail.nih.gov>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>>  
>>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
> 
> 



More information about the Insight-users mailing list