brainrat-private  5.1.2
imageprocessor.h
Go to the documentation of this file.
1 /* Copyright (C) 2000-2013 CEA
2  *
3  * This software and supporting documentation were developed by
4  * bioPICSEL
5  * CEA/DSV/I²BM/MIRCen/LMN, Batiment 61,
6  * 18, route du Panorama
7  * 92265 Fontenay-aux-Roses
8  * France
9  */
10 
11 /*
12  * Data reader class
13  */
14 #ifndef BRAINRAT_UTILITY_IMAGEPROCESSOR_H
15 #define BRAINRAT_UTILITY_IMAGEPROCESSOR_H
16 
17 #define BRAINRAT_IMAGE_PROCESSOR 1
18 #define BRAINRAT_NEW_EXTRACTORS 1
19 
20 #include <cartobase/object/object.h>
21 #include <cartobase/type/converter.h>
22 #include <cartobase/smart/rcptr.h>
23 #include <aims/data/data.h>
24 #include <aims/roi/maskIterator.h>
25 #include <aims/utility/channel.h>
26 #include <aims/utility/progress.h>
27 #include <aims/border/borderfiller.h>
31 #include <aims/connectivity/structuring_element.h>
32 #include <string>
33 #include <vector>
34 
43 namespace bio {
44 
45 #ifdef BRAINRAT_IMAGE_PROCESSOR
46 
48  {
49  Init = 0,
50  OnDemand = 1
51  };
52 
53  template<class T, class U>
54  class ImageProc {
55  public:
57  virtual ~ImageProc(){}
58 
59  virtual void get(AimsData<T> &in,
60  AimsData<U> &out,
61  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>()) = 0;
62  virtual U get(AimsData<T> &in, const Point3dl & p) = 0;
63  };
64 
65  template<class T, class U, class C>
66  class ConvertibleImageProc : public ImageProc<T, U> {
67  public:
70 
71  virtual void get(AimsData<T> &in,
72  AimsData<U> &out,
73  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>()) = 0;
74  virtual U get(AimsData<T> &in, const Point3dl & p) = 0;
75 
76  protected:
77  inline virtual void convert(T &in, C &out) { _converter.convert(in, out); }
78 
79  carto::ShallowConverter<T, C> _converter;
81  };
82 
83  template<class T, class U>
84  class ConvertibleImageProc<T, U, T> : public ImageProc<T, U> {
85  public:
88 
89  virtual void get(AimsData<T> &in,
90  AimsData<U> &out,
91  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>()) = 0;
92  virtual U get(AimsData<T> &in, const Point3dl & p) = 0;
93 
94  protected:
95  inline virtual void convert(T &in, T &out) { out = in; }
96 
97  T _internal_value; // Used to not allocate object many times
98  };
99 
103  template<class T, class U, class C = T>
104  class ChannelImageProc : public ConvertibleImageProc<T, U, C> {
105  public:
106  ChannelImageProc(uint8_t channel = 4);
107  virtual ~ChannelImageProc(){}
108 
109  virtual void get(AimsData<T> &in,
110  AimsData<U> &out,
111  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>());
112  virtual U get(AimsData<T> &in, const Point3dl & p);
113 
114  private:
115  uint8_t _channel;
116  ChannelSelector<C, U> _selector;
117  };
118 
119  template<class T, class U>
120  class MorphoImageProc : public ImageProc<T, U> {
121  public:
122  MorphoImageProc(const carto::Object options);
123  virtual ~MorphoImageProc(){}
124 
125  virtual void get(AimsData<T> &in,
126  AimsData<U> &out,
127  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>());
128  virtual U get(AimsData<T> &in, const Point3dl & p);
129 
130  private :
131  carto::rc_ptr<aims::StructuringElement> _vse;
132  int32_t _vsesize;
133  int32_t _se;
134  double _amplitude;
135  bool _planar;
136  bool _usecenter;
137  bool _test;
138  carto::Object _options;
139  };
140 
141  template<class T, class U>
143  public:
144  ImageProcessors(const AimsData<T> &in,
145  const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>(),
146  const std::string & procids = "rgbm",
147  const carto::Object options = carto::none(),
148  const int32_t mode = OnDemand);
149  virtual ~ImageProcessors(){}
150 
151  //static get(const AimsData<T> &d, string &p, carto::Object options, ImageProcessorMode mode )
152 
153  virtual void initialize();
154  virtual U get(const Point3dl & p, const int32_t pi);
155  virtual AimsData<U> get(const int32_t pi);
156  virtual std::string procids();
157 
158  static std::string expandprocids(const std::string procids);
159 
160  private:
161 
162  AimsData<T> _in;
163  carto::rc_ptr<aims::MaskIterator> _mask;
164  carto::Object _options;
165  std::vector<AimsData<U> > _data;
166  std::vector<int32_t> _ptypes;
167  std::vector<carto::rc_ptr<ImageProc<T, U> > > _procs;
168  int32_t _mode;
169  std::string _procids;
170  };
171 
172 #endif // BRAINRAT_IMAGE_PROCESSOR
173 
174 #ifdef BRAINRAT_NEW_EXTRACTORS
175 
176  // Get time string
177  std::string timeString(std::string format = "%d-%m-%Y %H:%M:%S");
178 
179  // Color Extractor
180  template<class T, class U>
182  public:
183  ColorExtractor(const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>(),
184  const std::string & extract = "rgbm",
185  const bool forceGray = false,
186  const int & featureOffset = 0);
187  virtual ~ColorExtractor(){}
188 
189  // Accessors
190  virtual carto::VolumeRef<U> getFeatures();
191  virtual carto::VolumeRef<double> getGray();
192  virtual int getCount();
193  virtual carto::Object getDict();
194 
195  // Methods
196  virtual void check();
197  virtual void extract(const carto::VolumeRef<T> &vol);
198 
199  protected:
200  virtual void initializeDict();
201  virtual void checkExtract();
202  virtual void checkColorSpace();
203  virtual void checkGraySpace();
204 
205  private:
206  //carto::VolumeRef<T> _in; // TODO: remove
207  carto::VolumeRef<double> _gray;
208  carto::VolumeRef<U> _features;
209  carto::rc_ptr<aims::MaskIterator> _mask;
210  std::string _extract;
211  bool _forceGray;
212  int _borderSize;
213  int _featureOffset;
214 
215  bool _isSameColorSpace;
216  bool _hasGraySpaceFeature;
217 
218  carto::Object _dictFeat;
219  };
220 
221  // Neighbour Extractor
223  public:
224  NeighbourExtractor(const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>(),
225  const int amplitude = 1,
226  const std::string modes = "M",
227  const std::string shape = "D",
228  const std::vector<int> layers = std::vector<int>(),
229  const int featureOffset = 0);
230  virtual ~NeighbourExtractor(){};
231 
232  // Accessors
233  virtual carto::VolumeRef<float> getFeatures();
234  virtual int getCount();
235  virtual carto::Object getDict();
236 
237  // Methods
238  virtual void extract(const carto::VolumeRef<double> &vol);
239 
240  protected:
241  virtual void initializeDict();
242  virtual carto::rc_ptr<aims::strel::Shape> getStructuringElement();
243  carto::VolumeRef<uint8_t> extractNeighbours(
244  carto::VolumeRef<double> const & grayImage,
245  aims::strel::Shape & disk);
246 
247  private:
248  carto::VolumeRef<float> _features;
249  carto::rc_ptr<aims::MaskIterator> _mask;
250  int _amplitude;
251  std::string _extract;
252  std::string _shape;
253  std::vector<int> _layers;
254  int _featureOffset;
255 
256  carto::rc_ptr<aims::strel::Shape> _structuringElement;
257  carto::Object _dictFeat;
258  };
259 
260  // Gabor Extractor
262  public:
263  GaborExtractor(const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>(),
264  const std::vector<double> sigma = std::vector<double>(),
265  const std::vector<double> theta = std::vector<double>(),
266  const std::vector<double> lambda = std::vector<double>(),
267  const std::vector<double> psi = std::vector<double>(),
268  const std::vector<double> gamma = std::vector<double>(),
269  const std::vector<int> real = std::vector<int>(),
270  const int featureOffset = 0);
271  virtual ~GaborExtractor(){};
272 
273  // Accessors
274  virtual carto::VolumeRef<float> getFeatures();
275  virtual int getCount();
276  virtual carto::Object getDict();
277  virtual carto::Object getGaborDict();
278 
279  //Methods
280  virtual void extract(const carto::VolumeRef<double> &vol);
281 
282  protected:
283  virtual void initializeDict();
284  virtual void initializeGaborDict();
285 
286  private:
287  carto::VolumeRef<double> _gray;
288  carto::VolumeRef<float> _features;
289  carto::rc_ptr<aims::MaskIterator> _mask;
290 
291  std::vector<double> _sigma;
292  std::vector<double> _theta;
293  std::vector<double> _lambda;
294  std::vector<double> _psi;
295  std::vector<double> _gamma;
296  std::vector<int> _real;
297 
298  std::vector<aims::GaborFilter<double> > _filters;
299  int _featureOffset;
300 
301  carto::Object _dictFeat;
302  carto::Object _dictGabor;
303  };
304 
305  // Texture Extractor
307  public:
308  TextureExtractor(const carto::rc_ptr<aims::MaskIterator> mask = carto::rc_ptr<aims::MaskIterator>(),
309  const std::string tex_chara = "N",
310  const std::vector<int> tex_HTA = std::vector<int>(),
311  const std::string tex_lbp = "N",
312  const int featureOffset = 0);
313  virtual ~TextureExtractor(){};
314 
315  // Accessors
316  virtual carto::VolumeRef<float> getFeatures();
317  virtual int getCount();
318  virtual carto::Object getDict();
319 
320  //Methods
321  virtual void extract(const carto::VolumeRef<double> &vol);
322 
323  protected:
324  virtual void initializeDict();
325  virtual void initializeMatrix();
326  virtual void resetMatrix();
327  virtual void computeMatrix(const carto::VolumeRef<double> &vol);
328  virtual void computeLBP(const carto::VolumeRef<double> &vol);
329  virtual void computeHaralick(const carto::VolumeRef<double> &vol);
330  virtual void computeTamura(const carto:: VolumeRef<double> &vol);
331 
332  private:
333  carto::VolumeRef<float> _features;
334  carto::rc_ptr<aims::MaskIterator> _mask;
335 
336  Point3dl _coord;
337  std::vector<carto::VolumeRef<double> > _coomat;
338  carto::VolumeRef<double> _lbpImage;
339  carto::VolumeRef<double> _haralickImage;
340  carto::VolumeRef<double> _tamuraImage;
341 
342  std::string _tex_chara;
343  std::string _tex_lbp;
344  std::vector<int> _tex_HTA;
345 
346  int _k; // TODO: remove
347  int _featureOffset;
348 
349  carto::Object _dictFeat;
350  aims::strel::SquareXY _haralickStructuringElement;
351  };
352 #endif // BRAINRAT_NEW_EXTRACTORS
353 }
354 
355 #endif
Class used to get channel value in image.
virtual U get(AimsData< T > &in, const Point3dl &p)
virtual void get(AimsData< T > &in, AimsData< U > &out, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >())
ChannelImageProc(uint8_t channel=4)
virtual carto::Object getDict()
virtual void initializeDict()
virtual void check()
ColorExtractor(const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >(), const std::string &extract="rgbm", const bool forceGray=false, const int &featureOffset=0)
virtual void extract(const carto::VolumeRef< T > &vol)
virtual void checkColorSpace()
virtual carto::VolumeRef< double > getGray()
virtual carto::VolumeRef< U > getFeatures()
virtual int getCount()
virtual void checkGraySpace()
virtual void checkExtract()
virtual U get(AimsData< T > &in, const Point3dl &p)=0
virtual void convert(T &in, T &out)
virtual void get(AimsData< T > &in, AimsData< U > &out, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >())=0
virtual U get(AimsData< T > &in, const Point3dl &p)=0
virtual void convert(T &in, C &out)
carto::ShallowConverter< T, C > _converter
virtual void get(AimsData< T > &in, AimsData< U > &out, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >())=0
virtual int getCount()
virtual carto::Object getDict()
virtual carto::Object getGaborDict()
virtual void initializeDict()
virtual void initializeGaborDict()
GaborExtractor(const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >(), const std::vector< double > sigma=std::vector< double >(), const std::vector< double > theta=std::vector< double >(), const std::vector< double > lambda=std::vector< double >(), const std::vector< double > psi=std::vector< double >(), const std::vector< double > gamma=std::vector< double >(), const std::vector< int > real=std::vector< int >(), const int featureOffset=0)
virtual void extract(const carto::VolumeRef< double > &vol)
virtual carto::VolumeRef< float > getFeatures()
virtual ~ImageProc()
virtual U get(AimsData< T > &in, const Point3dl &p)=0
virtual void get(AimsData< T > &in, AimsData< U > &out, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >())=0
virtual void initialize()
ImageProcessors(const AimsData< T > &in, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >(), const std::string &procids="rgbm", const carto::Object options=carto::none(), const int32_t mode=OnDemand)
virtual std::string procids()
static std::string expandprocids(const std::string procids)
virtual AimsData< U > get(const int32_t pi)
virtual U get(const Point3dl &p, const int32_t pi)
virtual void get(AimsData< T > &in, AimsData< U > &out, const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >())
virtual U get(AimsData< T > &in, const Point3dl &p)
MorphoImageProc(const carto::Object options)
virtual carto::rc_ptr< aims::strel::Shape > getStructuringElement()
carto::VolumeRef< uint8_t > extractNeighbours(carto::VolumeRef< double > const &grayImage, aims::strel::Shape &disk)
virtual carto::VolumeRef< float > getFeatures()
virtual int getCount()
NeighbourExtractor(const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >(), const int amplitude=1, const std::string modes="M", const std::string shape="D", const std::vector< int > layers=std::vector< int >(), const int featureOffset=0)
virtual void extract(const carto::VolumeRef< double > &vol)
virtual void initializeDict()
virtual carto::Object getDict()
virtual void computeHaralick(const carto::VolumeRef< double > &vol)
virtual carto::Object getDict()
TextureExtractor(const carto::rc_ptr< aims::MaskIterator > mask=carto::rc_ptr< aims::MaskIterator >(), const std::string tex_chara="N", const std::vector< int > tex_HTA=std::vector< int >(), const std::string tex_lbp="N", const int featureOffset=0)
virtual void computeLBP(const carto::VolumeRef< double > &vol)
virtual carto::VolumeRef< float > getFeatures()
virtual void extract(const carto::VolumeRef< double > &vol)
virtual void initializeDict()
virtual void resetMatrix()
virtual void computeTamura(const carto::VolumeRef< double > &vol)
virtual void initializeMatrix()
virtual int getCount()
virtual void computeMatrix(const carto::VolumeRef< double > &vol)
ImageProcessors<AimsRGB, double> p(data, mask, "rgbm", options, ImageProcessorMode::Init); ImageProce...
Definition: classes.h:25
std::string timeString(std::string format="%d-%m-%Y %H:%M:%S")
ImageProcessorMode
@ OnDemand