QTrk
utils.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "std_incl.h"
4 #include "scalar_types.h"
5 
6 template<typename T> bool isNAN(const T& v) {
7  return !(v == v);
8 }
9 
10 void GetFormattedTimeString(char* output);
11 std::string GetCurrentOutputPath(bool ext = true);
12 
13 void dbgout(const std::string& s);
14 std::string SPrintf(const char *fmt, ...);
15 void dbgprintf(const char *fmt,...);
16 void dbgsetlogfile(const char*path);
17 
18 template<typename T>
19 void DeleteAllElems(T& c) {
20  for(typename T::iterator i=c.begin();i!=c.end();++i)
21  delete *i;
22  c.clear();
23 }
24 
25 
26 template<typename TPixel>
27 void normalize(TPixel* d, uint w,uint h)
28 {
29  TPixel maxv = d[0];
30  TPixel minv = d[0];
31  for (uint k=0;k<w*h;k++) {
32  maxv = std::max(maxv, d[k]);
33  minv = std::min(minv, d[k]);
34  }
35  for (uint k=0;k<w*h;k++)
36  d[k]=(d[k]-minv)/(maxv-minv);
37 }
38 
39 template<typename T>
40 inline T Lerp(T a, T b, float x) { return a + (b-a)*x; }
41 
42 template<typename T>
43 inline T Interpolate(T* image, int width, int height, float x,float y, bool* outside=0)
44 {
45  int rx=x, ry=y;
46  if (rx<0 || ry <0 || rx+1 >= width || ry+1>=height) {
47  if (outside) *outside=true;
48  return 0.0f;
49  }
50  if (outside) *outside=false;
51 
52  T v00 = image[width*ry+rx];
53  T v10 = image[width*ry+rx+1];
54  T v01 = image[width*(ry+1)+rx];
55  T v11 = image[width*(ry+1)+rx+1];
56 
57  T v0 = Lerp(v00, v10, x-rx);
58  T v1 = Lerp(v01, v11, x-rx);
59 
60  return Lerp(v0, v1, y-ry);
61 }
62 
63 template<typename T>
64 inline T Interpolate1D(T* d, int len, float x)
65 {
66  int fx = (int)x;
67  if (fx < 0) return d[0];
68  if (fx >= len-1) return d[len-1];
69  return (d[fx+1]-d[fx]) * (x-fx) + d[fx];
70 }
71 
72 template<typename T>
73 inline T Interpolate1D(const std::vector<T>& d, float x)
74 {
75  return Interpolate1D(&d[0],d.size(),x);
76 }
77 
78 template<typename T>
79 struct TImageData {
80  T* data;
81  int w,h;
82  TImageData() { data=0;w=h=0;}
83  TImageData(T *d, int w, int h) : data(d), w(w),h(h) {}
84  template<typename Ta> void set(Ta *src) { for (int i=0;i<w*h;i++) data[i] = src[i]; }
85  template<typename Ta> void set(const TImageData<Ta> &src) {
86  if (!data || numPixels()!=src.numPixels()) {
87  free();
88  w=src.w; h=src.h;
89  if(src.data) { data=new T[src.w*src.h]; }
90  }
91  set(src.data);
92  }
93  void copyTo(float *dst) {
94  for (int i=0;i<w*h;i++) dst[i]=data[i];
95  }
96  T& at(int x, int y) { return data[w*y+x]; }
97  T interpolate(float x, float y, bool *outside=0) { return Interpolate(data, w,h, x,y,outside); }
98  T interpolate1D(int y, float x) { return Interpolate1D(&data[w*y], w, x); }
99  int numPixels() const { return w*h; }
100  int pitch() const { return sizeof(T)*w; } // bytes per line
101  void normalize() { ::normalize(data,w,h); }
102  T mean() {
103  T s=0.0f;
104  for(int x=0;x<w*h;x++)
105  s+=data[x];
106  return s/(w*h);
107  }
108  T& operator[](int i) { return data[i]; }
109 
110  static TImageData alloc(int w,int h) { return TImageData<T>(new T[w*h], w,h); }
111  void free() { if(data) delete[] data;data=0; }
112  void writeAsCSV(const char *filename, const char *labels[]=0) { WriteImageAsCSV(filename, data, w,h,labels); }
113 };
114 
115 class CImageData : public TImageData<float> {
116 public:
117  CImageData(int w,int h) : TImageData<float>(new float[w*h],w,h) {
118  }
119  CImageData(const CImageData& other) {
120  data=0; set(other);
121  }
123  ~CImageData() { free(); }
125  data=0; set(src);
126  }
127 
129  set(src);
130  return *this;
131  }
133  set(src);
134  return *this;
135  }
136 };
137 
138 template<typename T>
139 T StdDeviation(T* start, T* end) {
140  T sum=0,sum2=0;
141  for (T* s = start; s!=end; ++s) {
142  sum+=*s; sum2+=(*s)*(*s);
143  }
144 
145  T invN = 1.0f/(end-start);
146  T mean = sum * invN;
147  return sqrt(sum2 * invN - mean * mean);
148 }
149 
150 
153 
154 std::vector<float> ComputeRadialBinWindow(int rsteps);
155 float ComputeBgCorrectedCOM1D(float *data, int len, float cf=2.0f);
156 void ComputeCRP(float* dst, int radialSteps, int angularSteps, float minradius, float maxradius, vector2f center, ImageData* src,float mean, float*crpmap=0);
157 void ComputeRadialProfile(float* dst, int radialSteps, int angularSteps, float minradius, float maxradius, vector2f center, ImageData* src, float mean, bool normalize);
158 void NormalizeRadialProfile(float* prof, int rsteps);
159 void NormalizeZLUT(float *zlut, int numLUTs, int planes, int radialsteps);
160 void GenerateImageFromLUT(ImageData* image, ImageData* zlut, float minradius, float maxradius, vector3f pos, bool useSplineInterp=true, int ovs=4);
161 void ApplyPoissonNoise(ImageData& img, float poissonMax, float maxValue=255);
162 void ApplyGaussianNoise(ImageData& img, float sigma);
163 
164 void WriteComplexImageAsCSV(const char* file, std::complex<float>* d, int w,int h, const char *labels[]=0);
165 void WriteArrayAsCSVRow(const char *file, float* d, int len, bool append);
166 void WriteVectorAsCSVRow(const char *file, std::vector<float> d, bool append);
167 void WriteImageAsCSV(const char* file, float* d, int w,int h, const char *labels[]=0);
168 std::vector< std::vector<float> > ReadCSV(const char *filename, char sep='\t');
169 std::vector<vector3f> ReadVector3CSV( const char *file, char sep='\t');
170 
171 void WriteTrace(std::string file, vector3f* results, int nResults);
172 void GenerateTestImage(ImageData& img, float xp, float yp, float size, float MaxPhotons);
173 
174 std::string GetLocalModuleFilename();
175 std::string GetLocalModulePath();
176 std::string GetDirectoryFromPath(std::string fullpath);
177 
179  PathSeperator(std::string fullpath);
180  std::string filename, extension, directory;
181 };
182 
183 std::string file_ext(const char *f);
184 
185 ImageData ReadJPEGFile(const char *fn);
186 ImageData ReadLUTFile(const char *lutfile);
187 int ReadJPEGFile(uchar* srcbuf, int srclen, uchar** data, int* width, int*height);
188 void WriteJPEGFile(uchar* data,int w,int h, const char * filename, int quality);
189 void FloatToJPEGFile (const char *name, const float* d, int w,int h);
190 inline void WriteJPEGFile(const char *name, const ImageData& img) { FloatToJPEGFile(name, img.data, img.w,img.h); }
191 int NearestPowerOf2(int v);
192 int NearestPowerOf3(int v);
193 void GenerateGaussianSpotImage(ImageData* img, vector2f pos, float sigma, float I0, float Ibg);
194 
195 std::vector<uchar> ReadToByteBuffer(const char* filename);
196 double GetPreciseTime();
197 
198 template<typename T>
199 void floatToNormalizedInt(T* dst, const float *src, uint w,uint h, T maxValue)
200 {
201  float maxv = src[0];
202  float minv = src[0];
203  for (uint k=0;k<w*h;k++) {
204  maxv = std::max(maxv, src[k]);
205  minv = std::min(minv, src[k]);
206  }
207  for (uint k=0;k<w*h;k++)
208  dst[k] = maxValue * (src[k]-minv) / (maxv-minv);
209 }
210 
211 
212 template<typename T>
213 T* floatToNormalizedInt(const float *src, uint w,uint h, T maxValue)
214 {
215  T* r = new T[w*h];
216  floatToNormalizedInt(r,src,w,h, maxValue);
217  return r;
218 }
219 
220 template<typename T>
221 T ComputeStdDev(T* data, int len)
222 {
223  T sum = 0.0, sum2=0.0;
224  for (int a=0;a<len;a++) {
225  sum+=data[a];
226  sum2+=data[a]*data[a];
227  }
228  T mean = sum / len;
229  return sqrt(sum2 / len- mean * mean);
230 }
231 
232 template<typename T>
233 T qselect(T* data, int start, int end, int k)
234 {
235  if (end-start==1)
236  return data[start];
237 
238  // select one of the elements as pivot
239  int p = 0;
240  T value = data[p+start];
241  // swap with last value
242  std::swap(data[p+start], data[end-1]);
243 
244  // move all items < pivot to the left
245  int nSmallerItems=0;
246  for(int i=start;i<end-1;i++)
247  if(data[i]<value) {
248  std::swap(data[i], data[start+nSmallerItems]);
249  nSmallerItems++;
250  }
251  // pivot is now at [# items < pivot]
252  std::swap(data[start+nSmallerItems], data[end-1]);
253 
254  // we are trying to find the kth element
255  // so if pivotpos == k, we found it
256  // if k < pivotpos, we need to recurse left side
257  // if k > pivotpos, we need to recurse right side
258  int pivotpos = start+nSmallerItems;
259  if (k == pivotpos)
260  return data[k];
261  else if (k < pivotpos)
262  return qselect(data, start, pivotpos, k);
263  else
264  return qselect(data, pivotpos+1, end, k);
265 }
266 
268 {
269 public:
270  Matrix3X3() { for(int i=0;i<9;i++) m[i]=0.0f; }
272  row(0) = x;
273  row(1) = y;
274  row(2) = z;
275  }
276 
277  vector3f diag() const { return vector3f(at(0,0),at(1,1),at(2,2)); }
278 
279  float& operator[](int i) { return m[i]; }
280  const float& operator[](int i) const { return m[i]; }
281 
282  vector3f& row(int i) { return *(vector3f*)&m[i*3]; }
283  const vector3f& row(int i) const { return *(vector3f*)&m[i*3]; }
284 
285  float& operator()(int i, int j) { return m[3*i+j]; }
286  const float& operator()(int i, int j) const { return m[3*i+j]; }
287 
288  float& at(int i,int j) { return m[3*i+j]; }
289  const float& at(int i,int j) const { return m[3*i+j]; }
290 
291  float Determinant() const
292  {
293  return at(0,0)*(at(1,1)*at(2,2)-at(2,1)*at(1,2))
294  -at(0,1)*(at(1,0)*at(2,2)-at(1,2)*at(2,0))
295  +at(0,2)*(at(1,0)*at(2,1)-at(1,1)*at(2,0));
296  }
297 
299  {
300  float det = Determinant();
301  if (det != 0.0f) {
302  float invdet = 1/det;
303  Matrix3X3 result;
304  result(0,0) = (at(1,1)*at(2,2)-at(2,1)*at(1,2))*invdet;
305  result(1,0) = -(at(0,1)*at(2,2)-at(0,2)*at(2,1))*invdet;
306  result(2,0) = (at(0,1)*at(1,2)-at(0,2)*at(1,1))*invdet;
307  result(0,1) = -(at(1,0)*at(2,2)-at(1,2)*at(2,0))*invdet;
308  result(1,1) = (at(0,0)*at(2,2)-at(0,2)*at(2,0))*invdet;
309  result(2,1) = -(at(0,0)*at(1,2)-at(1,0)*at(0,2))*invdet;
310  result(0,2) = (at(1,0)*at(2,1)-at(2,0)*at(1,1))*invdet;
311  result(1,2) = -(at(0,0)*at(2,1)-at(2,0)*at(0,1))*invdet;
312  result(2,2) = (at(0,0)*at(1,1)-at(1,0)*at(0,1))*invdet;
313  return result;
314  }
315  return Matrix3X3();
316  }
318  {
319  float det = Determinant();
320  if (det != 0.0f) {
321  float invdet = 1/det;
322  Matrix3X3 result;
323  result(0,0) = (at(1,1)*at(2,2)-at(2,1)*at(1,2))*invdet;
324  result(0,1) = -(at(0,1)*at(2,2)-at(0,2)*at(2,1))*invdet;
325  result(0,2) = (at(0,1)*at(1,2)-at(0,2)*at(1,1))*invdet;
326  result(1,0) = -(at(1,0)*at(2,2)-at(1,2)*at(2,0))*invdet;
327  result(1,1) = (at(0,0)*at(2,2)-at(0,2)*at(2,0))*invdet;
328  result(1,2) = -(at(0,0)*at(1,2)-at(1,0)*at(0,2))*invdet;
329  result(2,0) = (at(1,0)*at(2,1)-at(2,0)*at(1,1))*invdet;
330  result(2,1) = -(at(0,0)*at(2,1)-at(2,0)*at(0,1))*invdet;
331  result(2,2) = (at(0,0)*at(1,1)-at(1,0)*at(0,1))*invdet;
332  return result;
333  }
334  return Matrix3X3();
335  }
336 
337  Matrix3X3& operator*=(float a) {
338  for(int i=0;i<9;i++)
339  m[i]*=a;
340  return *this;
341  }
342 
344  for(int i=0;i<9;i++)
345  m[i]+=b[i];
346  return *this;
347  }
348 
349  float m[9];
350 
351  static void test()
352  {
353  Matrix3X3 t;
354 
355  for (int i=0;i<9;i++)
356  t[i]=i*i;
357  t.Inverse().dbgprint();
358  }
359 
360  void dbgprint()
361  {
362  dbgprintf("%f\t%f\t%f\n", m[0],m[1],m[2]);
363  dbgprintf("%f\t%f\t%f\n", m[3],m[4],m[5]);
364  dbgprintf("%f\t%f\t%f\n", m[6],m[7],m[8]);
365  }
366 
367 };
368 
369 
370 
371 
372 template<typename T>
373 T erf(T x)
374 {
375  // constants
376  T a1 = 0.254829592f;
377  T a2 = -0.284496736f;
378  T a3 = 1.421413741f;
379  T a4 = -1.453152027f;
380  T a5 = 1.061405429f;
381  T p = 0.3275911f;
382 
383  // Save the sign of x
384  int sign = 1;
385  if (x < 0)
386  sign = -1;
387  x = fabs(x);
388 
389  // A&S formula 7.1.26
390  T t = 1.0f/(1.0f + p*x);
391  T y = 1.0f - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);
392 
393  return sign*y;
394 }
395 
396 
~CImageData()
Definition: utils.h:123
vector3f & row(int i)
Definition: utils.h:282
void NormalizeZLUT(float *zlut, int numLUTs, int planes, int radialsteps)
Definition: utils.cpp:291
Matrix3X3()
Definition: utils.h:270
std::string filename
Definition: utils.h:180
int NearestPowerOf2(int v)
Definition: utils.cpp:679
void dbgprint()
Definition: utils.h:360
void WriteComplexImageAsCSV(const char *file, std::complex< float > *d, int w, int h, const char *labels[]=0)
Definition: utils.cpp:579
std::string GetLocalModuleFilename()
Definition: utils.cpp:54
std::string SPrintf(const char *fmt,...)
Definition: utils.cpp:132
void FloatToJPEGFile(const char *name, const float *d, int w, int h)
Definition: fastjpg.cpp:189
CImageData()
Definition: utils.h:122
const vector3f & row(int i) const
Definition: utils.h:283
float ComputeBgCorrectedCOM1D(float *data, int len, float cf=2.0f)
Definition: utils.cpp:231
void GenerateImageFromLUT(ImageData *image, ImageData *zlut, float minradius, float maxradius, vector3f pos, bool useSplineInterp=true, int ovs=4)
Definition: utils.cpp:354
T interpolate1D(int y, float x)
Definition: utils.h:98
void floatToNormalizedInt(T *dst, const float *src, uint w, uint h, T maxValue)
Definition: utils.h:199
Matrix3X3 & operator*=(float a)
Definition: utils.h:337
const float & operator()(int i, int j) const
Definition: utils.h:286
T qselect(T *data, int start, int end, int k)
Definition: utils.h:233
unsigned int uint
Definition: std_incl.h:127
float Determinant() const
Definition: utils.h:291
T erf(T x)
Definition: utils.h:373
void ApplyGaussianNoise(ImageData &img, float sigma)
Definition: utils.cpp:454
void GenerateTestImage(ImageData &img, float xp, float yp, float size, float MaxPhotons)
Definition: utils.cpp:162
bool isNAN(const T &v)
Definition: utils.h:6
CImageData(const TImageData< float > &src)
Definition: utils.h:124
Matrix3X3(vector3f x, vector3f y, vector3f z)
Definition: utils.h:271
void normalize(TPixel *d, uint w, uint h)
Definition: utils.h:27
void dbgsetlogfile(const char *path)
Definition: utils.cpp:49
void ApplyPoissonNoise(ImageData &img, float poissonMax, float maxValue=255)
Definition: utils.cpp:432
std::string GetCurrentOutputPath(bool ext=true)
Definition: utils.cpp:19
std::string file_ext(const char *f)
Definition: utils.cpp:121
vector3< T > sqrt(const vector3< T > &a)
Definition: std_incl.h:112
CImageData(const CImageData &other)
Definition: utils.h:119
ImageData ReadLUTFile(const char *lutfile)
Definition: utils.cpp:720
void WriteVectorAsCSVRow(const char *file, std::vector< float > d, bool append)
Definition: utils.cpp:523
void WriteJPEGFile(uchar *data, int w, int h, const char *filename, int quality)
Definition: fastjpg.cpp:89
int numPixels() const
Definition: utils.h:99
std::string GetDirectoryFromPath(std::string fullpath)
Definition: utils.cpp:104
TImageData< float > ImageData
Definition: utils.h:151
T interpolate(float x, float y, bool *outside=0)
Definition: utils.h:97
static TImageData alloc(int w, int h)
Definition: utils.h:110
void normalize()
Definition: utils.h:101
T ComputeStdDev(T *data, int len)
Definition: utils.h:221
T Lerp(T a, T b, float x)
Definition: utils.h:40
void NormalizeRadialProfile(float *prof, int rsteps)
Definition: utils.cpp:257
Matrix3X3 & operator+=(const Matrix3X3 &b)
Definition: utils.h:343
void writeAsCSV(const char *filename, const char *labels[]=0)
Definition: utils.h:112
Matrix3X3 Inverse() const
Definition: utils.h:298
int pitch() const
Definition: utils.h:100
std::vector< vector3f > ReadVector3CSV(const char *file, char sep='\t')
Definition: utils.cpp:494
Matrix3X3 InverseTranspose() const
Definition: utils.h:317
std::vector< uchar > ReadToByteBuffer(const char *filename)
Definition: utils.cpp:608
float & operator[](int i)
Definition: utils.h:279
vector3f diag() const
Definition: utils.h:277
int NearestPowerOf3(int v)
Definition: utils.cpp:689
CImageData(int w, int h)
Definition: utils.h:117
TImageData(T *d, int w, int h)
Definition: utils.h:83
void ComputeCRP(float *dst, int radialSteps, int angularSteps, float minradius, float maxradius, vector2f center, ImageData *src, float mean, float *crpmap=0)
Definition: utils.cpp:181
void free()
Definition: utils.h:111
const float & at(int i, int j) const
Definition: utils.h:289
void DeleteAllElems(T &c)
Definition: utils.h:19
const float & operator[](int i) const
Definition: utils.h:280
void dbgprintf(const char *fmt,...)
Definition: utils.cpp:149
void GenerateGaussianSpotImage(ImageData *img, vector2f pos, float sigma, float I0, float Ibg)
Definition: utils.cpp:421
void dbgout(const std::string &s)
Definition: utils.cpp:143
void WriteImageAsCSV(const char *file, float *d, int w, int h, const char *labels[]=0)
Definition: utils.cpp:551
T mean()
Definition: utils.h:102
CImageData & operator=(const CImageData &src)
Definition: utils.h:128
int h
Definition: utils.h:81
static void test()
Definition: utils.h:351
vector3< float > vector3f
Definition: std_incl.h:114
T Interpolate(T *image, int width, int height, float x, float y, bool *outside=0)
Definition: utils.h:43
T & at(int x, int y)
Definition: utils.h:96
double GetPreciseTime()
Definition: utils.cpp:669
std::vector< std::vector< float > > ReadCSV(const char *filename, char sep='\t')
Definition: utils.cpp:463
T & operator[](int i)
Definition: utils.h:108
TImageData< double > ImageDatad
Definition: utils.h:152
CImageData & operator=(const TImageData< float > &src)
Definition: utils.h:132
TImageData()
Definition: utils.h:82
std::vector< float > ComputeRadialBinWindow(int rsteps)
Calculate the radial weights for ZLUT profile comparisons.
Definition: utils.cpp:706
float & at(int i, int j)
Definition: utils.h:288
T StdDeviation(T *start, T *end)
Definition: utils.h:139
float & operator()(int i, int j)
Definition: utils.h:285
void ComputeRadialProfile(float *dst, int radialSteps, int angularSteps, float minradius, float maxradius, vector2f center, ImageData *src, float mean, bool normalize)
Definition: utils.cpp:298
T Interpolate1D(T *d, int len, float x)
Definition: utils.h:64
void copyTo(float *dst)
Definition: utils.h:93
ImageData ReadJPEGFile(const char *fn)
Definition: utils.cpp:626
std::string GetLocalModulePath()
Definition: utils.cpp:114
void WriteArrayAsCSVRow(const char *file, float *d, int len, bool append)
Definition: utils.cpp:537
void GetFormattedTimeString(char *output)
Definition: utils.cpp:38
void WriteTrace(std::string file, vector3f *results, int nResults)
Definition: utils.cpp:507
unsigned char uchar
Definition: std_incl.h:130
int w
Definition: utils.h:81
T * data
Definition: utils.h:80