1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
#ifndef LocalFitMethod_H
#define LocalFitMethod_H
#include <string>
#include <mutex>
#include "../../structures/image2d.h"
#include "../../structures/mask2d.h"
#include "../../structures/timefrequencydata.h"
#include "surfacefitmethod.h"
class LocalFitMethod final : public SurfaceFitMethod {
public:
enum Method {
None,
Average,
GaussianWeightedAverage,
FastGaussianWeightedAverage,
Median,
Minimum
};
LocalFitMethod();
~LocalFitMethod();
void SetToAverage(unsigned hSquareSize, unsigned vSquareSize) {
ClearWeights();
_hSquareSize = hSquareSize;
_vSquareSize = vSquareSize;
_method = Average;
}
void SetToWeightedAverage(unsigned hSquareSize, unsigned vSquareSize,
long double hKernelSize, long double vKernelSize) {
ClearWeights();
_hSquareSize = hSquareSize;
_vSquareSize = vSquareSize;
_method = FastGaussianWeightedAverage;
_hKernelSize = hKernelSize;
_vKernelSize = vKernelSize;
}
void SetToMedianFilter(unsigned hSquareSize, unsigned vSquareSize) {
ClearWeights();
_hSquareSize = hSquareSize;
_vSquareSize = vSquareSize;
_method = Median;
}
void SetToMinimumFilter(unsigned hSquareSize, unsigned vSquareSize) {
ClearWeights();
_hSquareSize = hSquareSize;
_vSquareSize = vSquareSize;
_method = Minimum;
}
void SetToNone() {
ClearWeights();
_method = None;
}
void SetParameters(unsigned hSquareSize, unsigned vSquareSize,
enum Method method) {
ClearWeights();
_hSquareSize = hSquareSize;
_vSquareSize = vSquareSize;
_method = method;
}
virtual void Initialize(const TimeFrequencyData &input) final override;
//[[ deprecated("Trying to make surfacemethod go away") ]]
unsigned TaskCount();
virtual void PerformFit(unsigned taskNumber) final override;
TimeFrequencyData Background() const { return _background; }
private:
struct ThreadLocal {
LocalFitMethod *image;
unsigned currentX, currentY;
unsigned startX, startY, endX, endY;
size_t emptyWindows;
};
long double CalculateBackgroundValue(unsigned x, unsigned y);
long double FitBackground(unsigned x, unsigned y, ThreadLocal &local);
long double CalculateAverage(unsigned x, unsigned y, ThreadLocal &local);
long double CalculateMedian(unsigned x, unsigned y, ThreadLocal &local);
long double CalculateMinimum(unsigned x, unsigned y, ThreadLocal &local);
long double CalculateWeightedAverage(unsigned x, unsigned y,
ThreadLocal &local);
void ClearWeights();
void InitializeGaussianWeights();
void PerformGaussianConvolution(Image2DPtr input);
void CalculateWeightedAverageFast();
Image2DPtr CreateFlagWeightsMatrix();
void ElementWiseDivide(Image2DPtr leftHand, Image2DCPtr rightHand);
Image2DCPtr _original;
TimeFrequencyData _background;
Image2DPtr _background2D;
Mask2DCPtr _mask;
unsigned _hSquareSize, _vSquareSize;
num_t **_weights;
long double _hKernelSize, _vKernelSize;
enum Method _method;
};
#endif
|