Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxExportExtraIdentMaskCentralMoments.h

00001 /*
00002  *  Copyright (c) 2002, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *  Author(s):
00006  *  Dennis Koelma (koelma@wins.uva.nl)
00007  *
00008  */
00009 
00010 #ifndef HxExportExtraIdentMaskCentralMoments_h
00011 #define HxExportExtraIdentMaskCentralMoments_h
00012 
00013 #include "HxClassName.h"
00014 #include "HxSizes.h"
00015 #include "HxCategories.h"
00016 #include "HxTagList.h"
00017 
00018 
00042 template<class ResultT, class ImValT, class ExtraValT>
00043 class HxExportExtraIdentMaskCentralMoments
00044 {
00045 public:
00047     typedef HxTagTransVar       TransVarianceCategory;
00048 
00050     typedef HxTagNPhase         PhaseCategory;
00051 
00052 
00054                         HxExportExtraIdentMaskCentralMoments(HxTagList& tags);
00055 
00057                         ~HxExportExtraIdentMaskCentralMoments();
00058 
00060     int                 nrPhases() const;
00061 
00063     void                init(int phase);
00064 
00066     void                doIt(const ImValT& imV, const ExtraValT& extraV,
00067                              int x, int y, int z);
00068 
00070     void                done(int phase);
00071 
00073     static HxString     className();
00074 
00075 private:
00076     HxTagList&          _tags;
00077     HxValueList*        _valList;
00078     ExtraValT           _maskVal;
00079     int                 _order;
00080     int                 _number;
00081     ResultT             _m00;
00082     ResultT             _m10;
00083     ResultT             _m01;
00084     ResultT             _xBar;
00085     ResultT             _yBar;
00086     ResultT*            _sums;
00087     int                 _curPhase;
00088 };
00089 
00090 template<class ResultT, class ImValT, class ExtraValT>
00091 
00092 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::HxExportExtraIdentMaskCentralMoments(HxTagList& tags) : _tags(tags)
00093 {
00094     _maskVal = HxGetTag<int>(tags, "maskVal");
00095     _order = HxGetTag<int>(tags, "order");
00096     _valList = HxGetTag<HxValueList*>(tags, "valList");
00097     _number = ((_order+1)*(_order+2))/2;
00098     _sums = new ResultT[_number];
00099     ResultT *ptr = _sums;
00100     for (int i=0 ; i<_number; i++)
00101         *ptr++ = HxScalarInt(0);
00102 }
00103 
00104 template<class ResultT, class ImValT, class ExtraValT>
00105 
00106 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>    ::~HxExportExtraIdentMaskCentralMoments()
00107 {
00108     HxValueListBackInserter res = std::back_inserter(*_valList);
00109     for (int i=0 ; i<_number ; i++)
00110         *res++ = HxValue(_sums[i]);
00111     delete _sums;
00112 }
00113 
00114 template<class ResultT, class ImValT, class ExtraValT>
00115 inline int
00116 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::nrPhases() const
00117 {
00118     return 2;
00119 }
00120 
00121 template<class ResultT, class ImValT, class ExtraValT>
00122 inline void
00123 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::init(int phase)
00124 {
00125     _curPhase = phase;
00126     if (phase == 1) {
00127         _m00 = HxScalarInt(0);
00128         _m10 = HxScalarInt(0);
00129         _m01 = HxScalarInt(0);
00130     } else {
00131         _xBar = _m10 / _m00;
00132         _yBar = _m01 / _m00;
00133     }
00134 }
00135 
00136 template<class ResultT, class ImValT, class ExtraValT>
00137 inline void
00138 
00139 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>    ::doIt(const ImValT& imV, const ExtraValT& extraV, int x, int y, int)
00140 {
00141     if (extraV != _maskVal)
00142         return;
00143     if (_curPhase == 1) {
00144         _m00 += imV;
00145         _m10 += ResultT(HxScalarDouble(x)) * ResultT(imV);
00146         _m01 += ResultT(HxScalarDouble(y)) * ResultT(imV);
00147     } else {
00148         ResultT xx = ResultT(HxScalarDouble(x)) - _xBar;
00149         ResultT yy = ResultT(HxScalarDouble(y)) - _yBar;
00150         int i=0;
00151         for (int q=0 ; q<=_order ; q++) {
00152             for (int p=0 ; p<=_order ; p++) {
00153                 if (p+q <= _order) {
00154                     _sums[i] += xx.pow(HxScalarInt(p)) * yy.pow(HxScalarInt(q)) * ResultT(imV);
00155                     i++;
00156                 }
00157             }
00158         }
00159     }
00160 }
00161 
00162 template<class ResultT, class ImValT, class ExtraValT>
00163 inline void
00164 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::done(int phase)
00165 {
00166 }
00167 
00168 template<class ResultT, class ImValT, class ExtraValT>
00169 inline HxString
00170 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::className()
00171 {
00172     return HxString("identMaskCentralMoments");
00173 }
00174 
00175 
00176 #endif

Generated on Tue Feb 3 14:18:34 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001