Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __cmtkCongealingFunctional_h_included_
00034 #define __cmtkCongealingFunctional_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include <Registration/cmtkGroupwiseRegistrationFunctionalXformTemplate.h>
00039
00040 #include <System/cmtkSmartPtr.h>
00041 #include <System/cmtkThreads.h>
00042
00043 #include <Base/cmtkUniformVolume.h>
00044 #include <Base/cmtkXform.h>
00045 #include <Base/cmtkHistogram.h>
00046
00047 #include <vector>
00048
00049 namespace
00050 cmtk
00051 {
00052
00055
00066 template<class TXform>
00067 class CongealingFunctional :
00069 public GroupwiseRegistrationFunctionalXformTemplate<TXform>
00070 {
00071 public:
00073 typedef GroupwiseRegistrationFunctionalXformTemplate<TXform> Superclass;
00074
00076 typedef CongealingFunctional<TXform> Self;
00077
00079 typedef SmartPointer<Self> SmartPtr;
00080
00082 typedef TXform XformType;
00083
00085 typedef typename XformType::SmartPtr XformPointer;
00086
00088 typedef unsigned int HistogramBinType;
00089
00091 typedef Histogram<HistogramBinType> HistogramType;
00092
00094 CongealingFunctional();
00095
00097 virtual ~CongealingFunctional();
00098
00100 virtual void SetNumberOfHistogramBins( const size_t numberOfHistogramBins );
00101
00104 virtual void SetTemplateGrid( UniformVolume::SmartPtr& templateGrid ,
00105 const int downsample = 1 ,
00106 const bool useTemplateData = false );
00107
00109 virtual typename Self::ReturnType Evaluate();
00110
00111 protected:
00113 std::vector<byte> m_StandardDeviationByPixel;
00114
00115 #ifdef CMTK_BUILD_MPI
00116
00117 std::vector<byte> m_StandardDeviationByPixelMPI;
00118 #endif
00119
00121 virtual void UpdateStandardDeviationByPixel();
00122
00124 bool m_NeedsUpdateStandardDeviationByPixel;
00125
00128 void CreateGaussianKernels();
00129
00136 std::vector<HistogramBinType*> m_HistogramKernel;
00137
00142 std::vector<size_t> m_HistogramKernelRadius;
00143
00146 std::vector<HistogramType> m_ThreadHistograms;
00147
00149 virtual bool Wiggle();
00150
00151 private:
00153 typedef ThreadParameters<Self> ThreadParametersType;
00154
00156 static void UpdateStandardDeviationByPixelThreadFunc( void *const args, const size_t taskIdx, const size_t taskCnt, const size_t, const size_t );
00157
00159 class EvaluateThreadParameters :
00161 public ThreadParametersType
00162 {
00163 public:
00165 double m_Entropy;
00166
00171 unsigned int m_Count;
00172 };
00173
00175 static void EvaluateThread( void *const args, const size_t taskIdx, const size_t taskCnt, const size_t threadIdx, const size_t threadCnt );
00176
00178 static void EvaluateProbabilisticThread( void *const args, const size_t taskIdx, const size_t taskCnt, const size_t threadIdx, const size_t threadCnt );
00179 };
00180
00182
00183 }
00184
00185 #endif // #ifndef __cmtkCongealingFunctional_h_included_