00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __itkTransformRigidityPenaltyTerm_h
00016 #define __itkTransformRigidityPenaltyTerm_h
00017
00018 #include "itkTransformPenaltyTerm.h"
00019
00021 #include "itkAdvancedBSplineDeformableTransform.h"
00022 #include "itkAdvancedCombinationTransform.h"
00023
00025 #include "itkNeighborhood.h"
00026 #include "itkImageRegionIterator.h"
00027 #include "itkNeighborhoodOperatorImageFilter.h"
00028 #include "itkNeighborhoodIterator.h"
00029
00031 #include "itkGrayscaleDilateImageFilter.h"
00032 #include "itkBinaryBallStructuringElement.h"
00033 #include "itkImageRegionIterator.h"
00034
00035
00036 namespace itk
00037 {
00068 template< class TFixedImage, class TScalarType >
00069 class TransformRigidityPenaltyTerm
00070 : public TransformPenaltyTerm< TFixedImage, TScalarType >
00071 {
00072 public:
00073
00075 typedef TransformRigidityPenaltyTerm Self;
00076 typedef TransformPenaltyTerm<
00077 TFixedImage, TScalarType > Superclass;
00078 typedef SmartPointer<Self> Pointer;
00079 typedef SmartPointer<const Self> ConstPointer;
00080
00082 itkNewMacro( Self );
00083
00085 itkTypeMacro( TransformRigidityPenaltyTerm, TransformPenaltyTerm );
00086
00088 typedef typename Superclass::CoordinateRepresentationType CoordinateRepresentationType;
00089 typedef typename Superclass::MovingImageType MovingImageType;
00090 typedef typename Superclass::MovingImagePixelType MovingImagePixelType;
00091 typedef typename Superclass::MovingImagePointer MovingImagePointer;
00092 typedef typename Superclass::MovingImageConstPointer MovingImageConstPointer;
00093 typedef typename Superclass::FixedImageType FixedImageType;
00094 typedef typename Superclass::FixedImagePointer FixedImagePointer;
00095 typedef typename Superclass::FixedImageConstPointer FixedImageConstPointer;
00096 typedef typename Superclass::FixedImageRegionType FixedImageRegionType;
00097 typedef typename Superclass::TransformType TransformType;
00098 typedef typename Superclass::TransformPointer TransformPointer;
00099 typedef typename Superclass::InputPointType InputPointType;
00100 typedef typename Superclass::OutputPointType OutputPointType;
00101 typedef typename Superclass::TransformParametersType TransformParametersType;
00102 typedef typename Superclass::TransformJacobianType TransformJacobianType;
00103 typedef typename Superclass::InterpolatorType InterpolatorType;
00104 typedef typename Superclass::InterpolatorPointer InterpolatorPointer;
00105 typedef typename Superclass::RealType RealType;
00106 typedef typename Superclass::GradientPixelType GradientPixelType;
00107 typedef typename Superclass::GradientImageType GradientImageType;
00108 typedef typename Superclass::GradientImagePointer GradientImagePointer;
00109 typedef typename Superclass::GradientImageFilterType GradientImageFilterType;
00110 typedef typename Superclass::GradientImageFilterPointer GradientImageFilterPointer;
00111 typedef typename Superclass::FixedImageMaskType FixedImageMaskType;
00112 typedef typename Superclass::FixedImageMaskPointer FixedImageMaskPointer;
00113 typedef typename Superclass::MovingImageMaskType MovingImageMaskType;
00114 typedef typename Superclass::MovingImageMaskPointer MovingImageMaskPointer;
00115 typedef typename Superclass::MeasureType MeasureType;
00116 typedef typename Superclass::DerivativeType DerivativeType;
00117 typedef typename Superclass::DerivativeValueType DerivativeValueType;
00118 typedef typename Superclass::ParametersType ParametersType;
00119 typedef typename Superclass::FixedImagePixelType FixedImagePixelType;
00120 typedef typename Superclass::ImageSampleContainerType ImageSampleContainerType;
00121 typedef typename Superclass::ImageSampleContainerPointer ImageSampleContainerPointer;
00122 typedef typename Superclass::ScalarType ScalarType;
00123
00125 typedef typename Superclass::SpatialJacobianType SpatialJacobianType;
00126 typedef typename Superclass
00127 ::JacobianOfSpatialJacobianType JacobianOfSpatialJacobianType;
00128 typedef typename Superclass::SpatialHessianType SpatialHessianType;
00129 typedef typename Superclass
00130 ::JacobianOfSpatialHessianType JacobianOfSpatialHessianType;
00131 typedef typename Superclass::InternalMatrixType InternalMatrixType;
00132
00134 itkStaticConstMacro( FixedImageDimension, unsigned int, FixedImageType::ImageDimension );
00135 itkStaticConstMacro( MovingImageDimension, unsigned int, FixedImageType::ImageDimension );
00136 itkStaticConstMacro( ImageDimension, unsigned int, FixedImageType::ImageDimension );
00137
00139 virtual void Initialize( void ) throw ( ExceptionObject );
00140
00142 typedef AdvancedBSplineDeformableTransform< ScalarType,
00143 FixedImageDimension, 3 > BSplineTransformType;
00144 typedef typename BSplineTransformType::Pointer BSplineTransformPointer;
00145 typedef typename BSplineTransformType::SpacingType GridSpacingType;
00146 typedef typename BSplineTransformType::ImageType CoefficientImageType;
00147 typedef typename CoefficientImageType::Pointer CoefficientImagePointer;
00148 typedef typename CoefficientImageType::SpacingType CoefficientImageSpacingType;
00149 typedef AdvancedCombinationTransform< ScalarType,
00150 FixedImageDimension > CombinationTransformType;
00151
00153 typedef Neighborhood< ScalarType,
00154 itkGetStaticConstMacro( FixedImageDimension ) > NeighborhoodType;
00155 typedef typename NeighborhoodType::SizeType NeighborhoodSizeType;
00156 typedef ImageRegionIterator< CoefficientImageType > CoefficientImageIteratorType;
00157 typedef NeighborhoodOperatorImageFilter<
00158 CoefficientImageType, CoefficientImageType > NOIFType;
00159 typedef NeighborhoodIterator<CoefficientImageType> NeighborhoodIteratorType;
00160 typedef typename NeighborhoodIteratorType::RadiusType RadiusType;
00161
00163 typedef CoefficientImageType RigidityImageType;
00164 typedef typename RigidityImageType::Pointer RigidityImagePointer;
00165 typedef typename RigidityImageType::PixelType RigidityPixelType;
00166 typedef typename RigidityImageType::RegionType RigidityImageRegionType;
00167 typedef typename RigidityImageType::IndexType RigidityImageIndexType;
00168 typedef typename RigidityImageType::PointType RigidityImagePointType;
00169 typedef ImageRegionIterator< RigidityImageType > RigidityImageIteratorType;
00170 typedef BinaryBallStructuringElement<
00171 RigidityPixelType,
00172 itkGetStaticConstMacro( FixedImageDimension ) > StructuringElementType;
00173 typedef typename StructuringElementType::RadiusType SERadiusType;
00174 typedef GrayscaleDilateImageFilter<
00175 RigidityImageType, RigidityImageType,
00176 StructuringElementType > DilateFilterType;
00177 typedef typename DilateFilterType::Pointer DilateFilterPointer;
00178
00180 void CheckUseAndCalculationBooleans( void );
00181
00183 virtual MeasureType GetValue(
00184 const ParametersType & parameters ) const;
00185
00187 virtual void GetDerivative(
00188 const ParametersType & parameters,
00189 DerivativeType & derivative ) const;
00190
00192 virtual void GetValueAndDerivative(
00193 const ParametersType & parameters,
00194 MeasureType & value,
00195 DerivativeType & derivative ) const;
00196
00200 itkSetObjectMacro( BSplineTransform, BSplineTransformType );
00201
00203
00204
00206 itkSetClampMacro( LinearityConditionWeight, ScalarType,
00207 0.0, NumericTraits<ScalarType>::max() );
00208 itkGetMacro( LinearityConditionWeight, ScalarType );
00209
00211 itkSetClampMacro( OrthonormalityConditionWeight, ScalarType,
00212 0.0, NumericTraits<ScalarType>::max() );
00213 itkGetMacro( OrthonormalityConditionWeight, ScalarType );
00214
00216 itkSetClampMacro( PropernessConditionWeight, ScalarType,
00217 0.0, NumericTraits<ScalarType>::max() );
00218 itkGetMacro( PropernessConditionWeight, ScalarType );
00219
00221 itkSetMacro( UseLinearityCondition, bool );
00222
00224 itkSetMacro( UseOrthonormalityCondition, bool );
00225
00227 itkSetMacro( UsePropernessCondition, bool );
00228
00232 itkSetMacro( CalculateLinearityCondition, bool );
00233
00237 itkSetMacro( CalculateOrthonormalityCondition, bool );
00238
00242 itkSetMacro( CalculatePropernessCondition, bool );
00243
00245 itkGetConstReferenceMacro( LinearityConditionValue, MeasureType );
00246
00248 itkGetConstReferenceMacro( OrthonormalityConditionValue, MeasureType );
00249
00251 itkGetConstReferenceMacro( PropernessConditionValue, MeasureType );
00252
00254 itkGetConstReferenceMacro( LinearityConditionGradientMagnitude, MeasureType );
00255
00257 itkGetConstReferenceMacro( OrthonormalityConditionGradientMagnitude, MeasureType );
00258
00260 itkGetConstReferenceMacro( PropernessConditionGradientMagnitude, MeasureType );
00261
00263
00264
00266 itkSetMacro( DilateRigidityImages, bool );
00267
00269 itkSetClampMacro( DilationRadiusMultiplier, CoordinateRepresentationType,
00270 0.1, NumericTraits<CoordinateRepresentationType>::max() );
00271
00273 itkSetObjectMacro( FixedRigidityImage, RigidityImageType );
00274
00276 itkSetObjectMacro( MovingRigidityImage, RigidityImageType );
00277
00279 itkSetMacro( UseFixedRigidityImage, bool );
00280
00282 itkSetMacro( UseMovingRigidityImage, bool );
00283
00285 void FillRigidityCoefficientImage( const ParametersType & parameters ) const;
00286
00287 protected:
00288
00290 TransformRigidityPenaltyTerm();
00292 virtual ~TransformRigidityPenaltyTerm() {};
00293
00295 void PrintSelf( std::ostream& os, Indent indent ) const;
00296
00297 private:
00298
00300 TransformRigidityPenaltyTerm( const Self& );
00302 void operator=( const Self& );
00303
00305 virtual void DilateRigidityImages( void );
00306
00308 void Create1DOperator( NeighborhoodType & F, const std::string WhichF,
00309 const unsigned int WhichDimension, const CoefficientImageSpacingType & spacing ) const;
00310
00312 void CreateNDOperator( NeighborhoodType & F, const std::string WhichF,
00313 const CoefficientImageSpacingType & spacing ) const;
00314
00316 CoefficientImagePointer FilterSeparable( const CoefficientImageType *,
00317 const std::vector< NeighborhoodType > &Operators ) const;
00318
00320 BSplineTransformPointer m_BSplineTransform;
00321 ScalarType m_LinearityConditionWeight;
00322 ScalarType m_OrthonormalityConditionWeight;
00323 ScalarType m_PropernessConditionWeight;
00324
00325 mutable MeasureType m_RigidityPenaltyTermValue;
00326 mutable MeasureType m_LinearityConditionValue;
00327 mutable MeasureType m_OrthonormalityConditionValue;
00328 mutable MeasureType m_PropernessConditionValue;
00329 mutable MeasureType m_LinearityConditionGradientMagnitude;
00330 mutable MeasureType m_OrthonormalityConditionGradientMagnitude;
00331 mutable MeasureType m_PropernessConditionGradientMagnitude;
00332
00333 bool m_UseLinearityCondition;
00334 bool m_UseOrthonormalityCondition;
00335 bool m_UsePropernessCondition;
00336 bool m_CalculateLinearityCondition;
00337 bool m_CalculateOrthonormalityCondition;
00338 bool m_CalculatePropernessCondition;
00339
00341 CoordinateRepresentationType m_DilationRadiusMultiplier;
00342 bool m_DilateRigidityImages;
00343 mutable bool m_RigidityCoefficientImageIsFilled;
00344 RigidityImagePointer m_FixedRigidityImage;
00345 RigidityImagePointer m_MovingRigidityImage;
00346 RigidityImagePointer m_RigidityCoefficientImage;
00347 std::vector< DilateFilterPointer > m_FixedRigidityImageDilation;
00348 std::vector< DilateFilterPointer > m_MovingRigidityImageDilation;
00349 RigidityImagePointer m_FixedRigidityImageDilated;
00350 RigidityImagePointer m_MovingRigidityImageDilated;
00351 bool m_UseFixedRigidityImage;
00352 bool m_UseMovingRigidityImage;
00353
00354 };
00355
00356
00357 }
00358
00359 #ifndef ITK_MANUAL_INSTANTIATION
00360 #include "itkTransformRigidityPenaltyTerm.txx"
00361 #endif
00362
00363 #endif // #ifndef __itkTransformRigidityPenaltyTerm_h
00364