580 likes | 1.31k Views
ITK Deformable Registration. Demons Methods. Deformable Registration. Deformable Registration. Deformable Transforms. Deformable Transforms. Deformable Transformation. y. y. Transform. x. x. Fixed Image. Moving Image. Deformable Transformation. y. y. Transform. x. x.
E N D
ITK Deformable Registration Demons Methods
Deformable Registration Deformable Registration
Deformable Transforms 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 FixedImage Resample Image Filter MovingImage DeformedImage Transform
Image Resampling Interpolator FixedImage Resample Image Filter MovingImage High Order Polynomials Splines Explicit Vector Field Orthogonal Basis DeformedImage 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::RegionTyperegion = 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::PointersourceLandmarks = PointSetType::New(); PointSetType::PointertargetLandmarks = 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; PointTypesource; PointTypetarget; 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::PointervectorField = GetVectorField();
Warp Image Filter typedef 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 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
Incremental Field Next Field Demons Registration: Type 1 Iterations 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 FixedImage Increment Computation PDE Solver MovingImage Interpolator DeformationField 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, 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 After Registration
Requirements Fixed and Moving images should have the same intensity distribution !
Eventual Preprocessing - Histogram Matching Filter- Anisotropic Diffusion Filtering
Image Registration Framework FixedImage Increment Computation PDE Solver MovingImage Interpolator DeformationField Transform Resampler MovingRegistered