[Insight-users] 3D deformable registration

Luis Ibanez luis.ibanez at kitware.com
Fri, 30 Apr 2004 20:43:45 -0400


Hi Ping,

The error is that you are passing the output of the
FEMRegistrationFilter as deformation field to the
WarpImageFilter:


 >   warper->SetDeformationField( X->GetOutput() );


However, GetOutput() in the FEMREgistrationFilter returns
the resampled moving image, not the deformation field.


Please replace this line with:

 >   warper->SetDeformationField( X->GetDeformationField() );



Doxygen can always help:

http://www.itk.org/Insight/Doxygen/html/classitk_1_1fem_1_1FEMRegistrationFilter.html
http://www.itk.org/Insight/Doxygen/html/classitk_1_1fem_1_1FEMRegistrationFilter.html#a24



Regards,


    Luis


-----------------
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 
> <http://pa.yahoo.com/*http://us.rd.yahoo.com/hotjobs/hotjobs_mail_signature_footer_textlink/evt=23983/*http://hotjobs.sweepstakes.yahoo.com/careermakeover> 
> *