Jerome Piovano

Research in Medical Imaging and Computer Vision

/home/jpiovano/src/Odyssee++/trunk/Libs/LevelSet/src/SegmentationModule/RegionModule.h

Go to the documentation of this file.
00001 
00009 #ifndef REGIONMODULE_H
00010 #define REGIONMODULE_H
00011 
00012 #include <SegmentationModule/SegmentationModule.h>
00013 #include <SegmentationModule/Histogram.h>
00014 
00015 namespace segmentation {
00016 
00017 
00027         template <unsigned DIM, typename Pixel = float, typename PixelImage = float> 
00028         class RegionModule : public SegmentationModule<DIM, Pixel>
00029         {
00030         public: 
00031 
00032                 typedef          SegmentationModule<DIM, Pixel>  base;
00033                 typedef typename base::LevelSet                  LevelSet;
00034                 typedef typename base::Index                     Index;
00035                 typedef typename base::Schemes                   Scheme;
00036                 typedef          Histogram<PixelImage>           Histogram;
00037                 typedef          BaseImage<DIM, PixelImage>      ImageType;
00038 
00041 
00043                 RegionModule(ImageType *  _data,              
00044                              float        _weight = 1.f,      
00045                              bool         _adaptive = true    
00046                              );
00047 
00049                 virtual ~RegionModule();
00050 
00052 
00054 
00056                 void set_data_term(ImageType & _data);
00057 
00059                 Histogram * hist_pos();
00061                 Histogram * hist_neg();
00062 
00064 
00066 
00068                 virtual float value(const LevelSet & phi, const Index & ind){ return 0.0f; }
00070                 virtual float energy(const LevelSet & phi, const Index & ind){ return 0.0f; }
00072                 virtual void init(const LevelSet & phi);
00074                 virtual void update(const LevelSet & phi){ }
00076                 virtual void save_result(const LevelSet & phi, std::string evodir, int iter){ }
00077 
00079                 void init_histograms(const LevelSet & phi);
00081                 void update_histograms(const LevelSet & phi);
00083                 void save_histograms(std::string evodir, int iter);
00084 
00086 
00088 
00089         protected:      
00090 
00091                 ImageType * m_data;       
00092                 Histogram * m_hist_pos;   
00093                 Histogram * m_hist_neg;   
00094 
00096 
00097         };
00098 
00099 
00101         // Constructors - Destructor
00102 
00103 
00104         template <unsigned DIM, typename Pixel, typename PixelImage>
00105                 RegionModule<DIM, Pixel, PixelImage>::RegionModule(ImageType * _data, float _weight, bool _adaptive)
00106                 :SegmentationModule<DIM, Pixel>(_weight, _adaptive), m_data(_data), m_hist_pos(NULL), m_hist_neg(NULL)
00107         { }
00108 
00109         template <unsigned DIM, typename Pixel, typename PixelImage>
00110                 RegionModule<DIM, Pixel, PixelImage>::~RegionModule() 
00111         {
00112                 if (m_hist_pos != NULL){
00113                         delete m_hist_pos;
00114                         delete m_hist_neg;
00115                 }
00116         }
00117 
00118 
00120         //  Member functions
00121 
00122 
00123         template <unsigned DIM, typename Pixel, typename PixelImage>
00124                 void RegionModule<DIM, Pixel, PixelImage>::set_data_term(ImageType & _data)
00125         {
00126                 m_data = &_data;
00127         }
00128 
00129         template <unsigned DIM, typename Pixel, typename PixelImage>
00130                 typename RegionModule<DIM, Pixel, PixelImage>::Histogram* RegionModule<DIM, Pixel, PixelImage>::hist_pos()
00131         {
00132                 return m_hist_pos;
00133         }
00134 
00135         template <unsigned DIM, typename Pixel, typename PixelImage>
00136                 typename RegionModule<DIM, Pixel, PixelImage>::Histogram* RegionModule<DIM, Pixel, PixelImage>::hist_neg()
00137         {
00138                 return m_hist_neg;
00139         }
00140 
00141 
00143         // Update of the module  
00144 
00145 
00146         template <unsigned DIM, typename Pixel, typename PixelImage>
00147                 void RegionModule<DIM, Pixel, PixelImage>::init(const LevelSet & phi)
00148         {
00149                 base::init(phi);
00150 
00151                 if (m_data->shape() != phi.shape()) {
00152                         std::cerr << "Error : Shape of the data term and shape of the LevelSet don't match"  << std::endl;
00153                         exit(1);
00154                 }
00155         }
00156 
00157         template <unsigned DIM, typename Pixel, typename PixelImage>
00158                 void RegionModule<DIM, Pixel, PixelImage>::init_histograms(const LevelSet & phi)
00159         {
00160                 if (m_hist_pos == NULL){
00161 
00162                         PixelImage min;
00163                         PixelImage max;
00164                         float mean;
00165                         
00166                         Globals::stats<DIM,PixelImage>(*m_data, min, max, mean);
00167 
00168                         m_hist_pos = new Histogram(min, max, true);
00169                         m_hist_neg = new Histogram(min, max, true);
00170                 }
00171 
00172                 //computation of the first histograms
00173 
00174                 m_hist_pos->clear();
00175                 m_hist_neg->clear();
00176 
00177                 for (typename ImageType::template iterator<domain> ind=m_data->begin() ; ind!=m_data->end() ; ++ind ){
00178                         const Pixel      _phi = phi(ind);
00179                         const PixelImage _val = (*m_data)(ind);
00180 
00181                         if (_phi>=0) m_hist_pos->add_pixel(_val);
00182                         else         m_hist_neg->add_pixel(_val);
00183                 }
00184         }
00185 
00186         template <unsigned DIM, typename Pixel, typename PixelImage>
00187                 void RegionModule<DIM, Pixel, PixelImage>::update_histograms(const LevelSet & phi) 
00188         {       
00189                 if (m_hist_pos == NULL){
00190                         std::cerr << "Error : Histograms not initialized"  << std::endl;
00191                         exit(1);
00192                 }
00193 
00194                 //computation of the histograms using previous ones
00195 
00196                 if (!m_hist_pos->adaptative() && !m_hist_neg->adaptative()) return;
00197 
00198                 for (unsigned int i = 0 ; i < phi.pos_to_neg_index() ; i++){
00199                         const Index& ind = phi.get_point(i);    
00200                         const PixelImage _val = (*m_data)(ind);
00201 
00202                         m_hist_neg->add_pixel(_val);
00203                         m_hist_pos->remove_pixel(_val);
00204                 }
00205 
00206                 for (unsigned int i = phi.neg_to_pos_index() ; i < phi.nb_points() ; i++){
00207                         const Index& ind = phi.get_point(i);
00208                         const PixelImage _val = (*m_data)(ind);
00209 
00210                         m_hist_neg->remove_pixel(_val);
00211                         m_hist_pos->add_pixel(_val);
00212                 }
00213         }
00214 
00215         template <unsigned DIM, typename Pixel, typename PixelImage>
00216                 void RegionModule<DIM, Pixel, PixelImage>::save_histograms(std::string evodir, int iter) 
00217         {
00218                 if (m_hist_pos == NULL){
00219                         std::cerr << "Error : Histograms not initialized"  << std::endl;
00220                         exit(1);
00221                 }
00222 
00223                 std::ostringstream name;
00224                 std::ofstream file;
00225 
00226                 name.str("");
00227                 name << evodir << "Hist_pos_" << std::setw(6) << std::setfill('0') << iter << ".txt";
00228                 file.open(name.str().c_str());
00229                 for(PixelImage i=m_hist_pos->min(); i < m_hist_pos->max() ; i++) 
00230                         file << i << " " << (*m_hist_pos)[i]  << std::endl;
00231                 file.close();
00232                 std::cout <<  " - Saved " << name.str() << " ..."  << std::endl;
00233 
00234                 name.str("");
00235                 name << evodir << "Hist_neg_" << std::setw(6) << std::setfill('0') << iter << ".txt";
00236                 file.open(name.str().c_str());
00237                 for(PixelImage i=m_hist_pos->min(); i < m_hist_pos->max() ; i++) 
00238                         file << i << " " << (*m_hist_neg)[i] << std::endl;
00239                 file.close();
00240                 std::cout <<  " - Saved " << name.str() << " ..."  << std::endl;
00241         }
00242 }
00243 
00244 #endif // REGIONMODULE_H

For further information, please contact Jerome Piovano - Last update 2008-02-08