go home Home | Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages
itkParzenWindowHistogramImageToImageMetric.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright UMC Utrecht and contributors
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef __itkParzenWindowHistogramImageToImageMetric_H__
19 #define __itkParzenWindowHistogramImageToImageMetric_H__
20 
22 #include "itkKernelFunctionBase2.h"
23 
24 
25 namespace itk
26 {
73 template< class TFixedImage, class TMovingImage >
75  public AdvancedImageToImageMetric< TFixedImage, TMovingImage >
76 {
77 public:
78 
83  typedef SmartPointer< const Self > ConstPointer;
84 
87 
104  typedef typename Superclass::RealType RealType;
131 
133  itkStaticConstMacro( FixedImageDimension, unsigned int,
134  FixedImageType::ImageDimension );
135 
137  itkStaticConstMacro( MovingImageDimension, unsigned int,
138  MovingImageType::ImageDimension );
139 
146  void Initialize( void ) throw ( ExceptionObject );
147 
152  void GetDerivative(
153  const ParametersType & parameters,
154  DerivativeType & Derivative ) const;
155 
161  void GetValueAndDerivative( const ParametersType & parameters,
162  MeasureType & value, DerivativeType & derivative ) const;
163 
170  itkSetClampMacro( NumberOfFixedHistogramBins, unsigned long,
171  4, NumericTraits< unsigned long >::max() );
172  itkGetMacro( NumberOfFixedHistogramBins, unsigned long );
173 
180  itkSetClampMacro( NumberOfMovingHistogramBins, unsigned long,
181  4, NumericTraits< unsigned long >::max() );
182  itkGetMacro( NumberOfMovingHistogramBins, unsigned long );
183 
185  itkSetClampMacro( FixedKernelBSplineOrder, unsigned int, 0, 3 );
186  itkGetConstMacro( FixedKernelBSplineOrder, unsigned int );
187 
189  itkSetClampMacro( MovingKernelBSplineOrder, unsigned int, 0, 3 );
190  itkGetConstMacro( MovingKernelBSplineOrder, unsigned int );
191 
195  itkSetMacro( UseExplicitPDFDerivatives, bool );
196  itkGetConstReferenceMacro( UseExplicitPDFDerivatives, bool );
197  itkBooleanMacro( UseExplicitPDFDerivatives );
198 
202  itkSetMacro( UseDerivative, bool );
203  itkGetConstMacro( UseDerivative, bool );
204 
208  itkSetMacro( UseFiniteDifferenceDerivative, bool );
209  itkGetConstMacro( UseFiniteDifferenceDerivative, bool );
210 
215  itkSetMacro( FiniteDifferencePerturbation, double );
216  itkGetConstMacro( FiniteDifferencePerturbation, double );
217 
218 protected:
219 
222 
225 
227  void PrintSelf( std::ostream & os, Indent indent ) const;
228 
234  typedef typename FixedImageType::OffsetValueType OffsetValueType;
243 
245  typedef double PDFValueType;
246  typedef float PDFDerivativeValueType;
249  typedef typename JointPDFType::Pointer JointPDFPointer;
251  typedef typename JointPDFDerivativesType::Pointer JointPDFDerivativesPointer;
253  typedef typename IncrementalMarginalPDFType::Pointer IncrementalMarginalPDFPointer;
254  typedef JointPDFType::IndexType JointPDFIndexType;
255  typedef JointPDFType::RegionType JointPDFRegionType;
256  typedef JointPDFType::SizeType JointPDFSizeType;
257  typedef JointPDFDerivativesType::IndexType JointPDFDerivativesIndexType;
258  typedef JointPDFDerivativesType::RegionType JointPDFDerivativesRegionType;
259  typedef JointPDFDerivativesType::SizeType JointPDFDerivativesSizeType;
260  typedef IncrementalMarginalPDFType::IndexType IncrementalMarginalPDFIndexType;
261  typedef IncrementalMarginalPDFType::RegionType IncrementalMarginalPDFRegionType;
262  typedef IncrementalMarginalPDFType::SizeType IncrementalMarginalPDFSizeType;
264 
268 
272  mutable double m_Alpha;
273  mutable DerivativeType m_PerturbedAlphaRight;
274  mutable DerivativeType m_PerturbedAlphaLeft;
275 
277  mutable MarginalPDFType m_FixedImageMarginalPDF;
278  mutable MarginalPDFType m_MovingImageMarginalPDF;
279  JointPDFPointer m_JointPDF;
280  JointPDFDerivativesPointer m_JointPDFDerivatives;
281  JointPDFDerivativesPointer m_IncrementalJointPDFRight;
282  JointPDFDerivativesPointer m_IncrementalJointPDFLeft;
283  IncrementalMarginalPDFPointer m_FixedIncrementalMarginalPDFRight;
284  IncrementalMarginalPDFPointer m_MovingIncrementalMarginalPDFRight;
285  IncrementalMarginalPDFPointer m_FixedIncrementalMarginalPDFLeft;
286  IncrementalMarginalPDFPointer m_MovingIncrementalMarginalPDFLeft;
287  mutable JointPDFRegionType m_JointPDFWindow; // no need for mutable anymore?
294 
296  KernelFunctionPointer m_FixedKernel;
297  KernelFunctionPointer m_MovingKernel;
298  KernelFunctionPointer m_DerivativeMovingKernel;
299 
301  mutable std::vector< JointPDFPointer > m_ThreaderJointPDFs;
302 
306  struct ParzenWindowHistogramMultiThreaderParameterType // can't we use the one from AdvancedImageToImageMetric ?
307  {
308  Self * m_Metric;
309  };
310  ParzenWindowHistogramMultiThreaderParameterType m_ParzenWindowHistogramThreaderParameters;
311 
313  {
315  JointPDFPointer st_JointPDF;
316  };
318  PaddedParzenWindowHistogramGetValueAndDerivativePerThreadStruct );
319  itkAlignedTypedef( ITK_CACHE_LINE_ALIGNMENT, PaddedParzenWindowHistogramGetValueAndDerivativePerThreadStruct,
320  AlignedParzenWindowHistogramGetValueAndDerivativePerThreadStruct );
321  mutable AlignedParzenWindowHistogramGetValueAndDerivativePerThreadStruct * m_ParzenWindowHistogramGetValueAndDerivativePerThreadVariables;
323 
325  virtual void InitializeThreadingParameters( void ) const;
326 
328  inline void ThreadedComputePDFs( ThreadIdType threadId );
329 
331  inline void AfterThreadedComputePDFs( void ) const;
332 
334  static ITK_THREAD_RETURN_TYPE ComputePDFsThreaderCallback( void * arg );
335 
337  void LaunchComputePDFsThreaderCallback( void ) const;
338 
346  double parzenWindowTerm, OffsetValueType parzenWindowIndex,
347  const KernelFunctionType * kernel,
348  ParzenValueContainerType & parzenValues ) const;
349 
353  virtual void UpdateJointPDFAndDerivatives(
354  const RealType & fixedImageValue,
355  const RealType & movingImageValue,
356  const DerivativeType * imageJacobian,
357  const NonZeroJacobianIndicesType * nzji,
358  JointPDFType * jointPDF ) const;
359 
371  RealType fixedImageValue, RealType movingImageValue, RealType movingMaskValue,
372  const DerivativeType & movingImageValuesRight,
373  const DerivativeType & movingImageValuesLeft,
374  const DerivativeType & movingMaskValuesRight,
375  const DerivativeType & movingMaskValuesLeft,
376  const NonZeroJacobianIndicesType & nzji ) const;
377 
384  const JointPDFIndexType & pdfIndex, double factor,
385  const DerivativeType & imageJacobian,
386  const NonZeroJacobianIndicesType & nzji ) const;
387 
389  virtual void NormalizeJointPDF(
390  JointPDFType * pdf, const double & factor ) const;
391 
393  virtual void NormalizeJointPDFDerivatives(
394  JointPDFDerivativesType * pdf, const double & factor ) const;
395 
400  virtual void ComputeMarginalPDF(
401  const JointPDFType * jointPDF,
402  MarginalPDFType & marginalPDF,
403  const unsigned int & direction ) const;
404 
408  virtual void ComputeIncrementalMarginalPDFs(
409  const JointPDFDerivativesType * incrementalPDF,
410  IncrementalMarginalPDFType * fixedIncrementalMarginalPDF,
411  IncrementalMarginalPDFType * movingIncrementalMarginalPDF ) const;
412 
422  virtual void ComputePDFsAndPDFDerivatives( const ParametersType & parameters ) const;
423 
447  virtual void ComputePDFsAndIncrementalPDFs( const ParametersType & parameters ) const;
448 
457  virtual void ComputePDFsSingleThreaded( const ParametersType & parameters ) const;
458 
459  virtual void ComputePDFs( const ParametersType & parameters ) const;
460 
462  virtual void InitializeHistograms( void );
463 
464  virtual void InitializeKernels( void );
465 
471  const ParametersType & itkNotUsed( parameters ),
472  MeasureType & itkNotUsed( value ),
473  DerivativeType & itkNotUsed( derivative ) ) const {}
474 
480  const ParametersType & itkNotUsed( parameters ),
481  MeasureType & itkNotUsed( value ),
482  DerivativeType & itkNotUsed( derivative ) ) const {}
483 
484 private:
485 
487  ParzenWindowHistogramImageToImageMetric( const Self & ); // purposely not implemented
489  void operator=( const Self & ); // purposely not implemented
490 
500 
501 };
502 
503 } // end namespace itk
504 
505 #ifndef ITK_MANUAL_INSTANTIATION
506 #include "itkParzenWindowHistogramImageToImageMetric.hxx"
507 #endif
508 
509 #endif // end #ifndef __itkParzenWindowHistogramImageToImageMetric_H__
void EvaluateParzenValues(double parzenWindowTerm, OffsetValueType parzenWindowIndex, const KernelFunctionType *kernel, ParzenValueContainerType &parzenValues) const
Superclass::MovingImageContinuousIndexType MovingImageContinuousIndexType
Superclass::MovingImageDerivativeScalesType MovingImageDerivativeScalesType
virtual void UpdateJointPDFAndDerivatives(const RealType &fixedImageValue, const RealType &movingImageValue, const DerivativeType *imageJacobian, const NonZeroJacobianIndicesType *nzji, JointPDFType *jointPDF) const
virtual void NormalizeJointPDF(JointPDFType *pdf, const double &factor) const
LimiterFunctionBase< RealType, FixedImageDimension > FixedImageLimiterType
Superclass::CoordinateRepresentationType CoordinateRepresentationType
Kernel used for density estimation and nonparameteric regression.
Superclass::TransformParametersType TransformParametersType
Superclass::FixedImageMaskPointer FixedImageMaskPointer
An extension of the ITK ImageToImageMetric. It is the intended base class for all elastix metrics...
virtual void InitializeThreadingParameters(void) const
virtual void ComputeIncrementalMarginalPDFs(const JointPDFDerivativesType *incrementalPDF, IncrementalMarginalPDFType *fixedIncrementalMarginalPDF, IncrementalMarginalPDFType *movingIncrementalMarginalPDF) const
virtual void GetValueAndAnalyticDerivative(const ParametersType &, MeasureType &, DerivativeType &) const
Superclass::GradientPixelType GradientPixelType
virtual void GetValueAndFiniteDifferenceDerivative(const ParametersType &, MeasureType &, DerivativeType &) const
FixedImageLimiterType::OutputType FixedImageLimiterOutputType
Superclass::FixedImageRegionType FixedImageRegionType
itkAlignedTypedef(ITK_CACHE_LINE_ALIGNMENT, PaddedParzenWindowHistogramGetValueAndDerivativePerThreadStruct, AlignedParzenWindowHistogramGetValueAndDerivativePerThreadStruct)
void ThreadedComputePDFs(ThreadIdType threadId)
ImageSamplerType::OutputVectorContainerType ImageSampleContainerType
MovingImageType::IndexType MovingImageIndexType
virtual void ComputePDFsAndIncrementalPDFs(const ParametersType &parameters) const
InterpolatorType::ContinuousIndexType MovingImageContinuousIndexType
TransformType::InputPointType FixedImagePointType
FixedArray< double, Self::MovingImageDimension > MovingImageDerivativeScalesType
BSplineInterpolateImageFunction< MovingImageType, CoordinateRepresentationType, double > BSplineInterpolatorType
ImageSamplerBase< FixedImageType > ImageSamplerType
virtual void NormalizeJointPDFDerivatives(JointPDFDerivativesType *pdf, const double &factor) const
void PrintSelf(std::ostream &os, Indent indent) const
AdvancedTransformType::NonZeroJacobianIndicesType NonZeroJacobianIndicesType
Superclass::InterpolatorPointer InterpolatorPointer
Superclass::CoordinateRepresentationType CoordinateRepresentationType
FixedImageIndexType::IndexValueType FixedImageIndexValueType
TransformType::OutputPointType MovingImagePointType
Superclass::MovingImageMaskType MovingImageMaskType
LimiterFunctionBase< RealType, MovingImageDimension > MovingImageLimiterType
Superclass::GradientImageType GradientImageType
Superclass::TransformPointer TransformPointer
ParzenWindowHistogramMultiThreaderParameterType m_ParzenWindowHistogramThreaderParameters
A base class for image metrics based on a joint histogram computed using Parzen Windowing.
virtual void ComputePDFsAndPDFDerivatives(const ParametersType &parameters) const
virtual void ComputePDFsSingleThreaded(const ParametersType &parameters) const
itkPadStruct(ITK_CACHE_LINE_ALIGNMENT, ParzenWindowHistogramGetValueAndDerivativePerThreadStruct, PaddedParzenWindowHistogramGetValueAndDerivativePerThreadStruct)
void GetDerivative(const ParametersType &parameters, DerivativeType &Derivative) const
Superclass::GradientImageFilterType GradientImageFilterType
void GetValueAndDerivative(const ParametersType &parameters, MeasureType &value, DerivativeType &derivative) const
MovingImageType::RegionType MovingImageRegionType
Superclass::InterpolatorType InterpolatorType
Superclass::TransformJacobianType TransformJacobianType
static ITK_THREAD_RETURN_TYPE ComputePDFsThreaderCallback(void *arg)
void UpdateJointPDFDerivatives(const JointPDFIndexType &pdfIndex, double factor, const DerivativeType &imageJacobian, const NonZeroJacobianIndicesType &nzji) const
virtual void UpdateJointPDFAndIncrementalPDFs(RealType fixedImageValue, RealType movingImageValue, RealType movingMaskValue, const DerivativeType &movingImageValuesRight, const DerivativeType &movingImageValuesLeft, const DerivativeType &movingMaskValuesRight, const DerivativeType &movingMaskValuesLeft, const NonZeroJacobianIndicesType &nzji) const
virtual void ComputeMarginalPDF(const JointPDFType *jointPDF, MarginalPDFType &marginalPDF, const unsigned int &direction) const
Superclass::MovingImagePixelType MovingImagePixelType
GradientImageFilter< MovingImageType, RealType, RealType > CentralDifferenceGradientFilterType
Superclass::MovingImageMaskPointer MovingImageMaskPointer
MovingImageLimiterType::OutputType MovingImageLimiterOutputType
ThreaderType::ThreadInfoStruct ThreadInfoType
ImageSamplerType::OutputVectorContainerPointer ImageSampleContainerPointer
Superclass::FixedImageMaskType FixedImageMaskType
itkStaticConstMacro(FixedImageDimension, unsigned int, FixedImageType::ImageDimension)
virtual void ComputePDFs(const ParametersType &parameters) const
BSplineInterpolatorType::CovariantVectorType MovingImageDerivativeType
Superclass::CentralDifferenceGradientFilterType CentralDifferenceGradientFilterType
Superclass::FixedImageConstPointer FixedImageConstPointer
AlignedParzenWindowHistogramGetValueAndDerivativePerThreadStruct * m_ParzenWindowHistogramGetValueAndDerivativePerThreadVariables
Superclass::MovingImageConstPointer MovingImageConstPointer
AdvancedImageToImageMetric< TFixedImage, TMovingImage > Superclass
Superclass::GradientImageFilterPointer GradientImageFilterPointer
Superclass::GradientImagePointer GradientImagePointer


Generated on OURCE_DATE_EPOCH for elastix by doxygen 1.8.13 elastix logo