ITK  4.0.0
Insight Segmentation and Registration Toolkit
itkJointHistogramMutualInformationImageToImageMetricv4.h
Go to the documentation of this file.
00001 /*=========================================================================
00002  *
00003  *  Copyright Insight Software Consortium
00004  *
00005  *  Licensed under the Apache License, Version 2.0 (the "License");
00006  *  you may not use this file except in compliance with the License.
00007  *  You may obtain a copy of the License at
00008  *
00009  *         http://www.apache.org/licenses/LICENSE-2.0.txt
00010  *
00011  *  Unless required by applicable law or agreed to in writing, software
00012  *  distributed under the License is distributed on an "AS IS" BASIS,
00013  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  *  See the License for the specific language governing permissions and
00015  *  limitations under the License.
00016  *
00017  *=========================================================================*/
00018 
00019 #ifndef __itkJointHistogramMutualInformationImageToImageMetricv4_h
00020 #define __itkJointHistogramMutualInformationImageToImageMetricv4_h
00021 
00022 #include "itkImageToImageMetricv4.h"
00023 #include "itkImage.h"
00024 #include "itkBSplineDerivativeKernelFunction.h"
00025 
00026 #include "itkJointHistogramMutualInformationComputeJointPDFThreader.h"
00027 #include "itkJointHistogramMutualInformationGetValueAndDerivativeThreader.h"
00028 
00029 namespace itk
00030 {
00044 template<class TFixedImage,class TMovingImage,class TVirtualImage = TFixedImage>
00045 class ITK_EXPORT JointHistogramMutualInformationImageToImageMetricv4 :
00046   public ImageToImageMetricv4<TFixedImage, TMovingImage, TVirtualImage>
00047 {
00048 public:
00049 
00051   typedef JointHistogramMutualInformationImageToImageMetricv4            Self;
00052   typedef ImageToImageMetricv4<TFixedImage, TMovingImage, TVirtualImage> Superclass;
00053   typedef SmartPointer<Self>                                                 Pointer;
00054   typedef SmartPointer<const Self>                                           ConstPointer;
00055 
00057   itkNewMacro(Self);
00058 
00060   itkTypeMacro(JointHistogramMutualInformationImageToImageMetricv4,
00061                 ImageToImageMetricv4);
00062 
00064   typedef typename Superclass::CoordinateRepresentationType
00065                                                   CoordinateRepresentationType;
00066 
00068   typedef typename Superclass::InternalComputationValueType
00069                                                   InternalComputationValueType;
00070 
00072   typedef typename Superclass::ParametersType         ParametersType;
00073   typedef typename Superclass::ParametersValueType    ParametersValueType;
00074   typedef typename Superclass::NumberOfParametersType NumberOfParametersType;
00075 
00077   typedef typename Superclass::MeasureType              MeasureType;
00078   typedef typename Superclass::DerivativeType           DerivativeType;
00079   typedef typename Superclass::FixedImagePointType      FixedImagePointType;
00080   typedef typename Superclass::FixedImagePixelType      FixedImagePixelType;
00081   typedef typename Superclass::FixedGradientPixelType
00082                                                         FixedImageGradientType;
00083   typedef typename Superclass::MovingImagePointType     MovingImagePointType;
00084   typedef typename Superclass::MovingImagePixelType     MovingImagePixelType;
00085   typedef typename Superclass::MovingGradientPixelType
00086                                                         MovingImageGradientType;
00087   typedef typename Superclass::FixedTransformType::JacobianType
00088                                                         FixedTransformJacobianType;
00089   typedef typename Superclass::MovingTransformType::JacobianType
00090                                                         MovingTransformJacobianType;
00091   typedef typename Superclass::VirtualImageType         VirtualImageType;
00092   typedef typename Superclass::VirtualIndexType         VirtualIndexType;
00093   typedef typename Superclass::VirtualPointType         VirtualPointType;
00094   typedef typename Superclass::VirtualSampledPointSetType
00095                                                         VirtualSampledPointSetType;
00096 
00097   /* Image dimension accessors */
00098   itkStaticConstMacro(VirtualImageDimension, ImageDimensionType,
00099       ::itk::GetImageDimension<TVirtualImage>::ImageDimension);
00100   itkStaticConstMacro(MovingImageDimension, ImageDimensionType,
00101       ::itk::GetImageDimension<TMovingImage>::ImageDimension);
00102 
00104   typedef InternalComputationValueType                  PDFValueType;
00105 
00107   typedef Image<PDFValueType,1>                 MarginalPDFType;
00108   typedef typename MarginalPDFType::IndexType   MarginalPDFIndexType;
00109   typedef typename MarginalPDFType::PointType   MarginalPDFPointType;
00110   typedef Image< PDFValueType, 2>               JointPDFType;
00111   typedef typename JointPDFType::IndexType      JointPDFIndexType;
00112   typedef typename JointPDFType::PointType      JointPDFPointType;
00113   typedef typename JointPDFType::IndexValueType JointPDFIndexValueType;
00114 
00116   itkGetConstObjectMacro( JointPDF, JointPDFType );
00117 
00118   // Declare the type for the derivative calculation
00119   typedef itk::GradientRecursiveGaussianImageFilter< JointPDFType >
00120                                                          JPDFGradientFilterType;
00121 
00122   typedef typename JPDFGradientFilterType::OutputImageType JPDFGradientImageType;
00123 
00124   typedef typename JPDFGradientImageType::Pointer JPDFGradientImagePointer;
00125 
00126   typedef itk::GradientRecursiveGaussianImageFilter< MarginalPDFType >
00127                                                   MarginalGradientFilterType;
00128   typedef typename MarginalGradientFilterType::OutputImageType
00129                                                   MarginalGradientImageType;
00130   typedef typename MarginalGradientImageType::Pointer
00131                                                   MarginalGradientImagePointer;
00132 
00134   typedef LinearInterpolateImageFunction<JointPDFType,double>
00135                                                      JointPDFInterpolatorType;
00136   typedef typename JointPDFInterpolatorType::Pointer JointPDFInterpolatorPointer;
00137   typedef LinearInterpolateImageFunction<MarginalPDFType,double>
00138                                                      MarginalPDFInterpolatorType;
00139   typedef typename MarginalPDFInterpolatorType::Pointer
00140                                                      MarginalPDFInterpolatorPointer;
00141 
00143   typedef typename JointPDFType::PixelType             JointPDFValueType;
00144   typedef typename JointPDFType::RegionType            JointPDFRegionType;
00145   typedef typename JointPDFType::SizeType              JointPDFSizeType;
00146   typedef typename JointPDFType::SpacingType           JointPDFSpacingType;
00147 
00148 
00150   itkSetClampMacro( NumberOfHistogramBins, SizeValueType,
00151                     5, NumericTraits< SizeValueType >::max() );
00152   itkGetConstReferenceMacro(NumberOfHistogramBins, SizeValueType );
00154 
00156   itkSetMacro(VarianceForJointPDFSmoothing, InternalComputationValueType);
00157   itkGetMacro(VarianceForJointPDFSmoothing, InternalComputationValueType);
00159 
00161   virtual void Initialize() throw (itk::ExceptionObject);
00162 
00163   virtual MeasureType GetValue() const;
00164 
00165 protected:
00166   JointHistogramMutualInformationImageToImageMetricv4();
00167   virtual ~JointHistogramMutualInformationImageToImageMetricv4();
00168 
00172   virtual void InitializeForIteration() const;
00173 
00175   MeasureType ComputeValue() const;
00176 
00179   inline void ComputeJointPDFPoint( const FixedImagePixelType fixedImageValue,
00180                                const MovingImagePixelType movingImageValue,
00181                                JointPDFPointType & jointPDFpoint ) const;
00182 
00183   friend class JointHistogramMutualInformationComputeJointPDFThreaderBase< ThreadedImageRegionPartitioner< Self::VirtualImageDimension >, Self >;
00184   friend class JointHistogramMutualInformationComputeJointPDFThreaderBase< ThreadedIndexedContainerPartitioner, Self >;
00185   friend class JointHistogramMutualInformationComputeJointPDFThreader< ThreadedImageRegionPartitioner< Self::VirtualImageDimension >, Self >;
00186   friend class JointHistogramMutualInformationComputeJointPDFThreader< ThreadedIndexedContainerPartitioner, Self >;
00187 
00188   typedef JointHistogramMutualInformationComputeJointPDFThreader< ThreadedImageRegionPartitioner< Self::VirtualImageDimension >, Self >
00189     JointHistogramMutualInformationDenseComputeJointPDFThreaderType;
00190   typedef JointHistogramMutualInformationComputeJointPDFThreader< ThreadedIndexedContainerPartitioner, Self >
00191     JointHistogramMutualInformationSparseComputeJointPDFThreaderType;
00192 
00193   typename JointHistogramMutualInformationDenseComputeJointPDFThreaderType::Pointer  m_JointHistogramMutualInformationDenseComputeJointPDFThreader;
00194   typename JointHistogramMutualInformationSparseComputeJointPDFThreaderType::Pointer m_JointHistogramMutualInformationSparseComputeJointPDFThreader;
00195 
00196   friend class JointHistogramMutualInformationGetValueAndDerivativeThreader< ThreadedImageRegionPartitioner< Superclass::VirtualImageDimension >, Superclass, Self >;
00197   friend class JointHistogramMutualInformationGetValueAndDerivativeThreader< ThreadedIndexedContainerPartitioner, Superclass, Self >;
00198 
00199   typedef JointHistogramMutualInformationGetValueAndDerivativeThreader< ThreadedImageRegionPartitioner< Superclass::VirtualImageDimension >, Superclass, Self >
00200     JointHistogramMutualInformationDenseGetValueAndDerivativeThreaderType;
00201   typedef JointHistogramMutualInformationGetValueAndDerivativeThreader< ThreadedIndexedContainerPartitioner, Superclass, Self >
00202     JointHistogramMutualInformationSparseGetValueAndDerivativeThreaderType;
00203 
00205   void PrintSelf(std::ostream & os, Indent indent) const;
00206 
00207 
00208 private:
00209   JointHistogramMutualInformationImageToImageMetricv4(const Self &); //purposely not implemented
00210   void operator=(const Self &); //purposely not implemented
00211 
00213   typename MarginalPDFType::Pointer m_FixedImageMarginalPDF;
00214 
00216   typename MarginalPDFType::Pointer m_MovingImageMarginalPDF;
00217 
00219   mutable typename JointPDFType::Pointer            m_JointPDF;
00220 
00222   InternalComputationValueType        m_VarianceForJointPDFSmoothing;
00223 
00225   SizeValueType                       m_NumberOfHistogramBins;
00226   InternalComputationValueType        m_FixedImageTrueMin;
00227   InternalComputationValueType        m_FixedImageTrueMax;
00228   InternalComputationValueType        m_MovingImageTrueMin;
00229   InternalComputationValueType        m_MovingImageTrueMax;
00230   InternalComputationValueType        m_FixedImageBinSize;
00231   InternalComputationValueType        m_MovingImageBinSize;
00232 
00233   InternalComputationValueType        m_JointPDFSum;
00234   JointPDFSpacingType                 m_JointPDFSpacing;
00235 
00236   InternalComputationValueType        m_Log2;
00237   JointPDFIndexValueType              m_Padding;
00238 
00239 };
00240 
00241 } // end namespace itk
00242 
00243 #ifndef ITK_MANUAL_INSTANTIATION
00244 #include "itkJointHistogramMutualInformationImageToImageMetricv4.hxx"
00245 #endif
00246 
00247 #endif
00248