[Insight-users] 3D deformable registration

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


Hi George,


The output of the FEMRegistrationFilter is the same
type as the FixedImageType, which in your case is
also the output type of the WarpImageFilter.

Judging from the types in your email, it seems that
both image types should be the same.



What makes you think that they are different types ?


Did you got any compiler errors ?
in that case, could you please post them ?


   Thanks



      Luis



--------------------------
George Iordanescu wrote:

> 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 
> 
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>