10 #ifndef Statistics_HPP
11 #define Statistics_HPP
30 #include <arrayfire.h>
44 static float variance(
int start,
int offset,
const T *in,
int len)
54 af::array a_in = af::array(len, (in + start + offset));
56 _var = af::var<double>(a_in,
false);
61 for (
int i4 = start + offset; i4 < len + start; i4++)
63 xbar += *(in + i4) / n;
66 for (
int i4 = start + offset; i4 < len + start; i4++)
68 _var += (*(in + i4) - xbar) *(*(in + i4) - xbar);
71 _var = _var / (n - 1.0);
78 static void histogramIt(
const T *data_in,
int len,
int num_bins, T _min, T *&data_out)
84 af::array hist_in = af::array(len, data_in);
85 af::array hist_out = histogram(hist_in, num_bins, _min, 65530);
86 hist_out.host(data_out);
92 static void saveHistogramToFile(
const T *out_data,
int len) {}
95 static void cdfIt(
const T *in_data,
int len,
int num_bins,
float _min, T *&cdf_out) {}
101 template<
typename T,
typename F>
102 static void minMaxData(
const T *data_out,
int width,
int height, F &minVal, F &maxVal,
int trim = 0)
104 int image_size = width * height;
112 af::array a_in = af::array(image_size, data_out);
115 af::min(&myMin, &uIdx, a_in);
120 doSetTrimMaskArray(trim, width, height);
121 af::max(&myMax, &uIdx, a_in*trimMaskArray);
125 af::max(&myMax, &uIdx, a_in);
131 for (
int row = 0; row < height; row++)
133 for (
int col = 0; col < width; col++)
139 val = *(data_out + row * width + col);
144 else if (val < myMin)
152 minVal =
static_cast<F
>(myMin);
153 maxVal =
static_cast<F
>(myMax);
159 template<
typename T,
typename F>
160 static void minMaxData(std::vector<T> *data_out,
int w,
int h, F &minVal, F &maxVal,
int trim = 0)
162 return minMaxData(data_out->data(), w, h, minVal, maxVal, trim);
168 template<
typename T>
169 static void minMaxData(
const T *data_in,
int len, T &maxVal, T &minVal)
175 af::array a_in = af::array(len, data_in);
178 af::min(&myMin, &uIdx, a_in);
179 af::max(&myMax, &uIdx, a_in);
184 for (
int i = 0; i < len; i++)
186 T val = *(data_in + i);
191 else if (val < minVal)
199 static void minMaxDataTrim(
const unsigned short *data_out,
int w,
int h,
int trim,
double &minVal,
double &maxVal);
200 static void minMaxDataAvg(
const unsigned short *data_out,
int w,
int h,
int trim,
double &minVal,
double &maxVal);
202 template<
typename T,
typename F>
203 static void avgMatrixToLine(
const T* in,
int startRow,
int stopRow,
int w, F *&out)
205 double n = (double)(stopRow - startRow);
206 for (
int row = startRow; row < stopRow; row++)
208 for (
int col = 0; col < w; col++)
214 *(out + col) +=
static_cast<F
>(*(in + row * w + col) / n);
219 static void movingFilterLine(
float *&in,
int len,
int filter);
220 static void movingFilterLine(
const float *in,
int len,
int filter,
float *&out);
221 static void gradientLine(
float *&in,
int len);
222 static void gradientLine(
const float *in,
int len,
float *&out);
223 static void filterVector(std::vector<float> *sumOfVar);
225 template<
typename T>
226 static T localMaxVal(std::vector<T> *in,
int &myMaxIndex)
229 int len = (int)in->size();
230 myMaxIndex = len / 2;
231 return localMaxVal(in->data(), len, myMaxIndex);
242 myMaxIndex = len / 2;
248 af::array a_in = af::array(len, in);
251 af::max(&myMax, &uIdx, a_in);
255 for (
int i = 1; i < len - 1; i++)
258 T diff1 = val - *(in + i - 1);
259 T diff2 = *(in + i + 1) - val;
262 bool a = diff1 / std::abs(diff1) != diff2 / std::abs(diff2);
263 if ((val > myMax) && a)
276 static T maxVal(std::vector<T> *in,
int &myMaxIndex)
279 int len = (int)in->size();
282 myMaxIndex = len / 2;
286 array a_in = array(len, in);
288 max<T>(&myMax, &uIdx, a_in);
293 for (
int i4 = 0; i4 < len; i4++)
295 if ((*in)[i4] > myMax)
305 static bool isOscilating(
float *&in,
int len,
int posGradLimit);
309 static bool isVerbose;
310 static bool initArrayFire;
311 static void doInitArrayFire();
312 static void doSetTrimMaskArray(
int trimVal,
int w,
int h);
316 static af::array trimMaskArray;
318 static int mask_width;
319 static int mask_height;
Utility template functions.
Helper class to perform basic statistics.
Definition: Statistics.h:41
static void minMaxData(const T *data_in, int len, T &maxVal, T &minVal)
this is just a standard max-min.
Definition: Statistics.h:169
static T localMaxVal(const T *in, int len, int &myMaxIndex)
This is looking for a local max.
Definition: Statistics.h:239
static void minMaxData(const T *data_out, int width, int height, F &minVal, F &maxVal, int trim=0)
Determine the max and min values for a matrix (image) and trim the top - this is needed to ignore the...
Definition: Statistics.h:102
static void minMaxData(std::vector< T > *data_out, int w, int h, F &minVal, F &maxVal, int trim=0)
Same as above but with data in an array.
Definition: Statistics.h:160