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
int WriteDisplacementFieldMultiComponent();
00204
00206 void SetMovingFile(
const char* r) {m_MovingFileName=r;}
00207
00208 std::string GetMovingFile() {
return m_MovingFileName;}
00209
00210 void SetFixedFile(
const char* t) {m_FixedFileName=t;}
00211
00212 std::string GetFixedFile() {
return m_FixedFileName;}
00213
00214
00218
void SetMovingImage(MovingImageType* R);
00219
00221
void SetFixedImage(FixedImageType* T);
00222
00223 MovingImageType* GetMovingImage(){
return m_MovingImage;}
00224 MovingImageType* GetOriginalMovingImage(){
return m_OriginalMovingImage;}
00225
00226 FixedImageType* GetFixedImage(){
return m_FixedImage;}
00227
00228
00231 FixedImageType* GetWarpedImage(){
return m_WarpedImage;}
00232
00234
void ComputeJacobian(
float sign=1.0, FieldType* field=NULL ,
float smooth=0.0);
00235
00237 FloatImageType* GetJacobianImage(){
return m_FloatImage;}
00238
00239
00241 FieldType* GetDeformationField(){
return m_Field;}
00243
void SetDeformationField(FieldType* F)
00244 {
00245 m_FieldSize=F->GetLargestPossibleRegion().GetSize();
00246 m_Field=F;
00247 }
00248
00251
void SetLandmarkFile(
const char* l) {m_LandmarkFileName=l; }
00252
00254
void UseLandmarks(
bool b) {m_UseLandmarks=b;}
00255
00256
00264
void EnforceDiffeomorphism(
float thresh ,
SolverType& S ,
bool onlywriteimages);
00265
00266
00271
void SetResultsFile(
const char* r) {m_ResultsFileName=r;}
00272
00273 void SetResultsFileName (
const char* f){m_ResultsFileName=f;}
00274
00275 std::string GetResultsFileName () {
return m_ResultsFileName;}
00276
00278
void SetDisplacementsFile(
const char* r) {m_DisplacementsFileName=r;}
00279
00286
void SetMeshPixelsPerElementAtEachResolution(
unsigned int i,
unsigned int which=0){ m_MeshPixelsPerElementAtEachResolution[which]=i;}
00287
00291
void SetNumberOfIntegrationPoints(
unsigned int i,
unsigned int which=0){ m_NumberOfIntegrationPoints[which]=i;}
00292
00298
void SetWidthOfMetricRegion(
unsigned int i,
unsigned int which=0) { m_MetricWidth[which]=i;}
00299
unsigned int GetWidthOfMetricRegion(
unsigned int which=0) {
return m_MetricWidth[which];}
00300
00305
void SetMaximumIterations(
unsigned int i,
unsigned int which) { m_Maxiters[which]=i;}
00306
00309 void SetTimeStep(
Float i) { m_dT=i;}
00310
00312
void SetAlpha(Float a) { m_Alpha=a;}
00313
00316 void SetEnergyReductionFactor(
Float i) { m_EnergyReductionFactor=i;}
00317
00319
void SetElasticity(Float i,
unsigned int which=0) { m_E[which]=i;}
00320
00322
Float GetElasticity(
unsigned int which=0) {
return m_E[which];}
00323
00325
void SetRho(
Float r,
unsigned int which=0) { m_Rho[which]=r;}
00326
00328
void SetGamma(
Float r,
unsigned int which=0) { m_Gamma[which]=r;}
00329
00331
void SetDescentDirectionMinimize() { m_DescentDirection=positive;}
00332
00334
void SetDescentDirectionMaximize() { m_DescentDirection=negative;}
00335
00337
void DoLineSearch(
unsigned int b) { m_DoLineSearchOnImageEnergy=b; }
00338
00339
00341 void DoMultiRes(
bool b) { m_DoMultiRes=b; }
00342
00344
void EmployRegridding(
unsigned int b) { m_EmployRegridding=b; }
00345
00347
void SetLineSearchMaximumIterations(
unsigned int f) { m_LineSearchMaximumIterations=f; }
00348
00350
void SetWriteDisplacements(
bool b) {m_WriteDisplacementField=b;}
00351
00353
bool GetWriteDisplacements() {
return m_WriteDisplacementField;}
00354
00357 void SetConfigFileName (
const char* f){m_ConfigFileName=f;}
00358
00359 std::string GetConfigFileName () {
return m_ConfigFileName; }
00360
00361 ImageSizeType GetImageSize(){
return m_FullImageSize; }
00362
00364 MetricBaseTypePointer GetMetric() {
return m_Metric; }
00365 void SetMetric(
MetricBaseTypePointer MP) { m_Metric=MP; }
00366
00369 void ChooseMetric(
float whichmetric);
00370
00372
void SetElement(
Element::Pointer e) {m_Element=e;}
00373
00375
void SetMaterial(MaterialType::Pointer m) {m_Material=m;}
00376
00377 void PrintVectorField(
unsigned int modnum=1000);
00378
00379
void SetNumLevels(
unsigned int i) { m_NumLevels=i; }
00380 void SetMaxLevel(
unsigned int i) { m_MaxLevel=i; }
00381
00382
void SetTemp(Float i) { m_Temp=i; }
00383
00385 FEMRegistrationFilter( );
00386 ~FEMRegistrationFilter();
00387
00388
00389
protected :
00390
00391
00396
class FEMOF :
public FEMObjectFactory<FEMLightObject>{
00397
protected:
00398
FEMOF();
00399 ~
FEMOF();
00400 };
00401
00402
00404
void CreateMesh(
double ElementsPerSide,
Solver& S,
ImageSizeType sz);
00405
00407
void ApplyLoads(
SolverType& S,
ImageSizeType Isz,
double* spacing=NULL);
00408
00410
void ApplyImageLoads(
SolverType& S,
MovingImageType* i1,
FixedImageType* i2);
00411
00412
00415
void CreateLinearSystemSolver();
00416
00417
00419
Float EvaluateEnergy();
00420
00425
void InterpolateVectorField(
SolverType& S);
00426
00429
FloatImageType* GetMetricImage(
FieldType* F);
00430
00431
00433
typedef typename FieldType::Pointer
FieldPointer;
00434
FieldPointer ExpandVectorField(
ExpandFactorsType* expandFactors,
FieldType* f);
00435
00436
00438
void SampleVectorFieldAtNodes(
SolverType& S);
00439
00440 Float EvaluateResidual(
SolverType& mySolver,
Float t);
00441
00442
00443
void FindBracketingTriplet(
SolverType& mySolver,
Float* a,
Float* b,
Float* c);
00444
00448
Float GoldenSection(
SolverType& mySolver,
Float tol=0.01,
unsigned int MaxIters=25);
00449
00451
00452
itkGetMacro(
Load,
ImageMetricLoadType* );
00453
00454
00455
void PrintSelf(std::ostream& os,
Indent indent)
const;
00456
00457
private :
00458
00459
void InitializeField();
00460
00461 FEMRegistrationFilter(
const Self&);
00462
void operator=(
const Self&);
00463
00464 std::string m_ConfigFileName;
00465 std::string m_ResultsFileName;
00466 std::string m_MovingFileName;
00467 std::string m_FixedFileName;
00468 std::string m_LandmarkFileName;
00469 std::string m_DisplacementsFileName;
00470 std::string m_MeshFileName;
00471
00472
unsigned int m_DoLineSearchOnImageEnergy;
00473
unsigned int m_LineSearchMaximumIterations;
00474
00475
vnl_vector<unsigned int> m_NumberOfIntegrationPoints;
00476
vnl_vector<unsigned int> m_MetricWidth;
00477
vnl_vector<unsigned int> m_Maxiters;
00478
unsigned int m_TotalIterations;
00479
unsigned int m_NumLevels;
00480
unsigned int m_MaxLevel;
00481
unsigned int m_MeshLevels;
00482
unsigned int m_MeshStep;
00483
unsigned int m_FileCount;
00484
unsigned int m_CurrentLevel;
00485
typename FixedImageType::SizeType m_CurrentLevelImageSize;
00486
unsigned int m_WhichMetric;
00487
00490
vnl_vector<unsigned int> m_MeshPixelsPerElementAtEachResolution;
00491
00492
Float m_dT;
00493
vnl_vector<Float> m_E;
00494
vnl_vector<Float> m_Rho;
00495
vnl_vector<Float> m_Gamma;
00496
Float m_Energy;
00497
Float m_MinE;
00498
Float m_MinJacobian;
00499
Float m_Alpha;
00501
Float m_EnergyReductionFactor;
00502
Float m_Temp;
00503
00504
bool m_WriteDisplacementField;
00505
bool m_DoMultiRes;
00506
bool m_UseLandmarks;
00507
bool m_ReadMeshFile;
00508
bool m_UseMassMatrix;
00509
unsigned int m_EmployRegridding;
00510 Sign m_DescentDirection;
00511
00512
ImageSizeType m_FullImageSize;
00513
ImageSizeType m_ImageOrigin;
00515
ImageSizeType m_ImageScaling;
00516
ImageSizeType m_CurrentImageScaling;
00517
typename FieldType::RegionType m_FieldRegion;
00518
typename FieldType::SizeType m_FieldSize;
00519
typename FieldType::Pointer m_Field;
00520
00521
typename FieldType::Pointer m_TotalField;
00522
ImageMetricLoadType* m_Load;
00523
00524
00525
typename WarperType::Pointer m_Warper;
00526
00527
00528
typename FixedImageType::Pointer m_WarpedImage;
00529
typename FloatImageType::Pointer m_FloatImage;
00530
typename FixedImageType::RegionType m_Wregion;
00531
typename FixedImageType::IndexType m_Windex;
00532
00533
00534
typename MovingImageType::Pointer m_MovingImage;
00535
typename MovingImageType::Pointer m_OriginalMovingImage;
00536
typename FixedImageType::Pointer m_FixedImage;
00537
00538
00539
typename Element::Pointer m_Element;
00540
typename MaterialType::Pointer m_Material;
00541
MetricBaseTypePointer m_Metric;
00542
00543
00544
00545
00546
00547
00548
LandmarkArrayType m_LandmarkArray;
00549
00550
InterpolatorPointer m_Interpolator;
00551
00552
00553
00554 };
00555
00556 }}
00557
00558
#ifndef ITK_MANUAL_INSTANTIATION
00559
#include "itkFEMRegistrationFilter.txx"
00560
#endif
00561
00562
#endif
00563