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
163
164public:
165
166 //OverwriteMethod(AccumulationArray & c) : AccumulationMethod("LATEST", c) {};
167 OverwriteMethod() : AccumulationMethod("OVERRIDE", "Latest data overrides") {};
168
169 virtual
170 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
171
173 virtual
174 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
175
176
177};
178
181
182public:
183
184 //MaximumMethod(AccumulationArray & c) : AccumulationMethod("MAXIMUM", c) {};
185 inline
186 MaximumMethod() : AccumulationMethod("MAXIMUM", "Maximum of values") {};
187
188 virtual
189 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
190
191};
192
195
196public:
197
198 //MinimumMethod(AccumulationArray & c) : AccumulationMethod("MINIMUM", c) {};
199 inline
200 MinimumMethod() : AccumulationMethod("MINIMUM", "Minimum of values") {};
201
202 virtual
203 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
204
205};
206
207
210
211public:
212
213 inline
214 MinMaxMethod() : AccumulationMethod("MINMAX", "Minimum or maximum with larger absolute value") {};
215
216 virtual
217 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
218
219 virtual
220 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
221
222 virtual
223 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
224
225};
226
227
230
231public:
232
233 //AverageMethod(AccumulationArray & c) : AccumulationMethod("AVERAGE", c) {};
234 inline
235 AverageMethod() : AccumulationMethod("AVERAGE", "Average of values") {};
236
237 virtual
238 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
239
240 virtual // inline
241 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
242
243 virtual
244 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
245
246 virtual
247 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
248
249 virtual
250 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
251
252};
253
254
255
258
259
260public:
261
262 inline
263 WeightedAverageMethod() : AccumulationMethod("WAVG", "Weighted average of data and quality values"), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
264 parameters.link("p", p = 1.0, "exponent for data value");
265 parameters.link("r", r = 1.0, "exponent for weight");
266 parameters.link("bias", bias = 0.0, "origin, for non-negative value exponent");
267 updateBean();
268 };
269
270 inline
271 WeightedAverageMethod(const WeightedAverageMethod & method) : AccumulationMethod(method), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
272 parameters.copyStruct(method.parameters, method, *this); // Does this copy descriptions?
273 updateBean();
274 };
275
276
277 virtual
278 void updateBean() const override;
279
280 virtual
281 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
282
283 virtual inline
284 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
285
286 virtual
287 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
288
289 virtual
290 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
291
292 virtual
293 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
294
295 /*
296 virtual
297 std::ostream & toStream(std::ostream & ostr) const {
298 //ostr << name << '(' << p << ',' << r << ',' << dataScaling << ')';
299 ostr << name << '(' << p << ',' << r << ',' << bias << ')';
300 return ostr;
301 };
302 */
303
304protected:
305
306 double bias = 0.0;
307
309 double p = 1.0;
310 mutable double pInv = 1.0;
311 mutable bool USE_P = false;
312
314 double r = 1.0;
315 mutable double rInv = 1.0;
316 mutable bool USE_R = false;
317
318};
319
320
323
324public:
325
326 //MaximumWeightMethod(AccumulationArray & c) : AccumulationMethod("MAXW", c) {};
327 inline
328 MaximumWeightMethod() : AccumulationMethod("MAXW", "Maximum-weight (maximum-quality)") {};
329
330 virtual
331 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const ;
332
333};
334
335
337
338extern
339AccMethodBank & getAccMethodBank();
340
341
342}
343
344}
345
346#endif /* Cumulator_H_ */
347
348// Drain
Definition Bank.h:63
Something which has a name, a description and possibly some parameters of varying type.
Definition BeanLike.h:58
const std::string description
Brief, human-readable description of this bean.
Definition BeanLike.h:309
map_t parameters
Parameters (name -> linked variable), typically linked to member variables of the derived class.
Definition BeanLike.h:313
virtual const std::string & getName() const
Return the name of an instance.
Definition BeanLike.h:89
virtual const std::string & getDescription() const
Return a brief description.
Definition BeanLike.h:94
BeanLike(const BeanLike &b)
Copy constructor. Re-links parameters to the member variables of this (new) instance.
Definition BeanLike.h:71
const std::string name
Name of this bean, typically also the name of the (derived) class.
Definition BeanLike.h:306
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:412
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
DOC: Add class description.
Definition AccumulationMethods.h:229
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
DOC: Add class description.
Definition AccumulationMethods.h:180
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
DOC: Add class description.
Definition AccumulationMethods.h:322
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
DOC: Add class description.
Definition AccumulationMethods.h:209
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
DOC: Add class description.
Definition AccumulationMethods.h:194
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
DOC: Add class description.
Definition AccumulationMethods.h:162
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
DOC: Add class description.
Definition AccumulationMethods.h:257
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:314
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:309
Definition Data.h:1473
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