CSci 6971: Image Registration Lecture 20: Demons Registration April 16, 2004 Prof. Chuck Stewart, RPI Dr. Luis Ibanez, Kitware Prof. Chuck Stewart, RPI Dr. Luis Ibanez, Kitware
Image RegistrationLecture 20 2 Deformable Registration
Image RegistrationLecture 20 3 Deformable Transforms
Image RegistrationLecture 20 4 Deformable Transformation y Fixed Image Transform x y Moving Image x
Image RegistrationLecture 20 5 Deformable Transformation y Fixed Image Transform x y Moving Image x
Image RegistrationLecture 20 6 Deformable Transformation y Fixed Image Transform x y Moving Image x
Image RegistrationLecture 20 7 Image Resampling Fixed Image Moving Image Transform Interpolator Resample Image Filter Deformed Image
Image RegistrationLecture 20 8 Image Resampling Fixed Image Moving Image Transform Interpolator Resample Image Filter Deformed Image High Order Polynomials Orthogonal Basis Splines Explicit Vector Field
Image RegistrationLecture 20 9 Kernel Splines Transforms Source Landmarks Target Landmarks Displacement Vectors Interpolated Values
Image RegistrationLecture Kernel Spline Transforms Thin Plates Thin Plates R 2 log R Elastic Body Elastic Body Reciprocal Volume
Image RegistrationLecture Kernel Spline Transforms InsightApplications / ThinPlateSplines
Image RegistrationLecture Resampling: Kernel Spline Transform #include "itkImage.h" #include "itkResampleImageFilter.h" #include "itkLinearInterpolateImageFunction.h" #include "itkElasticBodySplineKernelTransform.h" typedef itk::Image ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::LinearInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); typedef itk::ResampleImageFilter< ImageType, ImageType > FilterType; FilterType::Pointer resampler = FilterType::New();
Image RegistrationLecture Resampling: Kernel Spline Transform typedef itk::ElasticBodySplineKernelTransform 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() );
Image RegistrationLecture 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();
Image RegistrationLecture 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();
Image RegistrationLecture Kernel Spline Transforms VolView : ITK Plugin
Image RegistrationLecture Kernel Spline Transforms VolView : ITK Plugin
Image RegistrationLecture Deformable Transforms Deformation Fields
Image RegistrationLecture Deformation Vector Field ParaView:
Image RegistrationLecture Warp Image Filter #include "itkImage.h" #include "itkWarpImageFilter.h" #include "itkLinearInterpolateImageFunction.h" typedef itk::Image ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::LinearInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); typedef itk::Vector VectorType; typedef itk::Image VectorFieldType; VectorFieldType::Pointer vectorField = GetVectorField();
Image RegistrationLecture 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();
Image RegistrationLecture Demons Registration
Image RegistrationLecture Demons Registration Demons is a Family of Algorithms
Image RegistrationLecture Demons Registration Demons Type 0
Image RegistrationLecture Demons Registration: Type 0 Scene Model Transform
Image RegistrationLecture Demons Registration: Type 0 Scene Model Transform Gradients
Image RegistrationLecture Demons Registration: Type 0 Scene Model Transform Forces
Image RegistrationLecture Demons Registration Demons Type 1
Image RegistrationLecture Demons Registration: Type 1 SceneModel Transform Vector Field
Image RegistrationLecture Demons Registration: Type 1 SceneModel Transform Vector Field
Image RegistrationLecture Demons Registration: Type 1 SceneModel Transform Vector Field
Image RegistrationLecture Demons Registration: Type 1 SceneModel Transform Vector Field
Image RegistrationLecture Demons Registration: Type 1 Scene Gradient
Image RegistrationLecture Demons Registration: Type 1 Scene Gradient Intensity Space Desired Displacement Current Estimation
Image RegistrationLecture Demons Registration: Type 1 SceneModel Transform Vector Field
Image RegistrationLecture Demons Registration: Type 1 Scene
Image RegistrationLecture Demons Registration: Type 1 Previous Field Incremental Field Next Field Iterations Gaussian Smoothin g
Image RegistrationLecture 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 RegistrationLecture Image Registration Framework Fixed Image Moving Image Increment Computation Transform Interpolator PDE Solver Deformation Field
Image RegistrationLecture Demons Registration: Type 1 #include "itkImage.h" #include "itkDemonsRegistrationFilter.h" typedef itk::Image ImageType; ImageType::ConstPointer fixedImage = GetFixedImage(); ImageType::ConstPointer movingImage = GetMovingImage(); typedef itk::Vector VectorType; typedef itk::Image VectorFieldType; typedef itk::DemonsRegistrationFilter< ImageType, VectorFieldType > DemonsType; DemonsType::Pointer demons = DemonsType::New();
Image RegistrationLecture Demons Registration: Type 1 demons->SetFixedImage( fixedImage ); demons->SetMovingImage( movingImage ); demons->SetNumberOfIterations( 200 ); demons->SetStandardDeviations( 1.0 ); demons->Update(); ImageType::ConstPointer vectorField = demons->GetOutput();
Image RegistrationLecture Demons Registration: Type 1 Scene
Image RegistrationLecture Demons Registration: Type 1 Model
Image RegistrationLecture Demons Registration: Type 1 After Registration
Image RegistrationLecture Demons Registration: Type 1 Scene
Image RegistrationLecture Demons Registration: Type 1 Scene
Image RegistrationLecture Requirements Fixed and Moving images should have the same intensity distribution !
Image RegistrationLecture Eventual Preprocessing - Histogram Matching Filter - Anisotropic Diffusion Filtering
Image RegistrationLecture Image Registration Framework Fixed Image Moving Image Increment Computation Transform Interpolator PDE Solver Resampler Moving Registered Deformation Field
Image RegistrationLecture End Enjoy ITK !