[Insight-users] 3D deformable registration

George Iordanescu giordanescu at cmr.nunet.net
Thu Jun 3 14:54:05 EDT 2004


Hi Luis,

I am still having problems trying to use FEM deformable registration
framework to register 2D MRI images. 

I changed a bit the code in the ITK example so that the images are
rescaled to 0-65534 instead of 0-255 (lines 231-232 in my code):

  const double desiredMinimum =  0.0;
  const double desiredMaximum = 65534.0; //255.0;//65534.0;
 
I will really appreciate if you have time to check my code. I put the
images I am working on at:
http://www.geocities.com/itk_fem/fixedSlice13mha.bin
http://www.geocities.com/itk_fem/movingSlice13mha.bin

Please note they are ".mha" files so you should chage their names to:
fixedSlice13.mha and movingSlice13.mha once you download them.

I put the code (a .cxx file) at:
http://www.geocities.com/itk_fem/DeformableRegistration1New.txt

and the parameters file at:

http://www.geocities.com/itk_fem/FiniteElementRegistrationParameters1.txt

The first problem is that the resulted image is almost exactly the same
as the fixed image. All the details of the moving image that are not in
the fixed image are lost. 

The second problem is given by the deformation field. I tried to use it
to warp the image myself but the amplitude of the deformation field is
very small as you can see by looking at the resulting
RegistSlice13_dispy(x)vec images. As a result, the warped image is very
little different from the moving image. I increased the amplitude of the
deformation field by 500 times and the result was a registered image
that was somehow closer the fixed image, although misallignement was
still visible. My expectation was that by using the deformation field
and a WarpImageFilter I would get the same result as using the
itk::fem::FEMRegistrationFilter. Is there any explanation why the
results are different?

Thank you.

George



 

On Fri, 2004-04-30 at 19:21, Luis Ibanez wrote:
> 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
> > 
> 
> 
> 
> 



More information about the Insight-users mailing list