brainrat-private 6.0.4
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>
28#include <aims/signalfilter/gaborfilter.h>
29#include <aims/signalfilter/meanfilter.h>
30#include <aims/signalfilter/variancefilter.h>
31#include <aims/connectivity/structuring_element.h>
32#include <string>
33#include <vector>
34
42
43namespace bio {
44
45#ifdef BRAINRAT_IMAGE_PROCESSOR
46
48 {
49 Init = 0,
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);
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);
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);
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);
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
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::VolumeRef< double > getGray()
virtual carto::Object getDict()
virtual void initializeDict()
virtual void check()
virtual carto::VolumeRef< U > getFeatures()
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 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 carto::VolumeRef< float > getFeatures()
virtual void extract(const carto::VolumeRef< double > &vol)
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 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)
carto::VolumeRef< uint8_t > extractNeighbours(carto::VolumeRef< double > const &grayImage, aims::strel::Shape &disk)
virtual void initializeDict()
virtual carto::VolumeRef< float > getFeatures()
virtual carto::Object getDict()
virtual carto::rc_ptr< aims::strel::Shape > getStructuringElement()
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 void extract(const carto::VolumeRef< double > &vol)
virtual void initializeDict()
virtual carto::VolumeRef< float > getFeatures()
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