[Insight-users] 2D deformable registration
Luis Ibanez
luis.ibanez@kitware.com
Wed May 19 06:19:23 EDT 2004
Hi Ping,
A quick question before we go into details...
Did you tried this process with a CVS updated
*this week* ?
A bug was recently found in the process of
reading Vector images. The effect is that
when reading an image of vectors, such as a
deformation field, all the pixels turned out
to be null. This bug was fixed at the end
of last week.
If you are using a version with this bug,
your deformation field is being set as null
vectors in memory and therefore is not
applying *any* deformation to your data.
Please try updating your CVS checkout and
let us know if you continue experiencing
any problems.
Thanks,
Luis
-------------------
ping chen wrote:
> Hi Luis,
>
> I try to use the deformation field to warp a image. i
> use the deformation field generated by
> DeformableRegistration1.cxx, in which displacement for
> x and displacement for y are both generated, also a
> vector displacement image VectorDeformationField.mhd
> is generated.
>
> the 1st way for me to use the generated x y
> displacement, i use itkCompose2DVectorImageFilter to
> combine x displacement and y displacement into a
> vector image. and then use this vector image to set
> the deformation field for the warper.
>
> the problem with this way is that the warped result
> from this way is different from the warped image from
> the DeformableRegistration1.cxx, though similiar.
>
> the 2nd way, i just generated the imagereader to
> directly read VectorDeformationField.mhd, and then use
> this reader output to set the deformation field of the
> warper.
>
> the problem with this way is that this method didnt
> work. the output of warper is exactly the same as the
> moving image.
>
> below is part of the code: the 1st way
> typedef itk::Compose2DVectorImageFilter<
> InputImageType,DeformationFieldType>
> FilterType;
> FilterType::Pointer filter = FilterType::New();
> filter->SetInput1(inputreader1->GetOutput());
> filter->SetInput2(inputreader1->GetOutput());
> filter->Update();
> warper->SetInterpolator( interpolator );
> warper->SetOutputSpacing(
> towarpreader->GetOutput()->GetSpacing() );
> warper->SetOutputOrigin(
> towarpreader->GetOutput()->GetOrigin() );
> warper->SetDeformationField( filter->GetOutput() );
> warper->SetInput( towarpreader->GetOutput() );
> try
> {
> warper->Update();
> }
>
> the 2nd way:
> typedef itk::Vector< float, 2 > VectorPixelType;
> typedef itk::Image< VectorPixelType, 2 >
> DeformationFieldType;
> typedef itk::ImageFileReader< DeformationFieldType >
> FieldReaderType;
> typedef itk::WarpImageFilter<
> InputImageType,
> InputImageType,
> DeformationFieldType >
> WarperType;
> warper->SetInput( towarpreader->GetOutput() );
> try
> {
> warper->Update();
> }
> WarperType::Pointer warper = WarperType::New();
> InterpolatorType::Pointer interpolator =
> InterpolatorType::New();
> warper->SetInterpolator( interpolator );
> warper->SetOutputSpacing(
> towarpreader->GetOutput()->GetSpacing() );
> warper->SetOutputOrigin(
> towarpreader->GetOutput()->GetOrigin() );
>
> warper->SetDeformationField(fieldreader1->GetOutput());
> warper->SetInput( towarpreader->GetOutput() );
> try
> {
> warper->Update();
> }
>
> I cant figure out why the warped result from 1way is
> different from the warped result from
> DeformableRegistration1.cxx, and why the 2nd way
> doesnt work. do you have any suggestions? Thanks.
>
> -Ping
>
>
> --- ping chen <miw2k@yahoo.com> wrote:
>
>>Hi Luis,
>>
>>your suggestion is right. and 3d deformable
>>registration works great.
>>
>>I have one question. is there any example which
>>shows
>>how to use the written displacement field, instead
>>of
>>using X->GetDeformationField()?
>>after I finished the registration with
>>deformableregistration1.cxx and saved the
>>displacement
>>field, I still want to use the displacement field to
>>warp new regions. it there any way i can avoid doing
>>the registration again, and just use the
>>displacement
>>field directly?
>>
>>Thanks,
>>Ping
>>
>>
>>--- Luis Ibanez <luis.ibanez@kitware.com> wrote:
>>
>>>Hi Ping,WarperType::Pointer warper =
>
> WarperType::New();
> InterpolatorType::Pointer interpolator =
> InterpolatorType::New();
> warper->SetInterpolator( interpolator );
> warper->SetOutputSpacing(
> towarpreader->GetOutput()->GetSpacing() );
> warper->SetOutputOrigin(
> towarpreader->GetOutput()->GetOrigin() );
>
> warper->SetDeformationField(fieldreader1->GetOutput());
>
>
>
>>>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@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
>>
> === message truncated ===
>
>
>
>
> __________________________________
> Do you Yahoo!?
> SBC Yahoo! - Internet access at a great low price.
> http://promo.yahoo.com/sbc/
>
More information about the Insight-users
mailing list