00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkBSplineDeformableTransform_h
00019 #define __itkBSplineDeformableTransform_h
00020
00021 #include <iostream>
00022 #include "itkTransform.h"
00023 #include "itkImage.h"
00024 #include "itkImageRegion.h"
00025 #include "itkBSplineInterpolationWeightFunction.h"
00026
00027 namespace itk
00028 {
00029
00106 template <
00107 class TScalarType = double,
00108 unsigned int NDimensions = 3,
00109 unsigned int VSplineOrder = 3 >
00110 class ITK_EXPORT BSplineDeformableTransform :
00111 public Transform< TScalarType, NDimensions, NDimensions >
00112 {
00113 public:
00115 typedef BSplineDeformableTransform Self;
00116 typedef Transform< TScalarType, NDimensions, NDimensions > Superclass;
00117 typedef SmartPointer<Self> Pointer;
00118 typedef SmartPointer<const Self> ConstPointer;
00119
00121 itkNewMacro( Self );
00122
00124 itkTypeMacro( BSplineDeformableTransform, Transform );
00125
00127 itkStaticConstMacro(SpaceDimension, unsigned int, NDimensions);
00128
00130 itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder);
00131
00133 typedef typename Superclass::ScalarType ScalarType;
00134
00136 typedef typename Superclass::ParametersType ParametersType;
00137
00139 typedef typename Superclass::JacobianType JacobianType;
00140
00142 typedef Vector<TScalarType,
00143 itkGetStaticConstMacro(SpaceDimension)> InputVectorType;
00144 typedef Vector<TScalarType,
00145 itkGetStaticConstMacro(SpaceDimension)> OutputVectorType;
00146
00148 typedef CovariantVector<TScalarType,
00149 itkGetStaticConstMacro(SpaceDimension)> InputCovariantVectorType;
00150 typedef CovariantVector<TScalarType,
00151 itkGetStaticConstMacro(SpaceDimension)> OutputCovariantVectorType;
00152
00154 typedef vnl_vector_fixed<TScalarType,
00155 itkGetStaticConstMacro(SpaceDimension)> InputVnlVectorType;
00156 typedef vnl_vector_fixed<TScalarType,
00157 itkGetStaticConstMacro(SpaceDimension)> OutputVnlVectorType;
00158
00160 typedef Point<TScalarType,
00161 itkGetStaticConstMacro(SpaceDimension)> InputPointType;
00162 typedef Point<TScalarType,
00163 itkGetStaticConstMacro(SpaceDimension)> OutputPointType;
00164
00183 void SetParameters(const ParametersType & parameters);
00184
00186 virtual const ParametersType& GetParameters(void) const;
00187
00189 typedef typename ParametersType::ValueType PixelType;
00190 typedef Image<PixelType,itkGetStaticConstMacro(SpaceDimension)> ImageType;
00191 typedef typename ImageType::Pointer ImagePointer;
00192
00194 virtual ImagePointer * GetCoefficientImage()
00195 { return m_CoefficientImage; }
00196
00209 virtual void SetCoefficientImage( ImagePointer images[] );
00210
00212 typedef ImageRegion<itkGetStaticConstMacro(SpaceDimension)> RegionType;
00213 typedef typename RegionType::IndexType IndexType;
00214 typedef typename RegionType::SizeType SizeType;
00215 typedef FixedArray<double,itkGetStaticConstMacro(SpaceDimension)> SpacingType;
00216 typedef FixedArray<double,itkGetStaticConstMacro(SpaceDimension)> OriginType;
00217
00219 virtual void SetGridRegion( const RegionType& region );
00220 itkGetMacro( GridRegion, RegionType );
00221
00223 virtual void SetGridSpacing( const SpacingType& spacing );
00224 itkGetMacro( GridSpacing, SpacingType );
00225
00227 virtual void SetGridOrigin( const OriginType& origin );
00228 itkGetMacro( GridOrigin, OriginType );
00229
00231 typedef Transform<ScalarType,itkGetStaticConstMacro(SpaceDimension),
00232 itkGetStaticConstMacro(SpaceDimension)> BulkTransformType;
00233 typedef typename BulkTransformType::ConstPointer BulkTransformPointer;
00234
00238 itkSetConstObjectMacro( BulkTransform, BulkTransformType );
00239 itkGetConstObjectMacro( BulkTransform, BulkTransformType );
00240
00242 OutputPointType TransformPoint(const InputPointType &point ) const;
00243
00245 typedef BSplineInterpolationWeightFunction<ScalarType,
00246 itkGetStaticConstMacro(SpaceDimension),
00247 itkGetStaticConstMacro(SplineOrder)> WeightsFunctionType;
00248 typedef typename WeightsFunctionType::WeightsType WeightsType;
00249 typedef typename WeightsFunctionType::ContinuousIndexType ContinuousIndexType;
00250
00252 typedef Array<unsigned long> ParameterIndexArrayType;
00253
00261 void TransformPoint( const InputPointType & inputPoint,
00262 OutputPointType & outputPoint,
00263 WeightsType & weights,
00264 ParameterIndexArrayType & indices,
00265 bool & inside ) const;
00266
00268 unsigned long GetNumberOfWeights() const
00269 { return m_WeightsFunction->GetNumberOfWeights(); }
00270
00272 virtual OutputVectorType TransformVector(const InputVectorType &) const
00273 {
00274 itkExceptionMacro(<< "Method not applicable for deformable transform." );
00275 return OutputVectorType();
00276 }
00277
00279 virtual OutputVnlVectorType TransformVector(const InputVnlVectorType &) const
00280 {
00281 itkExceptionMacro(<< "Method not applicable for deformable transform. ");
00282 return OutputVnlVectorType();
00283 }
00284
00286 virtual OutputCovariantVectorType TransformCovariantVector(
00287 const InputCovariantVectorType &) const
00288 {
00289 itkExceptionMacro(<< "Method not applicable for deformable transfrom. ");
00290 return OutputCovariantVectorType();
00291 }
00292
00294 virtual const JacobianType& GetJacobian(const InputPointType &point ) const;
00295
00297 virtual unsigned int GetNumberOfParameters(void) const;
00298
00300 unsigned int GetNumberOfParametersPerDimension(void) const;
00301
00303 itkGetConstMacro( ValidRegion, RegionType );
00304
00305 protected:
00307 void PrintSelf(std::ostream &os, Indent indent) const;
00308
00309
00310 BSplineDeformableTransform();
00311 ~BSplineDeformableTransform();
00312
00313 private:
00314 BSplineDeformableTransform(const Self&);
00315 void operator=(const Self&);
00316
00318 BulkTransformPointer m_BulkTransform;
00319
00321 RegionType m_GridRegion;
00322 SpacingType m_GridSpacing;
00323 OriginType m_GridOrigin;
00324
00325 RegionType m_ValidRegion;
00326
00328 unsigned long m_Offset;
00329 bool m_SplineOrderOdd;
00330 SizeType m_SupportSize;
00331 IndexType m_ValidRegionLast;
00332
00334 ImagePointer m_WrappedImage[NDimensions];
00335
00337 ImagePointer m_CoefficientImage[NDimensions];
00338
00340 typedef typename JacobianType::ValueType JacobianPixelType;
00341 typedef Image<JacobianPixelType,
00342 itkGetStaticConstMacro(SpaceDimension)> JacobianImageType;
00343
00344 typename JacobianImageType::Pointer m_JacobianImage[NDimensions];
00345
00349 mutable IndexType m_LastJacobianIndex;
00350
00352 const ParametersType * m_InputParametersPointer;
00353
00355 typename WeightsFunctionType::Pointer m_WeightsFunction;
00356
00358 bool InsideValidRegion( const ContinuousIndexType& index ) const;
00359
00360
00361 };
00362
00363
00364 }
00365
00366
00367 #ifndef ITK_MANUAL_INSTANTIATION
00368 #include "itkBSplineDeformableTransform.txx"
00369 #endif
00370
00371 #endif