itk deformable registration demons methods. deformable registration
TRANSCRIPT
ITK Deformable Registration
DemonsMethods
Deformable Registration
Deformable Registration
Deformable Transforms
Deformable Transforms
Deformable Transformation
y
Fixed Image
Transform
x
y
Moving Image
x
Deformable Transformation
y
Fixed Image
Transform
x
y
Moving Image
x
Deformable Transformation
y
Fixed Image
Transform
x
y
Moving Image
x
Image Resampling
FixedImage
MovingImage
Transform
Interpolator
ResampleImageFilter
DeformedImage
Image Resampling
FixedImage
MovingImage
Transform
Interpolator
ResampleImageFilter
DeformedImage
High OrderPolynomialsOrthogonal
BasisSplines
Explicit VectorField
Kernel Splines Transforms
SourceLandmarks
TargetLandmarks
DisplacementVectors
InterpolatedValues
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 Transformsources->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 Filtertypedef itk::WarpImageFilter< ImageType,
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 Registration
Demons is a Family
of Algorithms
Demons Registration
Demons Type 0
Demons Registration: Type 0
Scene
Model
Transform
Demons Registration: Type 0
Scene
Model
Transform
Gradients
Demons Registration: Type 0
Scene
Model
Transform
Forces
Demons Registration
Demons Type 1
Demons Registration: Type 1
Scene Model
Transform
Vector Field
Demons Registration: Type 1
Scene Model
Transform
Vector Field
Demons Registration: Type 1
Scene Model
Transform
Vector Field
Demons Registration: Type 1
Scene Model
Transform
Vector Field
Demons Registration: Type 1
Scene
Gradient
Demons Registration: Type 1
Scene
Gradient
Intensity
Space
Desired Displacement
CurrentEstimation
Demons Registration: Type 1
Scene Model
Transform
Vector Field
Demons Registration: Type 1
Scene
Demons Registration: Type 1
Previous Field Incremental Field Next Field
Iterations
GaussianSmoothing
Demons Registration: Type 1
V =( s – m ) . Grad(s)
Grad(s)2
V =( s – m ) . Grad(s)
Grad(s)2 + (s-m)2 K
Image Registration Framework
FixedImage
MovingImage
IncrementComputation
Transform
InterpolatorPDE
Solver
DeformationField
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, 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
Requirements
Fixed and Moving images should have
the same intensity distribution !
Eventual Preprocessing
- Histogram Matching Filter
- Anisotropic Diffusion Filtering
Image Registration Framework
FixedImage
MovingImage
IncrementComputation
Transform
InterpolatorPDE
Solver
Resampler
MovingRegistered
DeformationField
Enjoy ITK !