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
51namespace drain
52{
53
54namespace image
55{
56
57
59
66public:
67
68 inline
69 AccumulationMethod() : BeanLike("UNDEFINED", __FUNCTION__) {
70 };
71
72 inline
73 AccumulationMethod(const AccumulationMethod &method) : BeanLike(method.getName(), method.getDescription()){
74 };
75
76 virtual
78
79
80
81
83
91 virtual inline
92 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const {
93 throw std::runtime_error("AccumulationMethod::add - method/rule UNDEFINED");
94 };
95
96
98 virtual inline
99 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const {
100 add(accArray, i, value, weight);
101 };
102
103
104
106
115 virtual
116 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
117
118
120
125 virtual
126 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
127
129
134 virtual
135 void extractCount(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
136
138
144 virtual
145 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const;
146
147
148protected:
149
150
151 AccumulationMethod(const std::string & name, const std::string & description) : BeanLike(name, description) {
152 };
153
154
155};
156
157
158
159
161
162public:
163
164 //OverwriteMethod(AccumulationArray & c) : AccumulationMethod("LATEST", c) {};
165 OverwriteMethod() : AccumulationMethod("OVERRIDE", "Latest data overrides") {};
166
167 virtual
168 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
169
171 virtual
172 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
173
174
175};
176
178
179public:
180
181 //MaximumMethod(AccumulationArray & c) : AccumulationMethod("MAXIMUM", c) {};
182 inline
183 MaximumMethod() : AccumulationMethod("MAXIMUM", "Maximum of values") {};
184
185 virtual
186 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
187
188};
189
191
192public:
193
194 //MinimumMethod(AccumulationArray & c) : AccumulationMethod("MINIMUM", c) {};
195 inline
196 MinimumMethod() : AccumulationMethod("MINIMUM", "Maximum of values") {};
197
198 virtual
199 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
200
201};
202
203
205
206public:
207
208 inline
209 MinMaxMethod() : AccumulationMethod("MINMAX", "Minimum or maximum with larger absolute value") {};
210
211 virtual
212 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
213
214 virtual
215 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
216
217 virtual
218 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
219
220};
221
222
224
225public:
226
227 //AverageMethod(AccumulationArray & c) : AccumulationMethod("AVERAGE", c) {};
228 inline
229 AverageMethod() : AccumulationMethod("AVERAGE", "Average of values") {};
230
231 virtual
232 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
233
234 virtual // inline
235 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
236
237 virtual
238 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
239
240 virtual
241 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
242
243 virtual
244 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
245
246};
247
248
249
251
252
253public:
254
255 inline
256 WeightedAverageMethod() : AccumulationMethod("WAVG","Weighted average of values"), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
257 parameters.link("p", p = 1.0, "exponent for data value");
258 parameters.link("r", r = 1.0, "exponent for weight");
259 parameters.link("bias", bias = 0.0, "origin, for non-negative value exponent");
260 updateBean();
261 };
262
263 inline
264 WeightedAverageMethod(const WeightedAverageMethod & method) : AccumulationMethod(method), pInv(1.0), USE_P(false), rInv(1.0), USE_R(false) {
265 parameters.copyStruct(method.parameters, method, *this);
266 /*
267 parameters.link("p", p = 1.0);
268 parameters.link("r", r = 1.0);
269 parameters.link("bias", bias = 0.0);
270 */
271 updateBean();
272 };
273
274
275 virtual
276 void updateBean() const override;
277
278 virtual
279 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
280
281 virtual inline
282 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
283
284 virtual
285 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
286
287 virtual
288 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
289
290 virtual
291 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
292
293 /*
294 virtual
295 std::ostream & toStream(std::ostream & ostr) const {
296 //ostr << name << '(' << p << ',' << r << ',' << dataScaling << ')';
297 ostr << name << '(' << p << ',' << r << ',' << bias << ')';
298 return ostr;
299 };
300 */
301
302protected:
303
304 double bias = 0.0;
305
307 double p = 1.0;
308 mutable double pInv = 1.0;
309 mutable bool USE_P = false;
310
312 double r = 1.0;
313 mutable double rInv = 1.0;
314 mutable bool USE_R = false;
315
316};
317
318
320
321public:
322
323 //MaximumWeightMethod(AccumulationArray & c) : AccumulationMethod("MAXW", c) {};
324 inline
325 MaximumWeightMethod() : AccumulationMethod("MAXW", "Maximum-weight (maximum-quality)") {};
326
327 virtual
328 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const ;
329
330};
331
332
334
335extern
336AccMethodBank & getAccMethodBank();
337
338
339}
340
341}
342
343#endif /* Cumulator_H_ */
344
345// Drain
Definition Bank.h:64
Something which has a name, a description and possibly some parameters of varying type.
Definition BeanLike.h:60
virtual const std::string & getName() const
Return the name of an instance.
Definition BeanLike.h:82
virtual const std::string & getDescription() const
Return a brief description.
Definition BeanLike.h:87
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:399
General-purpose image compositing.
Definition AccumulationArray.h:112
Function for accumulating data: maximum, average, weighted average etc.
Definition AccumulationMethods.h:65
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:99
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:92
Definition AccumulationMethods.h:223
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:184
Definition AccumulationMethods.h:177
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:319
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:204
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:190
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:160
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:250
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:312
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:307
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