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", "Undefined method") {
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", "Minimum 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 data and quality 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); // Does this copy descriptions?
266 updateBean();
267 };
268
269
270 virtual
271 void updateBean() const override;
272
273 virtual
274 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const override;
275
276 virtual inline
277 void add(AccumulationArray & accArray, const size_t i, double value, double weight, unsigned int count) const override;
278
279 virtual
280 void extractValue(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
281
282 virtual
283 void extractWeight(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
284
285 virtual
286 void extractDev(const AccumulationArray & accArray, const AccumulationConverter & coder, Image & dst, const drain::Rectangle<int> & crop = {0,0,0,0}) const override;
287
288 /*
289 virtual
290 std::ostream & toStream(std::ostream & ostr) const {
291 //ostr << name << '(' << p << ',' << r << ',' << dataScaling << ')';
292 ostr << name << '(' << p << ',' << r << ',' << bias << ')';
293 return ostr;
294 };
295 */
296
297protected:
298
299 double bias = 0.0;
300
302 double p = 1.0;
303 mutable double pInv = 1.0;
304 mutable bool USE_P = false;
305
307 double r = 1.0;
308 mutable double rInv = 1.0;
309 mutable bool USE_R = false;
310
311};
312
313
315
316public:
317
318 //MaximumWeightMethod(AccumulationArray & c) : AccumulationMethod("MAXW", c) {};
319 inline
320 MaximumWeightMethod() : AccumulationMethod("MAXW", "Maximum-weight (maximum-quality)") {};
321
322 virtual
323 void add(AccumulationArray & accArray, const size_t i, double value, double weight) const ;
324
325};
326
327
329
330extern
331AccMethodBank & getAccMethodBank();
332
333
334}
335
336}
337
338#endif /* Cumulator_H_ */
339
340// 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:193
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:314
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:307
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:302
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