[Insight-users] 3D deformable registration

George Iordanescu giordanescu at cmr.nunet.net
Wed, 28 Apr 2004 21:46:44 -0500


Hi Ping, hi Luis,

I am trying to do something similar in 2D (I want to warp the image
myself, based on the results given by the FEMRegistrationFilter). What I
am doing is this:

///cast my image to match the type desired by the warper
  typedef itk::CastImageFilter<Image2DType,FemRegisteredImageType>
CasterType1;
  CasterType1::Pointer caster1 = CasterType1::New();
  caster1->SetInput(ImageToWarp);

  typedef FemRegisteredImageType MovingImageType;
  typedef FemRegisteredImageType FixedImageType;
  typedef FemRegistratorDeformationFieldType     FieldType;

///and now do the warping, using almost the same code 
//from the FEMRegistrationFilter

typedef itk::WarpImageFilter<MovingImageType,FixedImageType,FieldType>
WarperType;
  WarperType::Pointer warper = WarperType::New();


  typedef WarperType::CoordRepType CoordRepType;
  typedef
itk::LinearInterpolateImageFunction<MovingImageType,CoordRepType>
    InterpolatorType1;

  InterpolatorType1::Pointer interpolator = InterpolatorType1::New();

  warper = WarperType::New();
  warper->SetInput( caster1->GetOutput() );
  warper->SetDeformationField( X->GetDeformationField() );
  warper->SetInterpolator( interpolator );
  double spacing[2];
  spacing[0] = m_FixedImage->GetSpacing()[0];
  spacing[1] = m_FixedImage->GetSpacing()[1];
  warper->SetOutputSpacing( spacing );
  double origin[2];
  origin[0] = m_FixedImage->GetOrigin()[0];
  origin[1] = m_FixedImage->GetOrigin()[1];
  warper->SetOutputOrigin( origin );
  FixedImageType::PixelType padValue = 0;
  warper->SetEdgePaddingValue( padValue );
  warper->Update();

Ping I think this should fix your error - the deformation field is of
different type than X->GetOutput(). 

In my case however, the resulted (warped) image is different than
X->GetOutput(). Is this a normal behaviour? 

Thank you for your help.

George


On Wed, 2004-04-28 at 14:43, ping chen wrote:
> Hi Luis,
>  
> I tried the way you suggested by using WarpImageFilter, the code i add
> to DeformableRegistration1.cxx is shown below ( MaskImageType is
> exactly the same as the InputImageType)
>     typedef itk::Vector< float, 2 >    VectorPixelType;
>     typedef itk::Image<  VectorPixelType, 2 > DeformationFieldType;
>     typedef itk::WarpImageFilter<
>                           MaskImageType, 
>                           MaskImageType,
>                           DeformationFieldType  >     WarperType;
>   typedef itk::LinearInterpolateImageFunction<
>                                    MaskImageType,
>                                    double          > 
> InterpolatorType;
>   WarperType::Pointer warper = WarperType::New();
>   InterpolatorType::Pointer interpolator = InterpolatorType::New();
>   warper->SetInput( maskreader->GetOutput() );
>   warper->SetInterpolator( interpolator );
>   warper->SetOutputSpacing( inputreader->GetOutput()->GetSpacing() );
>   warper->SetOutputOrigin( inputreader->GetOutput()->GetOrigin() );
>   warper->SetDeformationField( X->GetOutput() );
>   warper->Update();
>  
> just like what in DeformableRegistration2.cxx did. 
>  
> but i got below errors:
>  
> Building dependencies cmake.check_depends...
> Building object file DeformableRegistration1.o...
> /Users/ping/Desktop/deformableR_worksfor2D/DeformableRegistration1.cxx: In 
>    function `int main(int, char**)':
> /Users/ping/Desktop/deformableR_worksfor2D/DeformableRegistration1.cxx:417: error: no
>    matching function for call to `itk::WarpImageFilter<MaskImageType, 
>    MaskImageType, main(int,
> char**):DeformationFieldType>:setDeformationField
>    (ImageType*)'
> /Users/ping/Desktop/InsightToolkit-1.6.0/Code/BasicFilters/itkWarpImageFilter.txx:115: error: candidates
> are: void itk::WarpImageFilter<TInputImage, TOutputImage, 
>    TDeformationField>:setDeformationField(TDeformationField*) [with 
>    TInputImage = MaskImageType, TOutputImage = MaskImageType,
> TDeformationField 
>    = main(int, char**):DeformationFieldType]
> make[1]: *** [DeformableRegistration1.o] Error 1
> make: *** [default_target] Error 2
> 
> since i want to count the voxels in regions of each subjects, i need
> to convert the reference brain(for which i have the Alta mask) to each
> subject brain, when i look into the DeformableRegistration1.cxx code,
> i cant find anywhere i can replace the moving image with mask image.
> to me, in DeformableRegistration1.cxx, the only line connected to
> warped image is
> X->WriteWarpedImage((X->GetResultsFileName()).c_str()); which is
> defined in itkFEMRegistrationFilter.h, itkFEMRegistrationFilter.txx  
> Can you show me a simple way to replace this movingimage input with
> the Mask?
>  
> Thank you.
> Ping
>  
> Luis Ibanez <luis.ibanez at kitware.com> wrote:
>         Hi Ping,
>         
>         Your process of Atlas-Based segmentation can easily
>         be done with small modifications of the Example:
>         
>         DeformableRegistration1.cxx
>         or DeformableRegistration2.cxx
>         
>         You don't need the MaskImageFilter,
>         you don't need the AndImageFilter,
>         
>         You simply need to make sure that you use as Moving
>         image, the Brain image for which you do have the
>         segmentation mask.
>         
>         In the current examples, the input of the WarpImage
>         filter is the Moving image. You simply have to
>         replace this input with the Mask that is representing
>         your segmentation of the Moving image. The WarpImage
>         filter will use the deformation field resulting from
>         the registration process in order to map the Mask
>         into the fixed image.
>         
>         In that way you will obtain a deformed Mask that
>         corresponds to a segmentation of the Fixed Image.
>         
>         You will f ind this illustrated in the Slided on
>         Non-Rigid Registration from the MICCAI 2004 Tutorial
>         
>         http://www.itk.org/HTML/Tutorials.htm
>         
>         more specifically:
>         
>         http://www.itk.org/CourseWare/Training/NonRigidRegistrationMethods.pdf
>         
>         
>         You just need to add an extra ImageFileReader to the
>         example, and connect the output of this reader as
>         input to the WarpImageFilter. Then set the filename
>         of this reader to the filename of the Mask.
>         
>         
>         
>         Regards,
>         
>         
>         Luis
>         
>         
>         -----------------
>         ping chen wrote:
>         
>         > Hi Luis, 
>         > 
>         > The problem I want to solve is take out same regions
>         > of brains with registration. we have reference brain
>         > images and its region mask, then by MaskImageFilter,
>         > we can get the region of reference brain, then by
>         > using the transformation information given by
>         > deformableRegistration1, we warp the region of the
>         > reference image, and get the region from the subject> brain.
>         > 
>         > I have used the MaskImageFilter to get the region i
>         > need. and then i try to use WarpImageFilter to get the
>         > warped region. 
>         > 
>         > 
>         > I have three questions. 
>         > 
>         > 
>         > through deformableRegistration1, the registration of
>         > the fixed 3d brain image and moving 3d brain images
>         > has finished.
>         > 
>         > 1. in deformableRegistration1, the transformation
>         > information is saved by X->WriteDisplacementField,
>         > right? since we are dealing with 3d dataset, we need
>         > to uncomment X->WriteDisplacementField(2); right?
>         > 
>         > or can we just use 
>         > X->WriteDisplacementFieldMultiComponent(); is this
>         > for save the whole transform information? 
>         > 
>         > 2. how to use the above saved transform information
>         > in warpimagefilter in 
>         > warper->SetDeformationField( ???); 
>         > 
>         > 3. warp the region image of the reference image to
>         > subject image with the available transform
>         > information, or warp the region mask(binary) of
>         > reference image and then add MaskImageFilter with the
>         > whole warped brain will produce the same results? 
>         > 
>         > -Emily
>         > 
>         > 
>         > --- Luis Ibanez wrote:
>         > 
>         >>Hi Emily,
>         >>
>         >>
>         >>1) You can mask a region of an image by
>         >> using the AND image filter.
>         >> 
>         >>
>         > 
>         >
>         http://www.itk.org/Insight/Doxygen/html/classitk_1_1AndImageFilter.html
>         > 
>         >> This will work ok if both the mask and
>         >> the image are of the same pixel type and
>         >> are of "integer" type: {char, short, int,
>         >> long}.
>         >>
>         >>
>         >>2) You resample the moving image, using the
>         >> WarpImageFilter and providing the deformation
>         >> field. Note that the WarpImageFilter requires
>         >> you to s pecify an Origin (in physical space)
>         >> and a size (in pixels) for the output image.
>         >>
>         >> What you could do is to take the region from the
>         >> moving image and figure out what will be its
>         >> bounding box once it is mapped to the coordinate
>         >> system of the fixed image. Once you have such
>         >> bounding box, you simply feed this information
>         >> into the origin and size provided to the Warp
>         >> ImageFilter.
>         >>
>         >> The resulting image will only have the size of
>         >> that specified bounding box.
>         >>
>         >>
>         >>
>         >>
>         >>Regards,
>         >>
>         >>
>         >> Luis
>         >>
>         >>
>         >>------------------
>         >>ping chen wrote:
>         >>
>         >>
>         >>>Hello, 
>         >>>
>         >>>I have used DeformableRegistration1.cxx to
>         >>
>         >>register 3d
>         >>
>         >>>MRI brain images and i go t the warped whole brain
>         >>>image and also the DisplacementField. 
>         >>>
>         >>>I have two problems:
>         >>>1. If I have a mask of one region, how i can use
>         >>
>         >>this
>         >>
>         >>>mask to take out that only region from the 3d
>         >>
>         >>images?
>         >>
>         >>>2. I wonder how i can use this transform
>         >>
>         >>information
>         >>
>         >>>from DeformableRegistration1 to warp this region,
>         >>>instead of a whole brain?
>         >>>
>         >>>Thank you.
>         >>>emily
>         >>>
>         >>>
>         >>> 
>         >>
>         >>
>         >>_______________________________________________
>         >>Insight-users mailing list
>         >>Insight-users at itk.org
>         >>http://www.itk.org/mailman/listinfo/insight-users
>         > 
>         > 
>         > 
>         > 
>         > 
>         > __________________________________
>         > Do you Yahoo!?
>         > W in a $20,000 Career Makeover at Yahoo! HotJobs 
>         > http://hotjobs.sweepstakes.yahoo.com/careermakeover 
>         > 
>         
>         
>         
>         _______________________________________________
>         Insight-users mailing list
>         Insight-users at itk.org
> 
> 
> ______________________________________________________________________
> Do you Yahoo!?
> Win a $20,000 Career Makeover at Yahoo! HotJobs