[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