00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkKernelTransform_h
00018 #define __itkKernelTransform_h
00019
00020 #include "itkTransform.h"
00021 #include "itkPoint.h"
00022 #include "itkVector.h"
00023 #include "itkMatrix.h"
00024 #include "itkPointSet.h"
00025 #include <deque>
00026 #include <math.h>
00027 #include "vnl/vnl_matrix_fixed.h"
00028 #include "vnl/vnl_matrix.h"
00029 #include "vnl/vnl_vector.h"
00030 #include "vnl/vnl_vector_fixed.h"
00031 #include "vnl/algo/vnl_svd.h"
00032 #include "vnl/vnl_sample.h"
00033
00034 namespace itk
00035 {
00036
00062 template <class TScalarType,
00063 unsigned int NDimensions>
00064 class ITK_EXPORT KernelTransform :
00065 public Transform<TScalarType, NDimensions,NDimensions>
00066 {
00067 public:
00069 typedef KernelTransform Self;
00070 typedef Transform<TScalarType, NDimensions, NDimensions > Superclass;
00071 typedef SmartPointer<Self> Pointer;
00072 typedef SmartPointer<const Self> ConstPointer;
00073
00075 itkTypeMacro( KernelTransform, Transform );
00076
00078 itkNewMacro( Self );
00079
00081 itkStaticConstMacro(SpaceDimension, unsigned int, NDimensions);
00082
00084 typedef typename Superclass::ScalarType ScalarType;
00085
00087 typedef typename Superclass::ParametersType ParametersType;
00088
00090 typedef typename Superclass::JacobianType JacobianType;
00091
00093 typedef typename Superclass::InputPointType InputPointType;
00094 typedef typename Superclass::OutputPointType OutputPointType;
00095
00097 typedef typename Superclass::InputVectorType InputVectorType;
00098 typedef typename Superclass::OutputVectorType OutputVectorType;
00099
00102 typedef DefaultStaticMeshTraits<TScalarType,
00103 NDimensions,
00104 NDimensions,
00105 TScalarType,
00106 TScalarType> PointSetTraitsType;
00107 typedef PointSet<InputPointType, NDimensions, PointSetTraitsType> PointSetType;
00108 typedef typename PointSetType::Pointer PointSetPointer;
00109 typedef typename PointSetType::PointsContainer PointsContainer;
00110 typedef typename PointSetType::PointsContainerIterator PointsIterator;
00111 typedef typename PointSetType::PointsContainerConstIterator PointsConstIterator;
00112
00114 typedef itk::VectorContainer<unsigned long,InputVectorType> VectorSetType;
00115 typedef typename VectorSetType::Pointer VectorSetPointer;
00116
00118 itkGetObjectMacro( SourceLandmarks, PointSetType);
00119
00121 virtual void SetSourceLandmarks(PointSetType *);
00122
00124 itkGetObjectMacro( TargetLandmarks, PointSetType);
00125
00127 virtual void SetTargetLandmarks(PointSetType *);
00128
00131 itkGetObjectMacro( Displacements, VectorSetType );
00132
00134 void ComputeWMatrix(void);
00135
00137 virtual OutputPointType TransformPoint(const InputPointType& thisPoint) const;
00138
00140 typedef vnl_matrix_fixed<TScalarType, NDimensions, NDimensions> IMatrixType;
00141
00142
00144 virtual const JacobianType & GetJacobian(const InputPointType &point ) const;
00145
00150 virtual void SetParameters(const ParametersType &);
00151
00157 virtual void SetFixedParameters(const ParametersType &);
00158
00160 virtual void UpdateParameters(void) const;
00161
00163 virtual const ParametersType& GetParameters(void) const;
00164
00166 virtual const ParametersType& GetFixedParameters(void) const;
00167
00178 itkSetClampMacro(Stiffness, double, 0.0, NumericTraits<double>::max());
00179 itkGetMacro(Stiffness, double);
00180
00181
00182 protected:
00183 KernelTransform();
00184 virtual ~KernelTransform();
00185 void PrintSelf(std::ostream& os, Indent indent) const;
00186
00187 public:
00189 typedef vnl_matrix_fixed<TScalarType, NDimensions, NDimensions> GMatrixType;
00190
00192 typedef vnl_matrix<TScalarType> LMatrixType;
00193
00195 typedef vnl_matrix<TScalarType> KMatrixType;
00196
00198 typedef vnl_matrix<TScalarType> PMatrixType;
00199
00201 typedef vnl_matrix<TScalarType> YMatrixType;
00202
00204 typedef vnl_matrix<TScalarType> WMatrixType;
00205
00207 typedef vnl_matrix<TScalarType> DMatrixType;
00208
00210 typedef vnl_matrix_fixed<TScalarType,NDimensions,NDimensions> AMatrixType;
00211
00213 typedef vnl_vector_fixed<TScalarType,NDimensions> BMatrixType;
00214
00216 typedef vnl_matrix_fixed<TScalarType, 1, NDimensions> RowMatrixType;
00217
00219 typedef vnl_matrix_fixed<TScalarType, NDimensions, 1> ColumnMatrixType;
00220
00222 PointSetPointer m_SourceLandmarks;
00223
00225 PointSetPointer m_TargetLandmarks;
00226
00227 protected:
00234 virtual const GMatrixType & ComputeG(const InputVectorType & landmarkVector) const;
00235
00242 virtual const GMatrixType & ComputeReflexiveG(PointsIterator) const;
00243
00244
00247 virtual void ComputeDeformationContribution( const InputPointType & inputPoint,
00248 OutputPointType & result ) const;
00249
00251 void ComputeK();
00252
00254 void ComputeL();
00255
00257 void ComputeP();
00258
00260 void ComputeY();
00261
00263 void ComputeD();
00264
00269 void ReorganizeW(void);
00270
00272 double m_Stiffness;
00273
00276 VectorSetPointer m_Displacements;
00277
00279 LMatrixType m_LMatrix;
00280
00282 KMatrixType m_KMatrix;
00283
00285 PMatrixType m_PMatrix;
00286
00288 YMatrixType m_YMatrix;
00289
00291 WMatrixType m_WMatrix;
00292
00298 DMatrixType m_DMatrix;
00299
00301 AMatrixType m_AMatrix;
00302
00304 BMatrixType m_BVector;
00305
00309 mutable GMatrixType m_GMatrix;
00310
00312 bool m_WMatrixComputed;
00313
00315 IMatrixType m_I;
00316
00317 private:
00318 KernelTransform(const Self&);
00319 void operator=(const Self&);
00320
00321 };
00322
00323 }
00324
00325 #ifndef ITK_MANUAL_INSTANTIATION
00326 #include "itkKernelTransform.txx"
00327 #endif
00328
00329 #endif // __itkKernelTransform_h