Loading...
Searching...
No Matches
AccumulationMethods.h
1/*
2
3MIT License
4
5Copyright (c) 2017 FMI Open Development / Markus Peura, first.last@fmi.fi
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26/*
27Part of Rack development has been done in the BALTRAD projects part-financed
28by the European Union (European Regional Development Fund and European
29Neighbourhood Partnership Instrument, Baltic Sea Region Programme 2007-2013)
30*/
31#ifndef ACCUMULATION_H_
32#define ACCUMULATION_H_
33
34#include <limits>
35#include <math.h>
36
37#include <stdexcept>
38
39#include <drain/util/Bank.h>
40#include <drain/util/BeanLike.h>
41#include <drain/util/Point.h>
42#include <drain/util/Rectangle.h>
43
44#include "ImageT.h"
45#include "CoordinatePolicy.h"
46#include "AccumulationArray.h"
47#include "AccumulationConverter.h"
48
52namespace drain
53{
54
55namespace image
56{
57
58
60
67public:
68
69 inline
70 AccumulationMethod() : BeanLike("UNDEFINED", "Undefined method") {
71 };
72
73 inline
74 AccumulationMethod(const AccumulationMethod &method) : BeanLike(method.getName(), method.getDescription()){
75 };
76
77 virtual
79
80
81
82
84
92 virtual inline
93 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const {
94 throw std::runtime_error("AccumulationMethod::add - method/rule UNDEFINED");
95 };
96
97
99 virtual inline
100 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const {
101 add(accArray, i, value, weight);
102 };
103
104
105
107
116 virtual
117 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
118
119
121
126 virtual
127 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
128
130
135 virtual
136 void extractCount(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
137
139
145 virtual
146 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
147
148
149protected:
150
151
152 AccumulationMethod(const std::string & name, const std::string & description) : BeanLike(name, description) {
153 };
154
155
156};
157
158
159
160
162
163public:
164
165 //OverwriteMethod(AccumulationArray & c) : AccumulationMethod("LATEST", c) {};
166 OverwriteMethod() : AccumulationMethod("OVERRIDE", "Latest data overrides") {};
167
168 virtual
169 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
170
172 virtual
173 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
174
175
176};
177
179
180public:
181
182 //MaximumMethod(AccumulationArray & c) : AccumulationMethod("MAXIMUM", c) {};
183 inline
184 MaximumMethod() : AccumulationMethod("MAXIMUM", "Maximum of values") {};
185
186 virtual
187 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
188
189};
190
192
193public:
194
195 //MinimumMethod(AccumulationArray & c) : AccumulationMethod("MINIMUM", c) {};
196 inline
197 MinimumMethod() : AccumulationMethod("MINIMUM", "Minimum of values") {};
198
199 virtual
200 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
201
202};
203
204
206
207public:
208
209 inline
210 MinMaxMethod() : AccumulationMethod("MINMAX", "Minimum or maximum with larger absolute value") {};
211
212 virtual
213 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
214
215 virtual
216 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
217
218 virtual
219 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
220
221};
222
223
225
226public:
227
228 //AverageMethod(AccumulationArray & c) : AccumulationMethod("AVERAGE", c) {};
229 inline
230 AverageMethod() : AccumulationMethod("AVERAGE", "Average of values") {};
231
232 virtual
233 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
234
235 virtual // inline
236 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
237
238 virtual
239 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
240
241 virtual
242 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
243
244 virtual
245 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
246
247};
248
249
250
252
253
254public:
255
256 inline
257 WeightedAverageMethod() : AccumulationMethod("WAVG", "Weighted average of data and quality values"), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
258 parameters.link("p", p = 1.0, "exponent for data value");
259 parameters.link("r", r = 1.0, "exponent for weight");
260 parameters.link("bias", bias = 0.0, "origin, for non-negative value exponent");
261 updateBean();
262 };
263
264 inline
265 WeightedAverageMethod(const WeightedAverageMethod & method) : AccumulationMethod(method), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
266 parameters.copyStruct(method.parameters, method, *this); // Does this copy descriptions?
267 updateBean();
268 };
269
270
271 virtual
272 void updateBean() const override;
273
274 virtual
275 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
276
277 virtual inline
278 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
279
280 virtual
281 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
282
283 virtual
284 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
285
286 virtual
287 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
288
289 /*
290 virtual
291 std::ostream & toStream(std::ostream & ostr) const {
292 //ostr << name << '(' << p << ',' << r << ',' << dataScaling << ')';
293 ostr << name << '(' << p << ',' << r << ',' << bias << ')';
294 return ostr;
295 };
296 */
297
298protected:
299
300 double bias = 0.0;
301
303 double p = 1.0;
304 mutable double pInv = 1.0;
305 mutable bool USE_P = false;
306
308 double r = 1.0;
309 mutable double rInv = 1.0;
310 mutable bool USE_R = false;
311
312};
313
314
316
317public:
318
319 //MaximumWeightMethod(AccumulationArray & c) : AccumulationMethod("MAXW", c) {};
320 inline
321 MaximumWeightMethod() : AccumulationMethod("MAXW", "Maximum-weight (maximum-quality)") {};
322
323 virtual
324 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const ;
325
326};
327
328
330
331extern
332AccMethodBank & getAccMethodBank();
333
334
335}
336
337}
338
339#endif /* Cumulator_H_ */
340
341// Drain
Definition Bank.h:63
Something which has a name, a description and possibly some parameters of varying type.
Definition BeanLike.h:58
virtual const std::string & getName() const
Return the name of an instance.
Definition BeanLike.h:80
virtual const std::string & getDescription() const
Return a brief description.
Definition BeanLike.h:85
void copyStruct(const ReferenceMap &m, const T &src, T &dst, extLinkPolicy policy=RESERVE)
Experimental. Copies references and values of a structure to another.
Definition ReferenceMap.h:415
General-purpose image compositing.
Definition AccumulationArray.h:108
Function for accumulating data: maximum, average, weighted average etc.
Definition AccumulationMethods.h:66
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight, unsigned int count) const
Adds 'count' copies of a weighted value to the accumulation array.
Definition AccumulationMethods.h:100
virtual void extractWeight(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const
Retrieves the (average) weight of the accumulated values.
Definition AccumulationMethods.cpp:155
virtual void extractValue(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const
Retrieve the accumulated values from the accumulation matrix back to a data array.
Definition AccumulationMethods.cpp:75
virtual void extractDev(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const
Retrieves the standard deviation of the accumulated values.
Definition AccumulationMethods.cpp:229
virtual void extractCount(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const
Retrieves the count of values accumulated.
Definition AccumulationMethods.cpp:200
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.h:93
Definition AccumulationMethods.h:224
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:513
virtual void extractDev(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieves the standard deviation of the accumulated values.
Definition AccumulationMethods.cpp:659
virtual void extractValue(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieve the accumulated values from the accumulation matrix back to a data array.
Definition AccumulationMethods.cpp:538
virtual void extractWeight(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieves the (average) weight of the accumulated values.
Definition AccumulationMethods.cpp:609
Class for multi-channel digital images. Supports dynamic typing with base types (char,...
Definition Image.h:183
Definition AccumulationMethods.h:178
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:331
Definition AccumulationMethods.h:315
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:1030
Definition AccumulationMethods.h:205
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Definition AccumulationMethods.cpp:362
virtual void extractDev(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieves the standard deviation of the accumulated values.
Definition AccumulationMethods.cpp:456
virtual void extractValue(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieve the accumulated values from the accumulation matrix back to a data array.
Definition AccumulationMethods.cpp:385
Definition AccumulationMethods.h:191
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:345
Definition AccumulationMethods.h:161
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:262
virtual void extractDev(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Special defimition: difference.
Definition AccumulationMethods.cpp:277
Definition AccumulationMethods.h:251
virtual void add(AccumulationArray &accArray, const size_t i, double value, double weight) const override
Adds a weighted value to the accumulation array.
Definition AccumulationMethods.cpp:729
virtual void extractDev(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieves the standard deviation of the accumulated values.
Definition AccumulationMethods.cpp:953
virtual void extractValue(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieve the accumulated values from the accumulation matrix back to a data array.
Definition AccumulationMethods.cpp:796
double r
Power for weights.
Definition AccumulationMethods.h:308
virtual void updateBean() const override
Called after setParameters()
Definition AccumulationMethods.cpp:709
virtual void extractWeight(const AccumulationArray &accArray, const AccumulationConverter &coder, Image &dst, const drain::Rectangle< int > &crop={0, 0, 0, 0}) const override
Retrieves the (average) weight of the accumulated values.
Definition AccumulationMethods.cpp:895
double p
Power for data values.
Definition AccumulationMethods.h:303
Definition DataSelector.cpp:1277
Rectange defined through lower left and upper right coordinates.
Definition Rectangle.h:65
Converts raw data to values appropriate for accumulation.
Definition AccumulationConverter.h:50