Commit 1a224b6afb9d52b8a3f6bb90f0e794e1eadcfaf3
1 parent
c30dd3e6
fixed linux compatibility issues
Showing
5 changed files
with
221 additions
and
222 deletions
Show diff stats
stim/envi/bil.h
... | ... | @@ -3,8 +3,10 @@ |
3 | 3 | |
4 | 4 | #include "../envi/envi_header.h" |
5 | 5 | #include "../envi/hsi.h" |
6 | +#include "../math/fd_coefficients.h" | |
6 | 7 | #include <cstring> |
7 | 8 | #include <utility> |
9 | +#include <deque> | |
8 | 10 | |
9 | 11 | namespace stim{ |
10 | 12 | |
... | ... | @@ -22,26 +24,14 @@ template <typename T> |
22 | 24 | class bil: public hsi<T> { |
23 | 25 | |
24 | 26 | protected: |
25 | - | |
26 | - //std::vector<double> w; //band wavelengths | |
27 | 27 | |
28 | - /*unsigned long long X(){ | |
29 | - return R[0]; | |
30 | - } | |
31 | - unsigned long long Y(){ | |
32 | - return R[2]; | |
33 | - } | |
34 | - unsigned long long Z(){ | |
35 | - return R[1]; | |
36 | - }*/ | |
28 | + | |
37 | 29 | using hsi<T>::w; //use the wavelength array in stim::hsi |
38 | 30 | using hsi<T>::nnz; |
39 | 31 | using binary<T>::progress; |
40 | - | |
41 | - /// Call the binary nnz() function for the BIL orientation | |
42 | - //unsigned long long nnz(unsigned char* mask){ | |
43 | - // return binary<T>::nnz(mask, X()*Y()); | |
44 | - //} | |
32 | + using hsi<T>::X; | |
33 | + using hsi<T>::Y; | |
34 | + using hsi<T>::Z; | |
45 | 35 | |
46 | 36 | public: |
47 | 37 | |
... | ... | @@ -59,11 +49,11 @@ public: |
59 | 49 | /// @param B is the number of samples (bands) along dimension 3 |
60 | 50 | /// @param header_offset is the number of bytes (if any) in the binary header |
61 | 51 | /// @param wavelengths is an optional STL vector of size B specifying a numerical label for each band |
62 | - bool open(std::string filename, | |
63 | - unsigned long long X, | |
64 | - unsigned long long Y, | |
65 | - unsigned long long B, | |
66 | - unsigned long long header_offset, | |
52 | + bool open(std::string filename, | |
53 | + unsigned long long X, | |
54 | + unsigned long long Y, | |
55 | + unsigned long long B, | |
56 | + unsigned long long header_offset, | |
67 | 57 | std::vector<double> wavelengths){ |
68 | 58 | |
69 | 59 | w = wavelengths; |
... | ... | @@ -113,7 +103,7 @@ public: |
113 | 103 | unsigned long long S = XY * sizeof(T); //calculate the number of bytes of a band |
114 | 104 | |
115 | 105 | unsigned long long page=0; //bands around the wavelength |
116 | - | |
106 | + | |
117 | 107 | |
118 | 108 | //get the bands numbers around the wavelength |
119 | 109 | |
... | ... | @@ -173,7 +163,7 @@ public: |
173 | 163 | |
174 | 164 | //if wavelength is smaller than the first one in header file |
175 | 165 | if ( w[page] > wavelength ){ |
176 | - memcpy(p, c, L); | |
166 | + memcpy(p, c, L); | |
177 | 167 | return true; |
178 | 168 | } |
179 | 169 | |
... | ... | @@ -193,16 +183,16 @@ public: |
193 | 183 | |
194 | 184 | memcpy(p1, c + (page - 1) * X(), L); |
195 | 185 | memcpy(p2, c + page * X(), L); |
196 | - | |
186 | + | |
197 | 187 | for(unsigned long long i=0; i < X(); i++){ |
198 | 188 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
199 | 189 | p[i] = (T)(((double)p2[i] - (double)p1[i]) * r + (double)p1[i]); |
200 | 190 | } |
201 | 191 | } |
202 | - else //if the wavelength is equal to a wavelength in header file | |
192 | + else //if the wavelength is equal to a wavelength in header file | |
203 | 193 | memcpy(p, c + page * X(), L); |
204 | - | |
205 | - return true; | |
194 | + | |
195 | + return true; | |
206 | 196 | } |
207 | 197 | |
208 | 198 | /// Retrieve a single spectrum (B-axis line) at a given (x, y) location and stores it in pre-allocated memory. |
... | ... | @@ -227,24 +217,24 @@ public: |
227 | 217 | //get the pixel |
228 | 218 | return spectrum(p, x, y); |
229 | 219 | } |
230 | - | |
220 | + | |
231 | 221 | //given a Y ,return a XZ slice |
232 | 222 | bool read_plane_y(T * p, unsigned long long y){ |
233 | 223 | return binary<T>::read_plane_2(p, y); |
234 | 224 | } |
235 | 225 | |
236 | - | |
226 | + | |
237 | 227 | /// Perform baseline correction given a list of baseline points and stores the result in a new BSQ file. |
238 | 228 | |
239 | 229 | /// @param outname is the name of the output file used to store the resulting baseline-corrected data. |
240 | 230 | /// @param wls is the list of baseline points based on band labels. |
241 | 231 | bool baseline(std::string outname, std::vector<double> wls, unsigned char* mask = NULL, bool PROGRESS = false){ |
242 | - | |
232 | + | |
243 | 233 | unsigned long long N = wls.size(); //get the number of baseline points |
244 | - | |
234 | + | |
245 | 235 | std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file |
246 | - std::string headername = outname + ".hdr"; //the header file name | |
247 | - | |
236 | + std::string headername = outname + ".hdr"; //the header file name | |
237 | + | |
248 | 238 | //simplify image resolution |
249 | 239 | unsigned long long ZX = Z() * X(); //calculate the number of points in a Y slice |
250 | 240 | unsigned long long L = ZX * sizeof(T); //calculate the number of bytes of a Y slice |
... | ... | @@ -252,10 +242,10 @@ public: |
252 | 242 | |
253 | 243 | T* c; //pointer to the current Y slice |
254 | 244 | c = (T*)malloc(L); //memory allocation |
255 | - | |
245 | + | |
256 | 246 | T* a; //pointer to the two YZ lines surrounding the current YZ line |
257 | 247 | T* b; |
258 | - | |
248 | + | |
259 | 249 | a = (T*)malloc(X() * sizeof(T)); |
260 | 250 | b = (T*)malloc(X() * sizeof(T)); |
261 | 251 | |
... | ... | @@ -269,19 +259,19 @@ public: |
269 | 259 | exit(1); |
270 | 260 | } |
271 | 261 | // loop start correct every y slice |
272 | - | |
262 | + | |
273 | 263 | for (unsigned long long k =0; k < Y(); k++) |
274 | 264 | { |
275 | 265 | //get the current y slice |
276 | 266 | read_plane_y(c, k); |
277 | - | |
278 | - //initialize lownum, highnum, low, high | |
267 | + | |
268 | + //initialize lownum, highnum, low, high | |
279 | 269 | ai = w[0]; |
280 | 270 | control=0; |
281 | 271 | //if no baseline point is specified at band 0, |
282 | 272 | //set the baseline point at band 0 to 0 |
283 | 273 | if(wls[0] != w[0]){ |
284 | - bi = wls[control]; | |
274 | + bi = wls[control]; | |
285 | 275 | memset(a, (char)0, X() * sizeof(T) ); |
286 | 276 | } |
287 | 277 | //else get the low band |
... | ... | @@ -292,39 +282,39 @@ public: |
292 | 282 | } |
293 | 283 | //get the high band |
294 | 284 | read_x_from_xz(b, c, bi); |
295 | - | |
285 | + | |
296 | 286 | //correct every YZ line |
297 | - | |
287 | + | |
298 | 288 | for(unsigned long long cii = 0; cii < B; cii++){ |
299 | 289 | |
300 | 290 | //update baseline points, if necessary |
301 | 291 | if( w[cii] >= bi && cii != B - 1) { |
302 | 292 | //if the high band is now on the last BL point |
303 | 293 | if (control != N-1) { |
304 | - | |
294 | + | |
305 | 295 | control++; //increment the index |
306 | - | |
296 | + | |
307 | 297 | std::swap(a, b); //swap the baseline band pointers |
308 | - | |
298 | + | |
309 | 299 | ai = bi; |
310 | 300 | bi = wls[control]; |
311 | 301 | read_x_from_xz(b, c, bi); |
312 | - | |
302 | + | |
313 | 303 | } |
314 | 304 | //if the last BL point on the last band of the file? |
315 | 305 | else if ( wls[control] < w[B - 1]) { |
316 | - | |
306 | + | |
317 | 307 | std::swap(a, b); //swap the baseline band pointers |
318 | - | |
308 | + | |
319 | 309 | memset(b, (char)0, X() * sizeof(T) ); //clear the high band |
320 | - | |
310 | + | |
321 | 311 | ai = bi; |
322 | 312 | bi = w[B - 1]; |
323 | 313 | } |
324 | 314 | } |
325 | - | |
315 | + | |
326 | 316 | ci = w[cii]; |
327 | - | |
317 | + | |
328 | 318 | unsigned long long jump = cii * X(); |
329 | 319 | //perform the baseline correction |
330 | 320 | for(unsigned i=0; i < X(); i++) |
... | ... | @@ -332,22 +322,22 @@ public: |
332 | 322 | double r = (double) (ci - ai) / (double) (bi - ai); |
333 | 323 | c[i + jump] =(T) ( c[i + jump] - (b[i] - a[i]) * r - a[i] ); |
334 | 324 | } |
335 | - | |
336 | - }//loop for YZ line end | |
337 | - target.write(reinterpret_cast<const char*>(c), L); //write the corrected data into destination | |
325 | + | |
326 | + }//loop for YZ line end | |
327 | + target.write(reinterpret_cast<const char*>(c), L); //write the corrected data into destination | |
338 | 328 | |
339 | 329 | if(PROGRESS) progress = (double)(k+1) / Y() * 100; |
340 | - }//loop for Y slice end | |
341 | - | |
330 | + }//loop for Y slice end | |
331 | + | |
342 | 332 | free(a); |
343 | 333 | free(b); |
344 | 334 | free(c); |
345 | 335 | target.close(); |
346 | 336 | |
347 | - return true; | |
348 | - | |
337 | + return true; | |
338 | + | |
349 | 339 | } |
350 | - | |
340 | + | |
351 | 341 | /// Normalize all spectra based on the value of a single band, storing the result in a new BSQ file. |
352 | 342 | |
353 | 343 | /// @param outname is the name of the output file used to store the resulting baseline-corrected data. |
... | ... | @@ -358,7 +348,7 @@ public: |
358 | 348 | unsigned long long B = Z(); //calculate the number of bands |
359 | 349 | unsigned long long ZX = Z() * X(); |
360 | 350 | unsigned long long XY = X() * Y(); //calculate the number of pixels in a band |
361 | - unsigned long long S = XY * sizeof(T); //calculate the number of bytes in a band | |
351 | + unsigned long long S = XY * sizeof(T); //calculate the number of bytes in a band | |
362 | 352 | unsigned long long L = ZX * sizeof(T); |
363 | 353 | |
364 | 354 | std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file |
... | ... | @@ -368,7 +358,7 @@ public: |
368 | 358 | T * b; //pointer to the standard band |
369 | 359 | |
370 | 360 | b = (T*)malloc( S ); //memory allocation |
371 | - c = (T*)malloc( L ); | |
361 | + c = (T*)malloc( L ); | |
372 | 362 | |
373 | 363 | band(b, w); //get the certain band into memory |
374 | 364 | |
... | ... | @@ -383,13 +373,13 @@ public: |
383 | 373 | c[m + i * X()] = (T)0.0; |
384 | 374 | else |
385 | 375 | c[m + i * X()] = c[m + i * X()] / b[m + j * X()]; |
386 | - } | |
376 | + } | |
387 | 377 | } |
388 | 378 | target.write(reinterpret_cast<const char*>(c), L); //write normalized data into destination |
389 | 379 | |
390 | 380 | if(PROGRESS) progress = (double)(j+1) / Y() * 100; |
391 | 381 | } |
392 | - | |
382 | + | |
393 | 383 | free(b); |
394 | 384 | free(c); |
395 | 385 | target.close(); |
... | ... | @@ -397,26 +387,26 @@ public: |
397 | 387 | } |
398 | 388 | |
399 | 389 | void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){} |
400 | - | |
390 | + | |
401 | 391 | /// Convert the current BIL file to a BSQ file with the specified file name. |
402 | 392 | |
403 | 393 | /// @param outname is the name of the output BSQ file to be saved to disk. |
404 | 394 | bool bsq(std::string outname, bool PROGRESS = false) |
405 | 395 | { |
406 | 396 | unsigned long long S = X() * Y() * sizeof(T); //calculate the number of bytes in a band |
407 | - | |
397 | + | |
408 | 398 | std::ofstream target(outname.c_str(), std::ios::binary); |
409 | 399 | std::string headername = outname + ".hdr"; |
410 | - | |
400 | + | |
411 | 401 | T * p; //pointer to the current band |
412 | 402 | p = (T*)malloc(S); |
413 | - | |
403 | + | |
414 | 404 | for ( unsigned long long i = 0; i < Z(); i++) |
415 | - { | |
405 | + { | |
416 | 406 | band_index(p, i); |
417 | 407 | target.write(reinterpret_cast<const char*>(p), S); //write a band data into target file |
418 | 408 | |
419 | - if(PROGRESS) progress = (double)(i+1) / Z() * 100; //store the progress for the current operation | |
409 | + if(PROGRESS) progress = (double)(i+1) / Z() * 100; //store the progress for the current operation | |
420 | 410 | } |
421 | 411 | |
422 | 412 | free(p); |
... | ... | @@ -430,17 +420,17 @@ public: |
430 | 420 | bool bip(std::string outname, bool PROGRESS = false) |
431 | 421 | { |
432 | 422 | unsigned long long S = X() * Z() * sizeof(T); //calculate the number of bytes in a ZX slice |
433 | - | |
423 | + | |
434 | 424 | std::ofstream target(outname.c_str(), std::ios::binary); |
435 | 425 | std::string headername = outname + ".hdr"; |
436 | - | |
426 | + | |
437 | 427 | T * p; //pointer to the current XZ slice for bil file |
438 | 428 | p = (T*)malloc(S); |
439 | 429 | T * q; //pointer to the current ZX slice for bip file |
440 | 430 | q = (T*)malloc(S); |
441 | - | |
431 | + | |
442 | 432 | for ( unsigned long long i = 0; i < Y(); i++) |
443 | - { | |
433 | + { | |
444 | 434 | read_plane_y(p, i); |
445 | 435 | for ( unsigned long long k = 0; k < Z(); k++) |
446 | 436 | { |
... | ... | @@ -448,10 +438,10 @@ public: |
448 | 438 | for ( unsigned long long j = 0; j < X(); j++) |
449 | 439 | q[k + j * Z()] = p[ks + j]; |
450 | 440 | |
451 | - if(PROGRESS) progress = (double)((i+1) * Z() + k+1) / (Z() * Y()) * 100; //store the progress for the current operation | |
441 | + if(PROGRESS) progress = (double)((i+1) * Z() + k+1) / (Z() * Y()) * 100; //store the progress for the current operation | |
452 | 442 | } |
453 | - | |
454 | - target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
443 | + | |
444 | + target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
455 | 445 | } |
456 | 446 | |
457 | 447 | free(p); |
... | ... | @@ -498,7 +488,7 @@ public: |
498 | 488 | rp = (T*) malloc(S); |
499 | 489 | |
500 | 490 | band(lp, lb); |
501 | - band(rp, rb); | |
491 | + band(rp, rb); | |
502 | 492 | |
503 | 493 | baseline_band(lb, rb, lp, rp, bandwavelength, result); |
504 | 494 | |
... | ... | @@ -570,7 +560,7 @@ public: |
570 | 560 | } |
571 | 561 | baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part |
572 | 562 | baseline_band(lb, rb, lp, rp, w[ai], cur); |
573 | - for(unsigned long long j = 0; j < XY; j++){ | |
563 | + for(unsigned long long j = 0; j < XY; j++){ | |
574 | 564 | result[j] += (T)((w[ai] - lab) * ((double)cur[j] + (double)cur2[j]) / 2.0); |
575 | 565 | } |
576 | 566 | |
... | ... | @@ -581,7 +571,7 @@ public: |
581 | 571 | baseline_band(lb, rb, lp, rp, w[ai], cur2); |
582 | 572 | for(unsigned long long j = 0; j < XY; j++) |
583 | 573 | { |
584 | - result[j] += (T)((w[ai] - w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 2.0); | |
574 | + result[j] += (T)((w[ai] - w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 2.0); | |
585 | 575 | } |
586 | 576 | std::swap(cur,cur2); //swap the band pointers |
587 | 577 | } |
... | ... | @@ -606,7 +596,7 @@ public: |
606 | 596 | |
607 | 597 | T* p1 = (T*)malloc(X() * Y() * sizeof(T)); |
608 | 598 | T* p2 = (T*)malloc(X() * Y() * sizeof(T)); |
609 | - | |
599 | + | |
610 | 600 | //get the two peak band |
611 | 601 | height(lb1, rb1, pos1, p1); |
612 | 602 | height(lb2, rb2, pos2, p2); |
... | ... | @@ -620,9 +610,9 @@ public: |
620 | 610 | |
621 | 611 | free(p1); |
622 | 612 | free(p2); |
623 | - return true; | |
613 | + return true; | |
624 | 614 | } |
625 | - | |
615 | + | |
626 | 616 | /// Compute the ratio between a peak area and peak height. |
627 | 617 | |
628 | 618 | /// @param lb1 is the label value for the left baseline point for the first peak (numerator) |
... | ... | @@ -634,10 +624,10 @@ public: |
634 | 624 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
635 | 625 | bool pa_to_ph(T* result, double lb1, double rb1, double lab1, double rab1, |
636 | 626 | double lb2, double rb2, double pos, unsigned char* mask = NULL){ |
637 | - | |
627 | + | |
638 | 628 | T* p1 = (T*)malloc(X() * Y() * sizeof(T)); |
639 | 629 | T* p2 = (T*)malloc(X() * Y() * sizeof(T)); |
640 | - | |
630 | + | |
641 | 631 | //get the area and the peak band |
642 | 632 | area(lb1, rb1, lab1, rab1, p1); |
643 | 633 | height(lb2, rb2, pos, p2); |
... | ... | @@ -651,9 +641,9 @@ public: |
651 | 641 | |
652 | 642 | free(p1); |
653 | 643 | free(p2); |
654 | - return true; | |
655 | - } | |
656 | - | |
644 | + return true; | |
645 | + } | |
646 | + | |
657 | 647 | /// Compute the ratio between two peak areas. |
658 | 648 | |
659 | 649 | /// @param lb1 is the label value for the left baseline point for the first peak (numerator) |
... | ... | @@ -663,14 +653,14 @@ public: |
663 | 653 | /// @param lb2 is the label value for the left baseline point for the second peak (denominator) |
664 | 654 | /// @param rb2 is the label value for the right baseline point for the second peak (denominator) |
665 | 655 | /// @param lab2 is the label value for the left bound (start of the integration) of the second peak (denominator) |
666 | - /// @param rab2 is the label value for the right bound (end of the integration) of the second peak (denominator) | |
656 | + /// @param rab2 is the label value for the right bound (end of the integration) of the second peak (denominator) | |
667 | 657 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
668 | 658 | bool pa_to_pa(T* result, double lb1, double rb1, double lab1, double rab1, |
669 | 659 | double lb2, double rb2, double lab2, double rab2, unsigned char* mask = NULL){ |
670 | - | |
660 | + | |
671 | 661 | T* p1 = (T*)malloc(X() * Y() * sizeof(T)); |
672 | 662 | T* p2 = (T*)malloc(X() * Y() * sizeof(T)); |
673 | - | |
663 | + | |
674 | 664 | //get the area and the peak band |
675 | 665 | area(lb1, rb1, lab1, rab1, p1); |
676 | 666 | area(lb2, rb2, lab2, rab2, p2); |
... | ... | @@ -684,8 +674,8 @@ public: |
684 | 674 | |
685 | 675 | free(p1); |
686 | 676 | free(p2); |
687 | - return true; | |
688 | - } | |
677 | + return true; | |
678 | + } | |
689 | 679 | |
690 | 680 | /// Compute the definite integral of a baseline corrected peak. |
691 | 681 | |
... | ... | @@ -745,7 +735,7 @@ public: |
745 | 735 | } |
746 | 736 | baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part |
747 | 737 | baseline_band(lb, rb, lp, rp, w[ai], cur); |
748 | - for(unsigned long long j = 0; j < XY; j++){ | |
738 | + for(unsigned long long j = 0; j < XY; j++){ | |
749 | 739 | result[j] += (T)((w[ai] - lab) * (w[ai] + lab) * ((double)cur[j] + (double)cur2[j]) / 4.0); |
750 | 740 | } |
751 | 741 | |
... | ... | @@ -756,7 +746,7 @@ public: |
756 | 746 | baseline_band(lb, rb, lp, rp, w[ai], cur2); |
757 | 747 | for(unsigned long long j = 0; j < XY; j++) |
758 | 748 | { |
759 | - result[j] += (T)((w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 4.0); | |
749 | + result[j] += (T)((w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 4.0); | |
760 | 750 | } |
761 | 751 | std::swap(cur,cur2); //swap the band pointers |
762 | 752 | } |
... | ... | @@ -778,7 +768,7 @@ public: |
778 | 768 | bool centroid(T* result, double lb, double rb, double lab, double rab, unsigned char* mask = NULL){ |
779 | 769 | T* p1 = (T*)malloc(X() * Y() * sizeof(T)); |
780 | 770 | T* p2 = (T*)malloc(X() * Y() * sizeof(T)); |
781 | - | |
771 | + | |
782 | 772 | //get the area and the peak band |
783 | 773 | x_area(lb, rb, lab, rab, p1); |
784 | 774 | area(lb, rb, lab, rab, p2); |
... | ... | @@ -790,7 +780,7 @@ public: |
790 | 780 | |
791 | 781 | free(p1); |
792 | 782 | free(p2); |
793 | - return true; | |
783 | + return true; | |
794 | 784 | } |
795 | 785 | |
796 | 786 | /// Create a mask based on a given band and threshold value. |
... | ... | @@ -843,7 +833,7 @@ public: |
843 | 833 | continue; |
844 | 834 | } |
845 | 835 | } |
846 | - target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file | |
836 | + target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file | |
847 | 837 | if(PROGRESS) progress = (double)(i+1) / (double)Y() * 100; |
848 | 838 | } |
849 | 839 | target.close(); |
... | ... | @@ -861,7 +851,7 @@ public: |
861 | 851 | T* line = (T*) malloc( Lbytes ); //allocate space for a line |
862 | 852 | |
863 | 853 | file.seekg(0, std::ios::beg); //seek to the beginning of the file |
864 | - | |
854 | + | |
865 | 855 | size_t pl; |
866 | 856 | size_t p = 0; //create counter variables |
867 | 857 | for(size_t y = 0; y < Y(); y++){ //for each line in the data set |
... | ... | @@ -903,7 +893,7 @@ public: |
903 | 893 | { |
904 | 894 | read_plane_y(slice, y); //retrieve an ZX page, store in "slice" |
905 | 895 | |
906 | - //for each sample along X | |
896 | + //for each sample along X | |
907 | 897 | for (unsigned long long x = 0; x < X(); x++) //Select a pixel by choosing X coordinate in the page, X() |
908 | 898 | { |
909 | 899 | //if the mask != 0 at that xy pixel |
... | ... | @@ -1082,7 +1072,7 @@ public: |
1082 | 1072 | for (unsigned long long z = b0; z < b1; z++) |
1083 | 1073 | { |
1084 | 1074 | file.read((char *)(temp + z * samples), sizeof(T) * samples); |
1085 | - file.seekg(jumpb, std::ios::cur); //go to the next band | |
1075 | + file.seekg(jumpb, std::ios::cur); //go to the next band | |
1086 | 1076 | |
1087 | 1077 | if(PROGRESS) progress = (double)(x * Z() + z+1) / (lines * Z()) * 100; |
1088 | 1078 | } |
... | ... | @@ -1193,7 +1183,7 @@ public: |
1193 | 1183 | size_t N = C.size(); //get the number of bands that the kernel spans |
1194 | 1184 | std::deque<T*> frame(N, NULL); //create an array to store pointers to each frame |
1195 | 1185 | for(size_t f = 0; f < N; f++) |
1196 | - frame[f] = (T*)malloc(Xb); //allocate space for the frame | |
1186 | + frame[f] = (T*)malloc(Xb); //allocate space for the frame | |
1197 | 1187 | |
1198 | 1188 | T* outline = (T*)malloc(Xb); //allocate space for the output band |
1199 | 1189 | |
... | ... | @@ -1219,23 +1209,23 @@ public: |
1219 | 1209 | frame.pop_front(); //pop the first element |
1220 | 1210 | } |
1221 | 1211 | if(PROGRESS) progress = (double)(y+1) / (double)Y() * 100; |
1222 | - } | |
1212 | + } | |
1223 | 1213 | } |
1224 | 1214 | |
1225 | 1215 | /// Approximate the spectral derivative of the image |
1226 | 1216 | void deriv(std::string outfile, size_t d, size_t order, const std::vector<double> w = std::vector<double>(), unsigned char* mask = NULL, bool PROGRESS = false){ |
1227 | 1217 | std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file for writing |
1228 | - | |
1218 | + | |
1229 | 1219 | size_t Xb = X() * sizeof(T); //calculate the size of a line (frame) in bytes |
1230 | 1220 | size_t XBb = Xb * Z(); |
1231 | 1221 | size_t B = Z(); |
1232 | 1222 | |
1233 | - file.seekg(0, std::ios::beg); //seek to the beginning of the file | |
1223 | + file.seekg(0, std::ios::beg); //seek to the beginning of the file | |
1234 | 1224 | |
1235 | 1225 | size_t N = order + d; //approximating a derivative requires order + d samples |
1236 | 1226 | std::deque<T*> frame(N, NULL); //create an array to store pointers to each frame |
1237 | 1227 | for(size_t f = 0; f < N; f++) //for each frame |
1238 | - frame[f] = (T*)malloc(Xb); //allocate space for the frame | |
1228 | + frame[f] = (T*)malloc(Xb); //allocate space for the frame | |
1239 | 1229 | |
1240 | 1230 | T* outline = (T*)malloc(Xb); //allocate space for the output band |
1241 | 1231 | |
... | ... | @@ -1273,7 +1263,7 @@ public: |
1273 | 1263 | } |
1274 | 1264 | } |
1275 | 1265 | out.write((char*)outline, Xb); //output the band |
1276 | - | |
1266 | + | |
1277 | 1267 | } |
1278 | 1268 | if(PROGRESS) progress = (double)(y+1) / (double)Y() * 100; |
1279 | 1269 | } | ... | ... |
stim/envi/bip.h
... | ... | @@ -28,15 +28,18 @@ template <typename T> |
28 | 28 | class bip: public hsi<T> { |
29 | 29 | |
30 | 30 | protected: |
31 | - | |
32 | - | |
31 | + | |
32 | + | |
33 | 33 | //std::vector<double> w; //band wavelength |
34 | 34 | unsigned long long offset; //header offset |
35 | 35 | |
36 | 36 | using hsi<T>::w; //use the wavelength array in stim::hsi |
37 | 37 | using hsi<T>::nnz; |
38 | 38 | using binary<T>::progress; |
39 | - | |
39 | + using hsi<T>::X; | |
40 | + using hsi<T>::Y; | |
41 | + using hsi<T>::Z; | |
42 | + | |
40 | 43 | public: |
41 | 44 | |
42 | 45 | using binary<T>::open; |
... | ... | @@ -54,11 +57,11 @@ public: |
54 | 57 | /// @param B is the number of samples (bands) along dimension 3 |
55 | 58 | /// @param header_offset is the number of bytes (if any) in the binary header |
56 | 59 | /// @param wavelengths is an optional STL vector of size B specifying a numerical label for each band |
57 | - bool open(std::string filename, | |
58 | - unsigned long long X, | |
59 | - unsigned long long Y, | |
60 | - unsigned long long B, | |
61 | - unsigned long long header_offset, | |
60 | + bool open(std::string filename, | |
61 | + unsigned long long X, | |
62 | + unsigned long long Y, | |
63 | + unsigned long long B, | |
64 | + unsigned long long header_offset, | |
62 | 65 | std::vector<double> wavelengths){ |
63 | 66 | |
64 | 67 | //copy the wavelengths to the BSQ file structure |
... | ... | @@ -67,7 +70,7 @@ public: |
67 | 70 | offset = header_offset; |
68 | 71 | |
69 | 72 | return open(filename, vec<unsigned long long>(B, X, Y), header_offset); |
70 | - | |
73 | + | |
71 | 74 | } |
72 | 75 | |
73 | 76 | /// Retrieve a single band (based on index) and stores it in pre-allocated memory. |
... | ... | @@ -160,7 +163,7 @@ public: |
160 | 163 | for(unsigned long long j = 0; j < X(); j++) |
161 | 164 | { |
162 | 165 | p[j] = c[j * B]; |
163 | - } | |
166 | + } | |
164 | 167 | return true; |
165 | 168 | } |
166 | 169 | |
... | ... | @@ -192,7 +195,7 @@ public: |
192 | 195 | { |
193 | 196 | p2[j] = c[j * B + page]; |
194 | 197 | } |
195 | - | |
198 | + | |
196 | 199 | for(unsigned long long i=0; i < X(); i++){ |
197 | 200 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
198 | 201 | p[i] = (p2[i] - p1[i]) * r + p1[i]; |
... | ... | @@ -209,7 +212,7 @@ public: |
209 | 212 | } |
210 | 213 | } |
211 | 214 | |
212 | - return true; | |
215 | + return true; | |
213 | 216 | } |
214 | 217 | |
215 | 218 | /// Retrieve a single pixel and store it in a pre-allocated double array. |
... | ... | @@ -246,20 +249,20 @@ public: |
246 | 249 | file.read((char *)p, sizeof(T) * Z()); |
247 | 250 | return true; |
248 | 251 | } |
249 | - | |
252 | + | |
250 | 253 | //given a Y ,return a ZX slice |
251 | 254 | bool read_plane_y(T * p, unsigned long long y){ |
252 | 255 | return binary<T>::read_plane_2(p, y); |
253 | 256 | } |
254 | - | |
257 | + | |
255 | 258 | /// Perform baseline correction given a list of baseline points and stores the result in a new BSQ file. |
256 | 259 | |
257 | 260 | /// @param outname is the name of the output file used to store the resulting baseline-corrected data. |
258 | - /// @param wls is the list of baseline points based on band labels. | |
261 | + /// @param wls is the list of baseline points based on band labels. | |
259 | 262 | bool baseline(std::string outname, std::vector<double> base_pts, unsigned char* mask = NULL, bool PROGRESS = false){ |
260 | - | |
263 | + | |
261 | 264 | std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file |
262 | - | |
265 | + | |
263 | 266 | unsigned long long N = X() * Y(); //calculate the total number of pixels to be processed |
264 | 267 | unsigned long long B = Z(); //get the number of bands |
265 | 268 | T* s = (T*)malloc(sizeof(T) * B); //allocate memory to store a pixel |
... | ... | @@ -274,9 +277,9 @@ public: |
274 | 277 | memset(sbc, 0, sizeof(T) * B); //set the baseline corrected spectrum to zero |
275 | 278 | } |
276 | 279 | else{ |
277 | - | |
280 | + | |
278 | 281 | pixel(s, n); //retrieve the spectrum s |
279 | - base_vals = interp_spectrum(s, base_pts); //get the values at each baseline point | |
282 | + base_vals = hsi<T>::interp_spectrum(s, base_pts); //get the values at each baseline point | |
280 | 283 | |
281 | 284 | ai = bi = 0; |
282 | 285 | aw = w[0]; //initialize the current baseline points (assume the spectrum starts at 0) |
... | ... | @@ -298,23 +301,23 @@ public: |
298 | 301 | aw = base_pts[ai]; //set the wavelength for the lower bound baseline point |
299 | 302 | av = base_vals[ai]; //set the value for the lower bound baseline point |
300 | 303 | } |
301 | - sbc[b] = s[b] - lerp(w[b], av, aw, bv, bw); //perform the baseline correction and save the new value | |
304 | + sbc[b] = s[b] - hsi<T>::lerp(w[b], av, aw, bv, bw); //perform the baseline correction and save the new value | |
302 | 305 | } |
303 | 306 | } |
304 | - | |
307 | + | |
305 | 308 | if(PROGRESS) progress = (double)(n+1) / N * 100; //set the current progress |
306 | 309 | |
307 | 310 | target.write((char*)sbc, sizeof(T) * B); //write the corrected data into destination |
308 | 311 | } //end for each pixel |
309 | - | |
312 | + | |
310 | 313 | free(s); |
311 | 314 | free(sbc); |
312 | 315 | target.close(); |
313 | - | |
314 | - return true; | |
315 | - | |
316 | + | |
317 | + return true; | |
318 | + | |
316 | 319 | } |
317 | - | |
320 | + | |
318 | 321 | /// Normalize all spectra based on the value of a single band, storing the result in a new BSQ file. |
319 | 322 | |
320 | 323 | /// @param outname is the name of the output file used to store the resulting baseline-corrected data. |
... | ... | @@ -323,8 +326,8 @@ public: |
323 | 326 | bool ratio(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false) |
324 | 327 | { |
325 | 328 | std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file |
326 | - std::string headername = outname + ".hdr"; //the header file name | |
327 | - | |
329 | + std::string headername = outname + ".hdr"; //the header file name | |
330 | + | |
328 | 331 | unsigned long long N = X() * Y(); //calculate the total number of pixels to be processed |
329 | 332 | unsigned long long B = Z(); //get the number of bands |
330 | 333 | T* s = (T*)malloc(sizeof(T) * B); //allocate memory to store a pixel |
... | ... | @@ -334,24 +337,24 @@ public: |
334 | 337 | memset(s, 0, sizeof(T) * B); //set the output to zero |
335 | 338 | else{ |
336 | 339 | pixel(s, n); //retrieve the spectrum s |
337 | - nv = interp_spectrum(s, w); //find the value of the normalization band | |
338 | - | |
340 | + nv = hsi<T>::interp_spectrum(s, w); //find the value of the normalization band | |
341 | + | |
339 | 342 | for(unsigned long long b = 0; b < B; b++) //for each band in the spectrum |
340 | 343 | s[b] /= nv; //divide by the normalization value |
341 | 344 | } |
342 | - | |
345 | + | |
343 | 346 | if(PROGRESS) progress = (double)(n+1) / N * 100; //set the current progress |
344 | 347 | |
345 | 348 | target.write((char*)s, sizeof(T) * B); //write the corrected data into destination |
346 | 349 | } //end for each pixel |
347 | - | |
350 | + | |
348 | 351 | free(s); |
349 | 352 | target.close(); |
350 | 353 | return true; |
351 | 354 | } |
352 | 355 | |
353 | 356 | void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){} |
354 | - | |
357 | + | |
355 | 358 | |
356 | 359 | /// Convert the current BIP file to a BIL file with the specified file name. |
357 | 360 | |
... | ... | @@ -359,17 +362,17 @@ public: |
359 | 362 | bool bil(std::string outname, bool PROGRESS = false) |
360 | 363 | { |
361 | 364 | unsigned long long S = X() * Z() * sizeof(T); //calculate the number of bytes in a ZX slice |
362 | - | |
365 | + | |
363 | 366 | std::ofstream target(outname.c_str(), std::ios::binary); |
364 | 367 | //std::string headername = outname + ".hdr"; |
365 | - | |
368 | + | |
366 | 369 | T * p; //pointer to the current ZX slice for bip file |
367 | 370 | p = (T*)malloc(S); |
368 | 371 | T * q; //pointer to the current XZ slice for bil file |
369 | 372 | q = (T*)malloc(S); |
370 | - | |
373 | + | |
371 | 374 | for ( unsigned long long i = 0; i < Y(); i++) |
372 | - { | |
375 | + { | |
373 | 376 | read_plane_y(p, i); |
374 | 377 | for ( unsigned long long k = 0; k < Z(); k++) |
375 | 378 | { |
... | ... | @@ -379,7 +382,7 @@ public: |
379 | 382 | |
380 | 383 | if(PROGRESS) progress = (double)(i * Z() + k+1) / (Y() * Z()) * 100; |
381 | 384 | } |
382 | - target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
385 | + target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
383 | 386 | } |
384 | 387 | |
385 | 388 | free(p); |
... | ... | @@ -408,7 +411,7 @@ public: |
408 | 411 | } |
409 | 412 | return true; |
410 | 413 | } |
411 | - | |
414 | + | |
412 | 415 | /// Return a baseline corrected band given two adjacent baseline points. The result is stored in a pre-allocated array. |
413 | 416 | |
414 | 417 | /// @param lb is the label value for the left baseline point |
... | ... | @@ -425,7 +428,7 @@ public: |
425 | 428 | rp = (T*) malloc(S); |
426 | 429 | |
427 | 430 | band(lp, lb); |
428 | - band(rp, rb); | |
431 | + band(rp, rb); | |
429 | 432 | |
430 | 433 | baseline_band(lb, rb, lp, rp, bandwavelength, result); |
431 | 434 | |
... | ... | @@ -496,7 +499,7 @@ public: |
496 | 499 | } |
497 | 500 | baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part |
498 | 501 | baseline_band(lb, rb, lp, rp, w[ai], cur); |
499 | - for(unsigned long long j = 0; j < XY; j++){ | |
502 | + for(unsigned long long j = 0; j < XY; j++){ | |
500 | 503 | result[j] += (T)((w[ai] - lab) * ((double)cur[j] + (double)cur2[j]) / 2.0); |
501 | 504 | } |
502 | 505 | |
... | ... | @@ -507,7 +510,7 @@ public: |
507 | 510 | baseline_band(lb, rb, lp, rp, w[ai], cur2); |
508 | 511 | for(unsigned long long j = 0; j < XY; j++) |
509 | 512 | { |
510 | - result[j] += (T)((w[ai] - w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 2.0); | |
513 | + result[j] += (T)((w[ai] - w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 2.0); | |
511 | 514 | } |
512 | 515 | std::swap(cur,cur2); //swap the band pointers |
513 | 516 | } |
... | ... | @@ -530,9 +533,9 @@ public: |
530 | 533 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
531 | 534 | bool ph_to_ph(T* result, double lb1, double rb1, double pos1, double lb2, double rb2, double pos2, unsigned char* mask = NULL){ |
532 | 535 | |
533 | - T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
534 | - T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
535 | - | |
536 | + T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
537 | + T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
538 | + | |
536 | 539 | //get the two peak band |
537 | 540 | height(lb1, rb1, pos1, p1); |
538 | 541 | height(lb2, rb2, pos2, p2); |
... | ... | @@ -546,9 +549,9 @@ public: |
546 | 549 | |
547 | 550 | free(p1); |
548 | 551 | free(p2); |
549 | - return true; | |
552 | + return true; | |
550 | 553 | } |
551 | - | |
554 | + | |
552 | 555 | /// Compute the ratio between a peak area and peak height. |
553 | 556 | |
554 | 557 | /// @param lb1 is the label value for the left baseline point for the first peak (numerator) |
... | ... | @@ -560,10 +563,10 @@ public: |
560 | 563 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
561 | 564 | bool pa_to_ph(T* result, double lb1, double rb1, double lab1, double rab1, |
562 | 565 | double lb2, double rb2, double pos, unsigned char* mask = NULL){ |
563 | - | |
564 | - T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
565 | - T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
566 | - | |
566 | + | |
567 | + T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
568 | + T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
569 | + | |
567 | 570 | //get the area and the peak band |
568 | 571 | area(lb1, rb1, lab1, rab1, p1); |
569 | 572 | height(lb2, rb2, pos, p2); |
... | ... | @@ -577,9 +580,9 @@ public: |
577 | 580 | |
578 | 581 | free(p1); |
579 | 582 | free(p2); |
580 | - return true; | |
581 | - } | |
582 | - | |
583 | + return true; | |
584 | + } | |
585 | + | |
583 | 586 | /// Compute the ratio between two peak areas. |
584 | 587 | |
585 | 588 | /// @param lb1 is the label value for the left baseline point for the first peak (numerator) |
... | ... | @@ -589,14 +592,14 @@ public: |
589 | 592 | /// @param lb2 is the label value for the left baseline point for the second peak (denominator) |
590 | 593 | /// @param rb2 is the label value for the right baseline point for the second peak (denominator) |
591 | 594 | /// @param lab2 is the label value for the left bound (start of the integration) of the second peak (denominator) |
592 | - /// @param rab2 is the label value for the right bound (end of the integration) of the second peak (denominator) | |
595 | + /// @param rab2 is the label value for the right bound (end of the integration) of the second peak (denominator) | |
593 | 596 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
594 | 597 | bool pa_to_pa(T* result, double lb1, double rb1, double lab1, double rab1, |
595 | 598 | double lb2, double rb2, double lab2, double rab2, unsigned char* mask = NULL){ |
596 | - | |
597 | - T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
598 | - T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
599 | - | |
599 | + | |
600 | + T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
601 | + T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
602 | + | |
600 | 603 | //get the area and the peak band |
601 | 604 | area(lb1, rb1, lab1, rab1, p1); |
602 | 605 | area(lb2, rb2, lab2, rab2, p2); |
... | ... | @@ -610,8 +613,8 @@ public: |
610 | 613 | |
611 | 614 | free(p1); |
612 | 615 | free(p2); |
613 | - return true; | |
614 | - } | |
616 | + return true; | |
617 | + } | |
615 | 618 | |
616 | 619 | /// Compute the definite integral of a baseline corrected peak. |
617 | 620 | |
... | ... | @@ -671,7 +674,7 @@ public: |
671 | 674 | } |
672 | 675 | baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part |
673 | 676 | baseline_band(lb, rb, lp, rp, w[ai], cur); |
674 | - for(unsigned long long j = 0; j < XY; j++){ | |
677 | + for(unsigned long long j = 0; j < XY; j++){ | |
675 | 678 | result[j] += (T)((w[ai] - lab) * (w[ai] + lab) * ((double)cur[j] + (double)cur2[j]) / 4.0); |
676 | 679 | } |
677 | 680 | |
... | ... | @@ -682,7 +685,7 @@ public: |
682 | 685 | baseline_band(lb, rb, lp, rp, w[ai], cur2); |
683 | 686 | for(unsigned long long j = 0; j < XY; j++) |
684 | 687 | { |
685 | - result[j] += (T)((w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 4.0); | |
688 | + result[j] += (T)((w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * ((double)cur[j] + (double)cur2[j]) / 4.0); | |
686 | 689 | } |
687 | 690 | std::swap(cur,cur2); //swap the band pointers |
688 | 691 | } |
... | ... | @@ -702,9 +705,9 @@ public: |
702 | 705 | /// @param rab is the label for the end of the peak |
703 | 706 | /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size |
704 | 707 | bool centroid(T* result, double lb, double rb, double lab, double rab, unsigned char* mask = NULL){ |
705 | - T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
706 | - T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
707 | - | |
708 | + T* p1 = (T*)malloc(X() * Y() * sizeof(T)); | |
709 | + T* p2 = (T*)malloc(X() * Y() * sizeof(T)); | |
710 | + | |
708 | 711 | //get the area and the peak band |
709 | 712 | x_area(lb, rb, lab, rab, p1); |
710 | 713 | area(lb, rb, lab, rab, p2); |
... | ... | @@ -716,7 +719,7 @@ public: |
716 | 719 | |
717 | 720 | free(p1); |
718 | 721 | free(p2); |
719 | - return true; | |
722 | + return true; | |
720 | 723 | } |
721 | 724 | |
722 | 725 | /// Create a mask based on a given band and threshold value. |
... | ... | @@ -788,7 +791,7 @@ public: |
788 | 791 | T* band = (T*) malloc( Bbytes ); //allocate space for a line |
789 | 792 | |
790 | 793 | file.seekg(0, std::ios::beg); //seek to the beginning of the file |
791 | - | |
794 | + | |
792 | 795 | size_t p = 0; //create counter variables |
793 | 796 | for(size_t xy = 0; xy < XY; xy++){ //for each pixel |
794 | 797 | if(mask[xy]){ //if the current pixel is masked |
... | ... | @@ -800,7 +803,7 @@ public: |
800 | 803 | p++; //increment the pixel pointer |
801 | 804 | } |
802 | 805 | else |
803 | - file.seekg(Bbytes, std::ios::cur); //otherwise skip this band | |
806 | + file.seekg(Bbytes, std::ios::cur); //otherwise skip this band | |
804 | 807 | } |
805 | 808 | return true; |
806 | 809 | } |
... | ... | @@ -809,7 +812,7 @@ public: |
809 | 812 | bool sift(std::string outfile, unsigned char* mask, bool PROGRESS = false){ |
810 | 813 | |
811 | 814 | //reset the file pointer to the beginning of the file |
812 | - file.seekg(0, std::ios::beg); | |
815 | + file.seekg(0, std::ios::beg); | |
813 | 816 | |
814 | 817 | // open an output stream |
815 | 818 | std::ofstream target(outfile.c_str(), std::ios::binary); |
... | ... | @@ -862,7 +865,7 @@ public: |
862 | 865 | std::ofstream target(outfile.c_str(), std::ios::binary); |
863 | 866 | |
864 | 867 | //reset the file pointer to the beginning of the file |
865 | - file.seekg(0, std::ios::beg); | |
868 | + file.seekg(0, std::ios::beg); | |
866 | 869 | |
867 | 870 | //allocate space for a single spectrum |
868 | 871 | unsigned long long B = Z(); |
... | ... | @@ -942,10 +945,10 @@ public: |
942 | 945 | /// Note that cuBLAS only supports integer-sized arrays, so there may be issues with large spectra |
943 | 946 | bool co_matrix_cublas(double* co, double* avg, unsigned char *mask, bool PROGRESS = false){ |
944 | 947 | |
945 | - cudaError_t cudaStat; | |
948 | + cudaError_t cudaStat; | |
946 | 949 | cublasStatus_t stat; |
947 | 950 | cublasHandle_t handle; |
948 | - | |
951 | + | |
949 | 952 | progress = 0; //initialize the progress to zero (0) |
950 | 953 | unsigned long long XY = X() * Y(); //calculate the number of elements in a band image |
951 | 954 | unsigned long long B = Z(); //calculate the number of spectral elements |
... | ... | @@ -959,7 +962,7 @@ public: |
959 | 962 | cudaStat = cudaMemset(A_dev, 0, B * B * sizeof(double)); //initialize the covariance matrix to zero (0) |
960 | 963 | cudaStat = cudaMalloc(&avg_dev, B * sizeof(double)); //allocate space on the CUDA device for the average spectrum |
961 | 964 | stat = cublasSetVector((int)B, sizeof(double), avg, 1, avg_dev, 1); //copy the average spectrum to the CUDA device |
962 | - | |
965 | + | |
963 | 966 | double ger_alpha = 1.0/(double)XY; //scale the outer product by the inverse of the number of samples (mean outer product) |
964 | 967 | double axpy_alpha = -1; //multiplication factor for the average spectrum (in order to perform a subtraction) |
965 | 968 | |
... | ... | @@ -994,7 +997,7 @@ public: |
994 | 997 | return true; |
995 | 998 | } |
996 | 999 | #endif |
997 | - | |
1000 | + | |
998 | 1001 | /// Calculate the covariance matrix for all masked pixels in the image with 64-bit floating point precision. |
999 | 1002 | |
1000 | 1003 | /// @param co is a pointer to pre-allocated memory of size [B * B] that stores the resulting covariance matrix |
... | ... | @@ -1074,7 +1077,7 @@ public: |
1074 | 1077 | } |
1075 | 1078 | } |
1076 | 1079 | } |
1077 | - | |
1080 | + | |
1078 | 1081 | target.write(reinterpret_cast<const char*>(rs), sizeof(T) * M); //write the projected vector |
1079 | 1082 | if(PROGRESS) progress = (double)(xy+1) / XY * 100; |
1080 | 1083 | } |
... | ... | @@ -1104,7 +1107,7 @@ public: |
1104 | 1107 | memset(s, 0, sizeof(T) * B); //initialize the spectrum to zero (0) |
1105 | 1108 | for(unsigned long long c = 0; c < C; c++){ //for each basis vector coefficient |
1106 | 1109 | bv = &basis[c * B]; //assign 'bv' to the beginning of the basis vector |
1107 | - for(unsigned long long b = 0; b < B; b++){ //for each component of the basis vector | |
1110 | + for(unsigned long long b = 0; b < B; b++){ //for each component of the basis vector | |
1108 | 1111 | s[b] += (T)((double)coeff[c] * bv[b] + center[b]); //calculate the contribution of each element of the basis vector in the final spectrum |
1109 | 1112 | } |
1110 | 1113 | } |
... | ... | @@ -1172,7 +1175,7 @@ public: |
1172 | 1175 | //read the cropped spectral region |
1173 | 1176 | file.read( (char*) temp, L ); |
1174 | 1177 | //pixel(temp, sp + x + y * X()); |
1175 | - out.write(reinterpret_cast<const char*>(temp), L); //write slice data into target file | |
1178 | + out.write(reinterpret_cast<const char*>(temp), L); //write slice data into target file | |
1176 | 1179 | |
1177 | 1180 | file.seekg(jump_sample, std::ios::cur); |
1178 | 1181 | |
... | ... | @@ -1253,7 +1256,7 @@ public: |
1253 | 1256 | memset(spec, 0, spec_bytes); |
1254 | 1257 | out.write((char*)spec, spec_bytes); //write to the output file |
1255 | 1258 | } |
1256 | - if(PROGRESS) progress = (double)( (y+1) * S[0] + 1) / (double) (S[0] * S[1]) * 100; | |
1259 | + if(PROGRESS) progress = (double)( (y+1) * S[0] + 1) / (double) (S[0] * S[1]) * 100; | |
1257 | 1260 | } |
1258 | 1261 | } |
1259 | 1262 | |
... | ... | @@ -1267,7 +1270,7 @@ public: |
1267 | 1270 | |
1268 | 1271 | void convolve(std::string outfile, std::vector<double> C, size_t start, size_t end, unsigned char* mask = NULL, bool PROGRESS = false){ |
1269 | 1272 | std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file for writing |
1270 | - | |
1273 | + | |
1271 | 1274 | size_t N = end - start + 1; //number of bands in the output spectrum |
1272 | 1275 | size_t Nb = N * sizeof(T); //size of the output spectrum in bytes |
1273 | 1276 | size_t B = Z(); //calculate the number of values in a spectrum |
... | ... | @@ -1297,8 +1300,8 @@ public: |
1297 | 1300 | |
1298 | 1301 | void deriv(std::string outfile, size_t d, size_t order, const std::vector<double> w, unsigned char* mask = NULL, bool PROGRESS = false){ |
1299 | 1302 | std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file for writing |
1300 | - | |
1301 | - | |
1303 | + | |
1304 | + | |
1302 | 1305 | size_t B = Z(); //calculate the number of values in a spectrum |
1303 | 1306 | size_t Bb = B * sizeof(T); //calculate the size of a spectrum in bytes |
1304 | 1307 | ... | ... |
stim/envi/bsq.h
... | ... | @@ -37,6 +37,9 @@ protected: |
37 | 37 | using hsi<T>::w; //use the wavelength array in stim::hsi |
38 | 38 | using hsi<T>::nnz; |
39 | 39 | using binary<T>::progress; |
40 | + using hsi<T>::X; | |
41 | + using hsi<T>::Y; | |
42 | + using hsi<T>::Z; | |
40 | 43 | |
41 | 44 | public: |
42 | 45 | |
... | ... | @@ -55,11 +58,11 @@ public: |
55 | 58 | /// @param B is the number of samples (bands) along dimension 3 |
56 | 59 | /// @param header_offset is the number of bytes (if any) in the binary header |
57 | 60 | /// @param wavelengths is an STL vector of size B specifying a numerical label for each band |
58 | - bool open(std::string filename, | |
59 | - unsigned long long X, | |
60 | - unsigned long long Y, | |
61 | - unsigned long long B, | |
62 | - unsigned long long header_offset, | |
61 | + bool open(std::string filename, | |
62 | + unsigned long long X, | |
63 | + unsigned long long Y, | |
64 | + unsigned long long B, | |
65 | + unsigned long long header_offset, | |
63 | 66 | std::vector<double> wavelengths){ |
64 | 67 | |
65 | 68 | //copy the wavelengths to the BSQ file structure |
... | ... | @@ -366,7 +369,7 @@ public: |
366 | 369 | out.write((char*)band, XYb); |
367 | 370 | if(PROGRESS) progress = (double) (b+1) / (double)B * 50 + 50; |
368 | 371 | } |
369 | - | |
372 | + | |
370 | 373 | } |
371 | 374 | |
372 | 375 | /// Convert the current BSQ file to a BIL file with the specified file name. |
... | ... | @@ -489,7 +492,7 @@ public: |
489 | 492 | } |
490 | 493 | |
491 | 494 | //find the indices of the left and right baseline points |
492 | - while (lab >= w[ai]){ | |
495 | + while (lab >= w[ai]){ | |
493 | 496 | ai++; |
494 | 497 | } |
495 | 498 | while (rab <= w[bi]){ |
... | ... | @@ -822,13 +825,13 @@ public: |
822 | 825 | i++; |
823 | 826 | //std::cout<<i<<std::endl; |
824 | 827 | } |
825 | - | |
828 | + | |
826 | 829 | } |
827 | 830 | } |
828 | 831 | |
829 | 832 | return true; |
830 | 833 | } |
831 | - | |
834 | + | |
832 | 835 | /// Saves to disk only those spectra corresponding to mask values != 0 |
833 | 836 | /// @param outfile is the name of the sifted ENVI file to be written to disk |
834 | 837 | /// @param unsigned char* p is the mask file used for sifting |
... | ... | @@ -853,7 +856,7 @@ public: |
853 | 856 | } |
854 | 857 | else{ |
855 | 858 | continue; |
856 | - } | |
859 | + } | |
857 | 860 | } |
858 | 861 | if(PROGRESS) progress = (double)(i+1)/ B * 100; |
859 | 862 | } |
... | ... | @@ -973,7 +976,7 @@ public: |
973 | 976 | free(temp); |
974 | 977 | return true; |
975 | 978 | } |
976 | - | |
979 | + | |
977 | 980 | /// Crop a region of the image and save it to a new file. |
978 | 981 | |
979 | 982 | /// @param outfile is the file name for the new cropped image |
... | ... | @@ -1035,7 +1038,7 @@ public: |
1035 | 1038 | /// @param outfile is the file name for the output hyperspectral image (with trimmed bands) |
1036 | 1039 | /// @param b is an array of bands to be eliminated |
1037 | 1040 | void trim(std::string outfile, std::vector<size_t> band_array, bool PROGRESS = false){ |
1038 | - | |
1041 | + | |
1039 | 1042 | std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file for writing |
1040 | 1043 | file.seekg(0, std::ios::beg); //move to the beginning of the input file |
1041 | 1044 | |
... | ... | @@ -1185,7 +1188,7 @@ public: |
1185 | 1188 | |
1186 | 1189 | void deriv(std::string outfile, size_t d, size_t order, const std::vector<double> w = std::vector<double>(), unsigned char* mask = NULL, bool PROGRESS = false){ |
1187 | 1190 | std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file for writing |
1188 | - | |
1191 | + | |
1189 | 1192 | size_t XY = X() * Y(); //calculate the number of values in a band |
1190 | 1193 | size_t XYb = XY * sizeof(T); //calculate the size of a band (frame) in bytes |
1191 | 1194 | size_t B = Z(); |
... | ... | @@ -1227,7 +1230,7 @@ public: |
1227 | 1230 | } |
1228 | 1231 | } |
1229 | 1232 | } |
1230 | - out.write((char*)outband, XYb); //output the band | |
1233 | + out.write((char*)outband, XYb); //output the band | |
1231 | 1234 | if(PROGRESS) progress = (double)(b+1) / (double)B * 100; |
1232 | 1235 | } |
1233 | 1236 | ... | ... |
stim/envi/hsi.h
... | ... | @@ -32,6 +32,9 @@ protected: |
32 | 32 | |
33 | 33 | std::vector<double> w; //band wavelengths |
34 | 34 | |
35 | + using binary<T>::R; | |
36 | + using binary<T>::progress; | |
37 | + | |
35 | 38 | unsigned long long X(){ return R[O[0]]; } |
36 | 39 | unsigned long long Y(){ return R[O[1]]; } |
37 | 40 | unsigned long long Z(){ return R[O[2]]; } |
... | ... | @@ -70,8 +73,8 @@ protected: |
70 | 73 | } |
71 | 74 | |
72 | 75 | /// Get the list of band numbers that bound a list of wavelengths |
73 | - void band_bounds(std::vector<double> wavelengths, | |
74 | - std::vector<unsigned long long>& low_bands, | |
76 | + void band_bounds(std::vector<double> wavelengths, | |
77 | + std::vector<unsigned long long>& low_bands, | |
75 | 78 | std::vector<unsigned long long>& high_bands){ |
76 | 79 | |
77 | 80 | unsigned long long W = w.size(); //get the number of wavelengths in the list |
... | ... | @@ -92,7 +95,7 @@ protected: |
92 | 95 | band_bounds(wavelength, low, high); //get the surrounding band indices |
93 | 96 | |
94 | 97 | if(high == w.size()) return s[w.size()-1]; //if the high band is above the wavelength range, return the highest wavelength value |
95 | - | |
98 | + | |
96 | 99 | return lerp(wavelength, s[low], w[low], s[high], w[high]); |
97 | 100 | } |
98 | 101 | |
... | ... | @@ -140,11 +143,11 @@ public: |
140 | 143 | size_t XY = X() * Y(); |
141 | 144 | memset(mask, 255, XY * sizeof(unsigned char)); //initialize the mask to zero (0) |
142 | 145 | T* page = (T*)malloc(R[0] * R[1] * sizeof(T)); //allocate space for a page of data |
143 | - | |
146 | + | |
144 | 147 | for(size_t p = 0; p < R[2]; p++){ //for each page |
145 | 148 | binary<T>::read_page(page, p); //read a page |
146 | 149 | for(size_t i = 0; i < R[0] * R[1]; i++){ //for each pixel in that page |
147 | - | |
150 | + | |
148 | 151 | #ifdef _WIN32 |
149 | 152 | if(!_finite(page[i])){ //if the value at index i is finite |
150 | 153 | #else |
... | ... | @@ -171,7 +174,7 @@ public: |
171 | 174 | } |
172 | 175 | |
173 | 176 | /// Calculates the necessary image size required to combine two images given the specified offset (position) of the second image |
174 | - void calc_combined_size(long long xp, long long yp, long long Sx, long long Sy, | |
177 | + void calc_combined_size(long long xp, long long yp, long long Sx, long long Sy, | |
175 | 178 | size_t& Sfx, size_t& Sfy, |
176 | 179 | size_t& p0_x, size_t& p0_y, |
177 | 180 | size_t& p1_x, size_t& p1_y){ |
... | ... | @@ -179,7 +182,7 @@ public: |
179 | 182 | calc_combined_size(xp, yp, Sx, Sy, Sfx, Sfy); |
180 | 183 | |
181 | 184 | p0_x = p0_y = p1_x = p1_y = 0; //initialize all boundary positions to zero |
182 | - | |
185 | + | |
183 | 186 | if(xp < 0) p0_x = -xp; //set the left positions of the current and source image |
184 | 187 | else p1_x = xp; |
185 | 188 | if(yp < 0) p0_y = -yp; |
... | ... | @@ -191,8 +194,8 @@ public: |
191 | 194 | |
192 | 195 | size_t w = X(); //calculate the number of pixels in a line |
193 | 196 | size_t wb = w * sizeof(T); //calculate the number of bytes in a line |
194 | - pw = (X() + x0 + x1); //calculate the width of the padded image | |
195 | - pwb = pw * sizeof(T); //calculate the number of bytes in a line of the padded image | |
197 | + size_t pw = (X() + x0 + x1); //calculate the width of the padded image | |
198 | + size_t pwb = pw * sizeof(T); //calculate the number of bytes in a line of the padded image | |
196 | 199 | |
197 | 200 | for(size_t y = 0; y < Y(); y++){ //for each line in the real image |
198 | 201 | memcpy( &padded[ (y + y0) * pw + x0 ], &src[y * w], wb ); //use memcpy to copy the line to the appropriate place in the padded image | ... | ... |
stim/image/image.h
... | ... | @@ -32,7 +32,7 @@ class image{ |
32 | 32 | void unalloc(){ //frees any resources associated with the image |
33 | 33 | if(img) free(img); //if memory has been allocated, free it |
34 | 34 | } |
35 | - | |
35 | + | |
36 | 36 | |
37 | 37 | void clear(){ //clears all image data |
38 | 38 | unalloc(); //unallocate previous memory |
... | ... | @@ -53,7 +53,7 @@ class image{ |
53 | 53 | size_t idx(size_t x, size_t y, size_t c = 0){ |
54 | 54 | return y * C() * X() + x * C() + c; |
55 | 55 | } |
56 | - | |
56 | + | |
57 | 57 | |
58 | 58 | int cv_type(){ |
59 | 59 | if(std::is_same<T, unsigned char>::value) return CV_MAKETYPE(CV_8U, (int)C()); |
... | ... | @@ -63,7 +63,7 @@ class image{ |
63 | 63 | if(std::is_same<T, int>::value) return CV_MAKETYPE(CV_32S, (int)C()); |
64 | 64 | if(std::is_same<T, float>::value) return CV_MAKETYPE(CV_32F, (int)C()); |
65 | 65 | if(std::is_same<T, double>::value) return CV_MAKETYPE(CV_64F, (int)C()); |
66 | - | |
66 | + | |
67 | 67 | std::cout<<"ERROR in stim::image::cv_type - no valid data type found"<<std::endl; |
68 | 68 | exit(1); |
69 | 69 | } |
... | ... | @@ -94,7 +94,7 @@ public: |
94 | 94 | } |
95 | 95 | |
96 | 96 | /// Create a new image from scratch given a number of samples and channels |
97 | - image(size_t x, size_t y = 1, size_t c = 1){ | |
97 | + image(size_t x, size_t y = 1, size_t c = 1){ | |
98 | 98 | allocate(x, y, c); |
99 | 99 | } |
100 | 100 | |
... | ... | @@ -284,7 +284,7 @@ public: |
284 | 284 | return s; //return the index list |
285 | 285 | } |
286 | 286 | |
287 | - | |
287 | + | |
288 | 288 | /// Returns the maximum pixel value in the image |
289 | 289 | T maxv(){ |
290 | 290 | T max_val = img[0]; //initialize the maximum value to the first one |
... | ... | @@ -294,10 +294,10 @@ public: |
294 | 294 | |
295 | 295 | if (img[n] > max_val){ //if the value is higher than the current max |
296 | 296 | max_val = img[n]; |
297 | - } | |
297 | + } | |
298 | 298 | } |
299 | 299 | |
300 | - return max; | |
300 | + return max_val; | |
301 | 301 | } |
302 | 302 | |
303 | 303 | /// Returns the maximum pixel value in the image |
... | ... | @@ -308,10 +308,10 @@ public: |
308 | 308 | for (size_t n=0; n<N; n++){ //for every value |
309 | 309 | if (img[n] < min_val){ //if the value is higher than the current max |
310 | 310 | min_val = img[n]; |
311 | - } | |
311 | + } | |
312 | 312 | } |
313 | 313 | |
314 | - return max; | |
314 | + return min_val; | |
315 | 315 | } |
316 | 316 | |
317 | 317 | /// Invert an image by calculating I1 = alpha - I0, where alpha is the maximum image value |
... | ... | @@ -320,7 +320,7 @@ public: |
320 | 320 | image<T> r(X(), Y(), C()); //allocate space for the resulting image |
321 | 321 | for(size_t n = 0; n < N; n++) |
322 | 322 | r.img[n] = white_val - img[n]; //perform the inversion |
323 | - | |
323 | + | |
324 | 324 | return r; //return the inverted image |
325 | 325 | } |
326 | 326 | |
... | ... | @@ -330,7 +330,7 @@ public: |
330 | 330 | } |
331 | 331 | |
332 | 332 | image<T> convolve2(image<T> mask){ |
333 | - | |
333 | + | |
334 | 334 | std::cout<<"ERROR stim::image::convolve2 - function has been broken, and shouldn't really be in here."<<std::endl; |
335 | 335 | exit(1); |
336 | 336 | } |
... | ... | @@ -347,7 +347,7 @@ public: |
347 | 347 | std::cout<<"ERROR stim::image::set_interleaved3 - stim::image no longer supports 3D images."<<std::endl; |
348 | 348 | exit(1); |
349 | 349 | } |
350 | - | |
350 | + | |
351 | 351 | }; |
352 | 352 | |
353 | 353 | }; //end namespace stim | ... | ... |