ITK Deformable Registration Demons Methods
Deformable Registration
Deformable Transforms
Deformable Transformation y y Transform x x Fixed Image Moving Image
Deformable Transformation y y Transform x x Fixed Image Moving Image
Deformable Transformation y y Transform x x Fixed Image Moving Image
Image Resampling Interpolator Fixed Image Resample Image Moving Image Filter Moving Image Deformed Image Transform
Image Resampling Fixed Image Interpolator Resample Image Filter Moving Image Orthogonal Basis Explicit Vector Field Splines High Order Polynomials Deformed Image Transform
Kernel Splines Transforms Target Landmarks Source Landmarks Interpolated Values Displacement Vectors
Kernel Spline Transforms Thin Plates Thin Plates R2 log R Elastic Body Elastic Body Reciprocal Volume
Kernel Spline Transforms InsightApplications / ThinPlateSplines
Resampling: Kernel Spline Transform #include "itkImage.h" #include "itkResampleImageFilter.h" #include "itkLinearInterpolateImageFunction.h" #include "itkElasticBodySplineKernelTransform.h" typedef itk::Image< char, 2 > ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::LinearInterpolateImageFunction< ImageType, double > InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); typedef itk::ResampleImageFilter< ImageType, ImageType > FilterType; FilterType::Pointer resampler = FilterType::New();
Resampling: Kernel Spline Transform typedef itk::ElasticBodySplineKernelTransform< double, 2 > TransformType; TransformType::Pointer transform = TransformType::New(); resampler->SetInterpolator( interpolator ); resampler->SetInput( movingImage ); ImageType::RegionType region = fixedImage->GetBufferedRegion(); resampler->SetSize( region->GetSize() ); resampler->SetOutputStartIndex( region->GetIndex() ); resampler->SetOutputSpacing( fixedImage->GetSpacing() ); resampler->SetOutputOrigin( fixedImage->GetOrigin() );
Resampling: Kernel Spline Transform resampler->SetTransform( transform ); typedef TransformType::PointSetType PointSetType; PointSetType::Pointer sourceLandmarks = PointSetType::New(); PointSetType::Pointer targetLandmarks = PointSetType::New(); transform->SetSourceLandmarks( sourceLandmarks ); transform->SetTargetLandmarks( targetLandmarks ); typedef PointSetType::PointsContainer PointsContainer; PointsContainer::Pointer sources = sourceLandmarks->GetPoints(); PointsContainer::Pointer targets = targetLandmarks->GetPoints();
Resampling: Kernel Spline Transform sources->Reserve( numberOfLandmarks ); targets->Reserve( numberOfLandmarks ); typedef PointSetType::PointType PointType; PointType source; PointType target; for( int i = 0; i < numberOfLandmarks; i++ ) { inputFile >> source; inputFile >> target; sources->InsertElement( i, source ); targets->InsertElement( i, target ); } transform->ComputeWMatrix(); resampler->Update(); // Finally !! ImageType::ConstPointer deformedImage = resampler->GetOutput();
Kernel Spline Transforms VolView : ITK Plugin
Kernel Spline Transforms VolView : ITK Plugin
Deformable Transforms Deformation Fields
Deformation Vector Field ParaView: http://www.paraview.org
Warp Image Filter #include "itkImage.h" #include "itkWarpImageFilter.h" #include "itkLinearInterpolateImageFunction.h" typedef itk::Image< char, 2 > ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::LinearInterpolateImageFunction< ImageType, double > InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); typedef itk::Vector< float, 2 > VectorType; typedef itk::Image< VectorType , 2 > VectorFieldType; VectorFieldType::Pointer vectorField = GetVectorField();
Warp Image Filter typedef itk::WarpImageFilter< ImageType, VectorFieldType > WarpFilterType; WarpFilterType::Pointer warpFilter = WarpFilterType::New(); warpFilter->SetInterpolator( interpolator ); warpFilter->SetInput( movingImage ); warpFilter->SetOutputSpacing( fixedImage->GetSpacing() ); warpFilter->SetOutputOrigin( fixedImage->GetOrigin() ); warpFilter->SetDeformationField( vectorField ); warpFilter->Update(); ImageType::ConstPointer deformedImage = warpFilter->GetOutput();
Demons Registration Demons Registration
Demons is a Family of Algorithms Demons Registration Demons is a Family of Algorithms
Demons Registration Demons Type 0
Demons Registration: Type 0 Transform Scene Model
Demons Registration: Type 0 Transform Scene Gradients Model
Demons Registration: Type 0 Transform Scene Forces Model
Demons Registration Demons Type 1
Demons Registration: Type 1 Transform Scene Vector Field Model
Demons Registration: Type 1 Transform Scene Vector Field Model
Demons Registration: Type 1 Transform Scene Vector Field Model
Demons Registration: Type 1 Transform Scene Vector Field Model
Demons Registration: Type 1 Gradient Scene
Demons Registration: Type 1 Current Estimation Intensity Space Gradient Desired Displacement Scene
Demons Registration: Type 1 Transform Scene Vector Field Model
Demons Registration: Type 1 Scene
Demons Registration: Type 1 Iterations Incremental Field Next Field Previous Field Gaussian Smoothing
Demons Registration: Type 1 ( s – m ) . Grad(s) V = Grad(s)2 ( s – m ) . Grad(s) V = Grad(s)2 + (s-m)2 K
Image Registration Framework Fixed Image Increment Computation PDE Solver Moving Image Interpolator Deformation Field Transform
Demons Registration: Type 1 #include "itkImage.h" #include "itkDemonsRegistrationFilter.h" typedef itk::Image< char, 2 > ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::Vector< float, 2 > VectorType; typedef itk::Image< VectorType , 2 > VectorFieldType; typedef itk::DemonsRegistrationFilter< ImageType, VectorFieldType > DemonsType; DemonsType::Pointer demons = DemonsType::New();
Demons Registration: Type 1 demons->SetFixedImage( fixedImage ); demons->SetMovingImage( movingImage ); demons->SetNumberOfIterations( 200 ); demons->SetStandardDeviations( 1.0 ); demons->Update(); ImageType::ConstPointer vectorField = demons->GetOutput();
Demons Registration: Type 1 Scene
Demons Registration: Type 1 Model
Demons Registration: Type 1 After Registration
Demons Registration: Type 1 Scene
Demons Registration: Type 1 Scene
Fixed and Moving images should have the same intensity distribution ! Requirements Fixed and Moving images should have the same intensity distribution !
Eventual Preprocessing - Histogram Matching Filter - Anisotropic Diffusion Filtering
Image Registration Framework Fixed Image Increment Computation PDE Solver Moving Image Interpolator Deformation Field Transform Resampler Moving Registered
Enjoy ITK !