00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
#ifndef _itkFEMRegistrationFilter_h_
00019
#define _itkFEMRegistrationFilter_h_
00020
00021
#include "itkFEMLinearSystemWrapperItpack.h"
00022
#include "itkFEMLinearSystemWrapperDenseVNL.h"
00023
#include "itkFEMGenerateMesh.h"
00024
#include "itkFEMSolverCrankNicolson.h"
00025
#include "itkFEMMaterialLinearElasticity.h"
00026
#include "itkFEMImageMetricLoad.h"
00027
#include "itkFEMFiniteDifferenceFunctionLoad.h"
00028
00029
#include "itkImage.h"
00030
#include "itkVector.h"
00031
#include "itkImageRegionIteratorWithIndex.h"
00032
#include "itkVectorCastImageFilter.h"
00033
#include "itkVectorIndexSelectionCastImageFilter.h"
00034
#include "itkWarpImageFilter.h"
00035
#include "itkImageToImageMetric.h"
00036
#include "itkTranslationTransform.h"
00037
#include "itkVectorExpandImageFilter.h"
00038
00039
#include "itkRecursiveMultiResolutionPyramidImageFilter.h"
00040
#include "itkFEMLoadLandmark.h"
00041
00042
#include "vnl/vnl_vector.h"
00043
#include "vnl/vnl_math.h"
00044
#include "vnl/vnl_vector_fixed.h"
00045
00046
00047
#include <iostream>
00048
#include <string>
00049
00050
00051
00052
namespace itk {
00053
namespace fem {
00054
00101
template<
class TMovingImage,
class TFixedImage>
00102 class ITK_EXPORT FEMRegistrationFilter :
public ImageToImageFilter<TMovingImage, TFixedImage>
00103 {
00104
public:
00105 typedef FEMRegistrationFilter
Self;
00106 typedef ImageToImageFilter<TMovingImage, TFixedImage> Superclass;
00107 typedef SmartPointer<Self> Pointer;
00108 typedef SmartPointer<const Self> ConstPointer;
00109
00111
itkNewMacro(
Self);
00112
00114
itkTypeMacro(FEMRegistrationFilter,
ImageToImageFilter );
00115
00116 typedef TMovingImage
MovingImageType;
00117 typedef TFixedImage
FixedImageType;
00118 typedef typename FixedImageType::PixelType
PixelType;
00119 typedef typename FixedImageType::SizeType
ImageSizeType;
00120
00122
itkStaticConstMacro(ImageDimension,
unsigned int,
00123 FixedImageType::ImageDimension);
00124
00125 typedef Image< float, itkGetStaticConstMacro(ImageDimension) > FloatImageType;
00126 typedef LinearSystemWrapperItpack LinearSystemSolverType;
00127 typedef SolverCrankNicolson
SolverType;
00128 enum Sign { positive = 1, negative = -1 };
00129 typedef double Float;
00130 typedef Load::ArrayType LoadArray;
00131
00132
00133 typedef std::vector<typename LoadLandmark::Pointer>
LandmarkArrayType;
00134 typedef itk::Vector<float,itkGetStaticConstMacro(ImageDimension)> VectorType;
00135 typedef itk::Image<VectorType,itkGetStaticConstMacro(ImageDimension)> FieldType;
00136 typedef itk::WarpImageFilter<MovingImageType,FixedImageType, FieldType> WarperType;
00137 typedef MaterialLinearElasticity MaterialType;
00138 typedef itk::ImageRegionIteratorWithIndex<FixedImageType> ImageIterator;
00139 typedef itk::ImageRegionIteratorWithIndex<FloatImageType> FloatImageIterator;
00140 typedef itk::ImageRegionIteratorWithIndex<FieldType> FieldIterator;
00141 typedef itk::VectorIndexSelectionCastImageFilter<FieldType,FloatImageType> IndexSelectCasterType;
00142
00143
00145 typedef double CoordRepType;
00146
typedef VectorInterpolateImageFunction<FieldType,CoordRepType>
00147 InterpolatorType;
00148 typedef typename InterpolatorType::Pointer
InterpolatorPointer;
00149
typedef VectorLinearInterpolateImageFunction<FieldType,CoordRepType>
00150 DefaultInterpolatorType;
00151
00153
itkSetObjectMacro( Interpolator,
InterpolatorType );
00154
00156
itkGetObjectMacro( Interpolator,
InterpolatorType );
00157
00158
00159 typedef itk::VectorExpandImageFilter<FieldType,FieldType> ExpanderType;
00160 typedef typename ExpanderType::ExpandFactorsType
ExpandFactorsType;
00161
00162
typedef itk::RecursiveMultiResolutionPyramidImageFilter<FixedImageType,FixedImageType>
00163 FixedPyramidType;
00164
00166
00167
#ifdef USEIMAGEMETRIC
00168
typedef ImageToImageMetric<ImageType,FixedImageType> MetricBaseType;
00169
typedef ImageMetricLoad<ImageType,ImageType> ImageMetricLoadType;
00170
#else
00171 typedef FiniteDifferenceFunctionLoad<MovingImageType,FixedImageType> ImageMetricLoadType;
00172 typedef PDEDeformableRegistrationFunction<FixedImageType,MovingImageType,FieldType> MetricBaseType;
00173
#endif
00174 typedef typename MetricBaseType::Pointer
MetricBaseTypePointer;
00175
00176
00178
bool ReadConfigFile(
const char*);
00179
00180
00182
void RunRegistration();
00183
00187
void WriteWarpedImage(
const char* fn);
00188
00189
00191
void IterativeSolve(
SolverType& S);
00192
00194
void MultiResSolve();
00195
00197
void WarpImage(
const MovingImageType * R);
00198
00200
int WriteDisplacementField(
unsigned int index);
00201
00203 void SetMovingFile(
const char* r) {m_MovingFileName=r;}
00204
00205 std::string GetMovingFile() {
return m_MovingFileName;}
00206
00207 void SetFixedFile(
const char* t) {m_FixedFileName=t;}
00208
00209 std::string GetFixedFile() {
return m_FixedFileName;}
00210
00211
00215
void SetMovingImage(MovingImageType* R);
00216
00218
void SetFixedImage(FixedImageType* T);
00219
00220 MovingImageType* GetMovingImage(){
return m_MovingImage;}
00221 MovingImageType* GetOriginalMovingImage(){
return m_OriginalMovingImage;}
00222
00223 FixedImageType* GetFixedImage(){
return m_FixedImage;}
00224
00225
00228 FixedImageType* GetWarpedImage(){
return m_WarpedImage;}
00229
00231
void ComputeJacobian(
float sign=1.0, FieldType* field=NULL ,
float smooth=0.0);
00232
00234 FloatImageType* GetJacobianImage(){
return m_FloatImage;}
00235
00236
00238 FieldType* GetDeformationField(){
return m_Field;}
00240
void SetDeformationField(FieldType* F)
00241 {
00242 m_FieldSize=F->GetLargestPossibleRegion().GetSize();
00243 m_Field=F;
00244 }
00245
00248
void SetLandmarkFile(
const char* l) {m_LandmarkFileName=l; }
00249
00251
void UseLandmarks(
bool b) {m_UseLandmarks=b;}
00252
00253
00261
void EnforceDiffeomorphism(
float thresh ,
SolverType& S ,
bool onlywriteimages);
00262
00263
00268
void SetResultsFile(
const char* r) {m_ResultsFileName=r;}
00269
00270 void SetResultsFileName (
const char* f){m_ResultsFileName=f;}
00271
00272 std::string GetResultsFileName () {
return m_ResultsFileName;}
00273
00275
void SetDisplacementsFile(
const char* r) {m_DisplacementsFileName=r;}
00276
00283
void SetMeshPixelsPerElementAtEachResolution(
unsigned int i,
unsigned int which=0){ m_MeshPixelsPerElementAtEachResolution[which]=i;}
00284
00288
void SetNumberOfIntegrationPoints(
unsigned int i,
unsigned int which=0){ m_NumberOfIntegrationPoints[which]=i;}
00289
00295
void SetWidthOfMetricRegion(
unsigned int i,
unsigned int which=0) { m_MetricWidth[which]=i;}
00296
unsigned int GetWidthOfMetricRegion(
unsigned int which=0) {
return m_MetricWidth[which];}
00297
00302
void SetMaximumIterations(
unsigned int i,
unsigned int which) { m_Maxiters[which]=i;}
00303
00306 void SetTimeStep(
Float i) { m_dT=i;}
00307
00309
void SetAlpha(Float a) { m_Alpha=a;}
00310
00313 void SetEnergyReductionFactor(
Float i) { m_EnergyReductionFactor=i;}
00314
00316
void SetElasticity(Float i,
unsigned int which=0) { m_E[which]=i;}
00317
00319
Float GetElasticity(
unsigned int which=0) {
return m_E[which];}
00320
00322
void SetRho(
Float r,
unsigned int which=0) { m_Rho[which]=r;}
00323
00325
void SetGamma(
Float r,
unsigned int which=0) { m_Gamma[which]=r;}
00326
00328
void SetDescentDirectionMinimize() { m_DescentDirection=positive;}
00329
00331
void SetDescentDirectionMaximize() { m_DescentDirection=negative;}
00332
00334
void DoLineSearch(
unsigned int b) { m_DoLineSearchOnImageEnergy=b; }
00335
00336
00338 void DoMultiRes(
bool b) { m_DoMultiRes=b; }
00339
00341
void EmployRegridding(
unsigned int b) { m_EmployRegridding=b; }
00342
00344
void SetLineSearchMaximumIterations(
unsigned int f) { m_LineSearchMaximumIterations=f; }
00345
00347
void SetWriteDisplacements(
bool b) {m_WriteDisplacementField=b;}
00348
00350
bool GetWriteDisplacements() {
return m_WriteDisplacementField;}
00351
00354 void SetConfigFileName (
const char* f){m_ConfigFileName=f;}
00355
00356 std::string GetConfigFileName () {
return m_ConfigFileName; }
00357
00358 ImageSizeType GetImageSize(){
return m_FullImageSize; }
00359
00361 MetricBaseTypePointer GetMetric() {
return m_Metric; }
00362 void SetMetric(
MetricBaseTypePointer MP) { m_Metric=MP; }
00363
00366 void ChooseMetric(
float whichmetric);
00367
00369
void SetElement(
Element::Pointer e) {m_Element=e;}
00370
00372
void SetMaterial(MaterialType::Pointer m) {m_Material=m;}
00373
00374 void PrintVectorField(
unsigned int modnum=1000);
00375
00376
void SetNumLevels(
unsigned int i) { m_NumLevels=i; }
00377 void SetMaxLevel(
unsigned int i) { m_MaxLevel=i; }
00378
00379
void SetTemp(Float i) { m_Temp=i; }
00380
00382 FEMRegistrationFilter( );
00383 ~FEMRegistrationFilter();
00384
00385
00386
protected :
00387
00388
00393
class FEMOF :
public FEMObjectFactory<FEMLightObject>{
00394
protected:
00395
FEMOF();
00396 ~
FEMOF();
00397 };
00398
00399
00401
void CreateMesh(
double ElementsPerSide,
Solver& S,
ImageSizeType sz);
00402
00404
void ApplyLoads(
SolverType& S,
ImageSizeType Isz,
double* spacing=NULL);
00405
00407
void ApplyImageLoads(
SolverType& S,
MovingImageType* i1,
FixedImageType* i2);
00408
00409
00412
void CreateLinearSystemSolver();
00413
00414
00416
Float EvaluateEnergy();
00417
00422
void InterpolateVectorField(
SolverType& S);
00423
00426
FloatImageType* GetMetricImage(
FieldType* F);
00427
00428
00430
typedef typename FieldType::Pointer
FieldPointer;
00431
FieldPointer ExpandVectorField(
ExpandFactorsType* expandFactors,
FieldType* f);
00432
00433
00435
void SampleVectorFieldAtNodes(
SolverType& S);
00436
00437 Float EvaluateResidual(
SolverType& mySolver,
Float t);
00438
00439
00440
void FindBracketingTriplet(
SolverType& mySolver,
Float* a,
Float* b,
Float* c);
00441
00445
Float GoldenSection(
SolverType& mySolver,
Float tol=0.01,
unsigned int MaxIters=25);
00446
00448
00449
itkGetMacro(
Load,
ImageMetricLoadType* );
00450
00451
00452
void PrintSelf(std::ostream& os,
Indent indent)
const;
00453
00454
private :
00455
00456
void InitializeField();
00457
00458 FEMRegistrationFilter(
const Self&);
00459
void operator=(
const Self&);
00460
00461 std::string m_ConfigFileName;
00462 std::string m_ResultsFileName;
00463 std::string m_MovingFileName;
00464 std::string m_FixedFileName;
00465 std::string m_LandmarkFileName;
00466 std::string m_DisplacementsFileName;
00467 std::string m_MeshFileName;
00468
00469
unsigned int m_DoLineSearchOnImageEnergy;
00470
unsigned int m_LineSearchMaximumIterations;
00471
00472
vnl_vector<unsigned int> m_NumberOfIntegrationPoints;
00473
vnl_vector<unsigned int> m_MetricWidth;
00474
vnl_vector<unsigned int> m_Maxiters;
00475
unsigned int m_TotalIterations;
00476
unsigned int m_NumLevels;
00477
unsigned int m_MaxLevel;
00478
unsigned int m_MeshLevels;
00479
unsigned int m_MeshStep;
00480
unsigned int m_FileCount;
00481
unsigned int m_CurrentLevel;
00482
typename FixedImageType::SizeType m_CurrentLevelImageSize;
00483
unsigned int m_WhichMetric;
00484
00487
vnl_vector<unsigned int> m_MeshPixelsPerElementAtEachResolution;
00488
00489
Float m_dT;
00490
vnl_vector<Float> m_E;
00491
vnl_vector<Float> m_Rho;
00492
vnl_vector<Float> m_Gamma;
00493
Float m_Energy;
00494
Float m_MinE;
00495
Float m_MinJacobian;
00496
Float m_Alpha;
00498
Float m_EnergyReductionFactor;
00499
Float m_Temp;
00500
00501
bool m_WriteDisplacementField;
00502
bool m_DoMultiRes;
00503
bool m_UseLandmarks;
00504
bool m_ReadMeshFile;
00505
bool m_UseMassMatrix;
00506
unsigned int m_EmployRegridding;
00507 Sign m_DescentDirection;
00508
00509
ImageSizeType m_FullImageSize;
00510
ImageSizeType m_ImageOrigin;
00512
ImageSizeType m_ImageScaling;
00513
ImageSizeType m_CurrentImageScaling;
00514
typename FieldType::RegionType m_FieldRegion;
00515
typename FieldType::SizeType m_FieldSize;
00516
typename FieldType::Pointer m_Field;
00517
00518
typename FieldType::Pointer m_TotalField;
00519
ImageMetricLoadType* m_Load;
00520
00521
00522
typename WarperType::Pointer m_Warper;
00523
00524
00525
typename FixedImageType::Pointer m_WarpedImage;
00526
typename FloatImageType::Pointer m_FloatImage;
00527
typename FixedImageType::RegionType m_Wregion;
00528
typename FixedImageType::IndexType m_Windex;
00529
00530
00531
typename MovingImageType::Pointer m_MovingImage;
00532
typename MovingImageType::Pointer m_OriginalMovingImage;
00533
typename FixedImageType::Pointer m_FixedImage;
00534
00535
00536
typename Element::Pointer m_Element;
00537
typename MaterialType::Pointer m_Material;
00538
MetricBaseTypePointer m_Metric;
00539
00540
00541
00542
00543
00544
00545
LandmarkArrayType m_LandmarkArray;
00546
00547
InterpolatorPointer m_Interpolator;
00548
00549
00550
00551 };
00552
00553 }}
00554
00555
#ifndef ITK_MANUAL_INSTANTIATION
00556
#include "itkFEMRegistrationFilter.txx"
00557
#endif
00558
00559
#endif
00560