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
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
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
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
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
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