ITK/Examples/Registration/DeformationFieldTransform

From KitwarePublic
< ITK‎ | Examples
Revision as of 16:37, 14 August 2011 by Lorensen (talk | contribs) (ITKv4 API change)
Jump to navigationJump to search

Please note that in ITKv4, DeformationFieldTransform was renamed to DisplacementFieldTransform.

DeformationFieldTransform.cxx

<source lang="cpp">

  1. include "itkImageFileReader.h"
  2. include "itkImageFileWriter.h"
  3. include "itkImage.h"
  4. include "itkVector.h"
  5. include "itkDeformationFieldSource.h"
  6. if ITK_VERSION_MAJOR < 4
  7. include "itkDeformationFieldTransform.h"
  8. else
  9. include "itkVectorLinearInterpolateImageFunction.h"
  10. include "itkDisplacementFieldTransform.h"
  11. endif
  12. include "itkResampleImageFilter.h"

const unsigned int Dimension = 2; typedef unsigned char PixelType; typedef itk::Image< PixelType, Dimension > ImageType;

static void CreateFixedImage(ImageType::Pointer image); static void CreateMovingImage(ImageType::Pointer image);

int main(int argc, char * argv[]) {

  1. if ITK_VERSION_MAJOR < 4
 typedef   float           VectorComponentType;
  1. else
 typedef   double          VectorComponentType;
  1. endif
 typedef   itk::Vector< VectorComponentType, Dimension >    VectorType;
 typedef   itk::Image< VectorType,  Dimension >   DeformationFieldType;
 ImageType::Pointer fixedImage = ImageType::New();
 CreateFixedImage(fixedImage);
 
 ImageType::Pointer movingImage = ImageType::New();
 CreateMovingImage(movingImage);
 
 typedef itk::DeformationFieldSource<DeformationFieldType>  DeformationFieldSourceType;
 DeformationFieldSourceType::Pointer deformationFieldSource = DeformationFieldSourceType::New();
 deformationFieldSource->SetOutputSpacing( fixedImage->GetSpacing() );
 deformationFieldSource->SetOutputOrigin(  fixedImage->GetOrigin() );
 deformationFieldSource->SetOutputRegion(  fixedImage->GetLargestPossibleRegion() );
 deformationFieldSource->SetOutputDirection( fixedImage->GetDirection() );
 //  Create source and target landmarks.
 typedef DeformationFieldSourceType::LandmarkContainerPointer   LandmarkContainerPointer;
 typedef DeformationFieldSourceType::LandmarkContainer          LandmarkContainerType;
 typedef DeformationFieldSourceType::LandmarkPointType          LandmarkPointType;
 LandmarkContainerType::Pointer sourceLandmarks = LandmarkContainerType::New();
 LandmarkContainerType::Pointer targetLandmarks = LandmarkContainerType::New();
 LandmarkPointType sourcePoint;
 LandmarkPointType targetPoint;
 sourcePoint[0] = 40;
 sourcePoint[1] = 40;
 targetPoint[0] = 20;
 targetPoint[1] = 20;
 sourceLandmarks->InsertElement( 0, sourcePoint );
 targetLandmarks->InsertElement( 0, targetPoint );
 sourcePoint[0] = 40;
 sourcePoint[1] = 60;
 targetPoint[0] = 20;
 targetPoint[1] = 80;
 sourceLandmarks->InsertElement( 1, sourcePoint );
 targetLandmarks->InsertElement( 1, targetPoint );
 sourcePoint[0] = 60;
 sourcePoint[1] = 40;
 targetPoint[0] = 80;
 targetPoint[1] = 20;
 sourceLandmarks->InsertElement( 2, sourcePoint );
 targetLandmarks->InsertElement( 2, targetPoint );
 sourcePoint[0] = 60;
 sourcePoint[1] = 60;
 targetPoint[0] = 80;
 targetPoint[1] = 80;
 sourceLandmarks->InsertElement( 3, sourcePoint );
 targetLandmarks->InsertElement( 3, targetPoint );
 deformationFieldSource->SetSourceLandmarks( sourceLandmarks.GetPointer() );
 deformationFieldSource->SetTargetLandmarks( targetLandmarks.GetPointer() );
 deformationFieldSource->UpdateLargestPossibleRegion();
 // Write the deformation field
 {
 typedef itk::ImageFileWriter<  DeformationFieldType  > WriterType;
 WriterType::Pointer writer = WriterType::New();
 writer->SetInput (  deformationFieldSource->GetOutput() );
 writer->SetFileName( "deformation.mhd" );
 writer->Update();
 }
 
  1. if ITK_VERSION_MAJOR < 4
 typedef itk::DeformationFieldTransform<VectorComponentType, 2>  DeformationFieldTransformType;
  1. else
 typedef itk::DisplacementFieldTransform<VectorComponentType, 2>  DeformationFieldTransformType;
  1. endif
 DeformationFieldTransformType::Pointer deformationFieldTransform = DeformationFieldTransformType::New();
  1. if ITK_VERSION_MAJOR < 4
 deformationFieldTransform->SetDeformationField( deformationFieldSource->GetOutput() );
  1. else
 deformationFieldTransform->SetDisplacementField( deformationFieldSource->GetOutput() );
  1. endif
 typedef itk::ResampleImageFilter<ImageType, ImageType, VectorComponentType >    ResampleFilterType;
 ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New();
 resampleFilter->SetInput( movingImage );
 resampleFilter->SetTransform( deformationFieldTransform );
 resampleFilter->SetSize( fixedImage->GetLargestPossibleRegion().GetSize() );
 resampleFilter->SetOutputOrigin(  fixedImage->GetOrigin() );
 resampleFilter->SetOutputSpacing( fixedImage->GetSpacing() );
 resampleFilter->SetOutputDirection( fixedImage->GetDirection() );
 resampleFilter->SetDefaultPixelValue( 200 );
 resampleFilter->GetOutput();
 // Write the output
 typedef itk::ImageFileWriter<  ImageType  > WriterType;
 WriterType::Pointer writer = WriterType::New();
 writer->SetInput (  resampleFilter->GetOutput() );
 writer->SetFileName( "output.png" );
 writer->Update();
 
 return EXIT_SUCCESS;

}

void CreateFixedImage(ImageType::Pointer image) {

 // Create a black image with a white square
 ImageType::IndexType start;
 start.Fill(0);

 ImageType::SizeType size;
 size.Fill(100);

 ImageType::RegionType region;
 region.SetSize(size);
 region.SetIndex(start);

 image->SetRegions(region);
 image->Allocate();
 image->FillBuffer(0);

 itk::ImageRegionIterator<ImageType> imageIterator(image,region);

 while(!imageIterator.IsAtEnd())
   {
   if(imageIterator.GetIndex()[0] > 40 && imageIterator.GetIndex()[0] < 60 &&
     imageIterator.GetIndex()[1] > 40 && imageIterator.GetIndex()[1] < 60)
     {
     imageIterator.Set(255);
     }
   ++imageIterator;
   }
 // Write the deformation field
 typedef itk::ImageFileWriter<  ImageType  > WriterType;
 WriterType::Pointer writer = WriterType::New();
 writer->SetInput (  image );
 writer->SetFileName( "fixed.png" );
 writer->Update();

}


void CreateMovingImage(ImageType::Pointer image) {

 // Create a black image with a white square
 ImageType::IndexType start;
 start.Fill(0);

 ImageType::SizeType size;
 size.Fill(100);

 ImageType::RegionType region;
 region.SetSize(size);
 region.SetIndex(start);

 image->SetRegions(region);
 image->Allocate();
 image->FillBuffer(0);

 itk::ImageRegionIterator<ImageType> imageIterator(image,region);

 while(!imageIterator.IsAtEnd())
   {
   if(imageIterator.GetIndex()[0] > 20 && imageIterator.GetIndex()[0] < 80 &&
     imageIterator.GetIndex()[1] > 20 && imageIterator.GetIndex()[1] < 80)
     {
     imageIterator.Set(100);
     }
   ++imageIterator;
   }
 // Write the deformation field
 typedef itk::ImageFileWriter<  ImageType  > WriterType;
 WriterType::Pointer writer = WriterType::New();
 writer->SetInput (  image );
 writer->SetFileName( "moving.png" );
 writer->Update();

} </source>

CMakeLists.txt

<source lang="cmake"> cmake_minimum_required(VERSION 2.6)

PROJECT(DeformationFieldTransform)

FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(DeformationFieldTransform DeformationFieldTransform.cxx) TARGET_LINK_LIBRARIES(DeformationFieldTransform ${ITK_LIBRARIES}) </source>