Commit 517876d61f3637a07b5e36246be172cc1608ba0f
1 parent
d1d8ef91
metrics finished and memory allocation error fixed
Showing
4 changed files
with
398 additions
and
13 deletions
Show diff stats
envi/bil.h
@@ -60,8 +60,7 @@ public: | @@ -60,8 +60,7 @@ public: | ||
60 | unsigned int S = XY * sizeof(T); //calculate the number of bytes of a band | 60 | unsigned int S = XY * sizeof(T); //calculate the number of bytes of a band |
61 | 61 | ||
62 | unsigned page=0; //bands around the wavelength | 62 | unsigned page=0; //bands around the wavelength |
63 | - T * p1; | ||
64 | - T * p2; | 63 | + |
65 | 64 | ||
66 | //get the bands numbers around the wavelength | 65 | //get the bands numbers around the wavelength |
67 | 66 | ||
@@ -82,6 +81,8 @@ public: | @@ -82,6 +81,8 @@ public: | ||
82 | } | 81 | } |
83 | if ( wavelength < w[page] ) | 82 | if ( wavelength < w[page] ) |
84 | { | 83 | { |
84 | + T * p1; | ||
85 | + T * p2; | ||
85 | p1=(T*)malloc(S); //memory allocation | 86 | p1=(T*)malloc(S); //memory allocation |
86 | p2=(T*)malloc(S); | 87 | p2=(T*)malloc(S); |
87 | band_index(p1, page - 1); | 88 | band_index(p1, page - 1); |
@@ -90,6 +91,8 @@ public: | @@ -90,6 +91,8 @@ public: | ||
90 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); | 91 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
91 | p[i] = (p2[i] - p1[i]) * r + p1[i]; | 92 | p[i] = (p2[i] - p1[i]) * r + p1[i]; |
92 | } | 93 | } |
94 | + free(p1); | ||
95 | + free(p2); | ||
93 | } | 96 | } |
94 | else //if the wavelength is equal to a wavelength in header file | 97 | else //if the wavelength is equal to a wavelength in header file |
95 | { | 98 | { |
@@ -401,8 +404,6 @@ public: | @@ -401,8 +404,6 @@ public: | ||
401 | } | 404 | } |
402 | return true; | 405 | return true; |
403 | } | 406 | } |
404 | - //untested | ||
405 | - //providing the left and the right bound wavelength, return baseline-corrected band height | ||
406 | bool height(double lb, double rb, double bandwavelength, T* result){ | 407 | bool height(double lb, double rb, double bandwavelength, T* result){ |
407 | 408 | ||
408 | T* lp; | 409 | T* lp; |
@@ -417,6 +418,8 @@ public: | @@ -417,6 +418,8 @@ public: | ||
417 | 418 | ||
418 | baseline_band(lb, rb, lp, rp, bandwavelength, result); | 419 | baseline_band(lb, rb, lp, rp, bandwavelength, result); |
419 | 420 | ||
421 | + free(lp); | ||
422 | + free(rp); | ||
420 | return true; | 423 | return true; |
421 | } | 424 | } |
422 | 425 | ||
@@ -479,6 +482,7 @@ public: | @@ -479,6 +482,7 @@ public: | ||
479 | for(unsigned j = 0; j < XY; j++){ | 482 | for(unsigned j = 0; j < XY; j++){ |
480 | result[j] += (w[ai] - lab) * (cur[j] + cur2[j]) / 2.0; | 483 | result[j] += (w[ai] - lab) * (cur[j] + cur2[j]) / 2.0; |
481 | } | 484 | } |
485 | + | ||
482 | //calculate the area | 486 | //calculate the area |
483 | ai++; | 487 | ai++; |
484 | for(unsigned i = ai; i <= bi ;i++) | 488 | for(unsigned i = ai; i <= bi ;i++) |
@@ -491,6 +495,10 @@ public: | @@ -491,6 +495,10 @@ public: | ||
491 | std::swap(cur,cur2); //swap the band pointers | 495 | std::swap(cur,cur2); //swap the band pointers |
492 | } | 496 | } |
493 | 497 | ||
498 | + free(lp); | ||
499 | + free(rp); | ||
500 | + free(cur); | ||
501 | + free(cur2); | ||
494 | return true; | 502 | return true; |
495 | } | 503 | } |
496 | 504 | ||
@@ -510,6 +518,9 @@ public: | @@ -510,6 +518,9 @@ public: | ||
510 | else | 518 | else |
511 | result[i] = p1[i] / p2[i]; | 519 | result[i] = p1[i] / p2[i]; |
512 | } | 520 | } |
521 | + | ||
522 | + free(p1); | ||
523 | + free(p2); | ||
513 | return true; | 524 | return true; |
514 | } | 525 | } |
515 | 526 | ||
@@ -530,6 +541,9 @@ public: | @@ -530,6 +541,9 @@ public: | ||
530 | else | 541 | else |
531 | result[i] = p1[i] / p2[i]; | 542 | result[i] = p1[i] / p2[i]; |
532 | } | 543 | } |
544 | + | ||
545 | + free(p1); | ||
546 | + free(p2); | ||
533 | return true; | 547 | return true; |
534 | } | 548 | } |
535 | 549 | ||
@@ -550,9 +564,108 @@ public: | @@ -550,9 +564,108 @@ public: | ||
550 | else | 564 | else |
551 | result[i] = p1[i] / p2[i]; | 565 | result[i] = p1[i] / p2[i]; |
552 | } | 566 | } |
567 | + | ||
568 | + free(p1); | ||
569 | + free(p2); | ||
553 | return true; | 570 | return true; |
554 | } | 571 | } |
555 | 572 | ||
573 | + //x * f(x) | ||
574 | + bool x_area(double lb, double rb, double lab, double rab, T* result){ | ||
575 | + T* lp; //left band pointer | ||
576 | + T* rp; //right band pointer | ||
577 | + T* cur; //current band 1 | ||
578 | + T* cur2; //current band 2 | ||
579 | + | ||
580 | + unsigned XY = R[0] * R[1]; | ||
581 | + unsigned S = XY * sizeof(T); | ||
582 | + | ||
583 | + lp = (T*) malloc(S); //memory allocation | ||
584 | + rp = (T*) malloc(S); | ||
585 | + cur = (T*) malloc(S); | ||
586 | + cur2 = (T*) malloc(S); | ||
587 | + | ||
588 | + memset(result, (char)0, S); | ||
589 | + | ||
590 | + //find the wavelenght position in the whole band | ||
591 | + unsigned int n = w.size(); | ||
592 | + unsigned int ai = 0; //left bound position | ||
593 | + unsigned int bi = n - 1; //right bound position | ||
594 | + | ||
595 | + //to make sure the left and the right bound are in the bandwidth | ||
596 | + if (lb < w[0] || rb < w[0] || lb > w[n-1] || rb >w[n-1]){ | ||
597 | + std::cout<<"ERROR: left bound or right bound out of bandwidth"<<std::endl; | ||
598 | + exit(1); | ||
599 | + } | ||
600 | + //to make sure rigth bound is bigger than left bound | ||
601 | + else if(lb > rb){ | ||
602 | + std::cout<<"ERROR: right bound should be bigger than left bound"<<std::endl; | ||
603 | + exit(1); | ||
604 | + } | ||
605 | + | ||
606 | + //get the position of lb and rb | ||
607 | + while (lab >= w[ai]){ | ||
608 | + ai++; | ||
609 | + } | ||
610 | + while (rab <= w[bi]){ | ||
611 | + bi--; | ||
612 | + } | ||
613 | + | ||
614 | + band(lp, lb); | ||
615 | + band(rp, rb); | ||
616 | + | ||
617 | + //calculate the beginning and the ending part | ||
618 | + baseline_band(lb, rb, lp, rp, rab, cur2); //ending part | ||
619 | + baseline_band(lb, rb, lp, rp, w[bi], cur); | ||
620 | + for(unsigned j = 0; j < XY; j++){ | ||
621 | + result[j] += (rab - w[bi]) * (rab + w[bi]) * (cur[j] + cur2[j]) / 4.0; | ||
622 | + } | ||
623 | + baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part | ||
624 | + baseline_band(lb, rb, lp, rp, w[ai], cur); | ||
625 | + for(unsigned j = 0; j < XY; j++){ | ||
626 | + result[j] += (w[ai] - lab) * (w[ai] + lab) * (cur[j] + cur2[j]) / 4.0; | ||
627 | + } | ||
628 | + | ||
629 | + //calculate f(x) times x | ||
630 | + ai++; | ||
631 | + for(unsigned i = ai; i <= bi ;i++) | ||
632 | + { | ||
633 | + baseline_band(lb, rb, lp, rp, w[ai], cur2); | ||
634 | + for(unsigned j = 0; j < XY; j++) | ||
635 | + { | ||
636 | + result[j] += (w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * (cur[j] + cur2[j]) / 4.0; | ||
637 | + } | ||
638 | + std::swap(cur,cur2); //swap the band pointers | ||
639 | + } | ||
640 | + | ||
641 | + free(lp); | ||
642 | + free(rp); | ||
643 | + free(cur); | ||
644 | + free(cur2); | ||
645 | + return true; | ||
646 | + } | ||
647 | + | ||
648 | + //centroid point | ||
649 | + bool cpoint(double lb, double rb, double lab, double rab, T* result){ | ||
650 | + T* p1 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
651 | + T* p2 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
652 | + | ||
653 | + //get the area and the peak band | ||
654 | + x_area(lb, rb, lab, rab, p1); | ||
655 | + area(lb, rb, lab, rab, p2); | ||
656 | + //calculate the ratio in result | ||
657 | + for(unsigned i = 0; i < R[0] * R[1]; i++){ | ||
658 | + if(p1[i] == 0 && p2[i] ==0) | ||
659 | + result[i] = 1; | ||
660 | + else | ||
661 | + result[i] = p1[i] / p2[i]; | ||
662 | + } | ||
663 | + | ||
664 | + free(p1); | ||
665 | + free(p2); | ||
666 | + return true; | ||
667 | + } | ||
668 | + | ||
556 | //create mask file | 669 | //create mask file |
557 | bool mask(unsigned char* p, double mask_band, double threshold){ | 670 | bool mask(unsigned char* p, double mask_band, double threshold){ |
558 | 671 | ||
@@ -566,6 +679,7 @@ public: | @@ -566,6 +679,7 @@ public: | ||
566 | p[i] = 255; | 679 | p[i] = 255; |
567 | } | 680 | } |
568 | 681 | ||
682 | + free(temp); | ||
569 | return true; | 683 | return true; |
570 | } | 684 | } |
571 | 685 |
envi/bip.h
@@ -63,8 +63,7 @@ public: | @@ -63,8 +63,7 @@ public: | ||
63 | unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band | 63 | unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band |
64 | 64 | ||
65 | unsigned page=0; //bands around the wavelength | 65 | unsigned page=0; //bands around the wavelength |
66 | - T * p1; | ||
67 | - T * p2; | 66 | + |
68 | 67 | ||
69 | //get the bands numbers around the wavelength | 68 | //get the bands numbers around the wavelength |
70 | 69 | ||
@@ -85,6 +84,8 @@ public: | @@ -85,6 +84,8 @@ public: | ||
85 | } | 84 | } |
86 | if ( wavelength < w[page] ) | 85 | if ( wavelength < w[page] ) |
87 | { | 86 | { |
87 | + T * p1; | ||
88 | + T * p2; | ||
88 | p1=(T*)malloc( XY * sizeof(T)); //memory allocation | 89 | p1=(T*)malloc( XY * sizeof(T)); //memory allocation |
89 | p2=(T*)malloc( XY * sizeof(T)); | 90 | p2=(T*)malloc( XY * sizeof(T)); |
90 | band_index(p1, page - 1); | 91 | band_index(p1, page - 1); |
@@ -93,6 +94,8 @@ public: | @@ -93,6 +94,8 @@ public: | ||
93 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); | 94 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
94 | p[i] = (p2[i] - p1[i]) * r + p1[i]; | 95 | p[i] = (p2[i] - p1[i]) * r + p1[i]; |
95 | } | 96 | } |
97 | + free(p1); | ||
98 | + free(p2); | ||
96 | } | 99 | } |
97 | else //if the wavelength is equal to a wavelength in header file | 100 | else //if the wavelength is equal to a wavelength in header file |
98 | { | 101 | { |
@@ -108,8 +111,7 @@ public: | @@ -108,8 +111,7 @@ public: | ||
108 | unsigned int B = R[2]; | 111 | unsigned int B = R[2]; |
109 | 112 | ||
110 | unsigned page=0; //samples around the wavelength | 113 | unsigned page=0; //samples around the wavelength |
111 | - T * p1; | ||
112 | - T * p2; | 114 | + |
113 | 115 | ||
114 | //get the bands numbers around the wavelength | 116 | //get the bands numbers around the wavelength |
115 | 117 | ||
@@ -136,6 +138,8 @@ public: | @@ -136,6 +138,8 @@ public: | ||
136 | } | 138 | } |
137 | if ( wavelength < w[page] ) | 139 | if ( wavelength < w[page] ) |
138 | { | 140 | { |
141 | + T * p1; | ||
142 | + T * p2; | ||
139 | p1=(T*)malloc( X * sizeof(T)); //memory allocation | 143 | p1=(T*)malloc( X * sizeof(T)); //memory allocation |
140 | p2=(T*)malloc( X * sizeof(T)); | 144 | p2=(T*)malloc( X * sizeof(T)); |
141 | //band_index(p1, page - 1); | 145 | //band_index(p1, page - 1); |
@@ -153,6 +157,8 @@ public: | @@ -153,6 +157,8 @@ public: | ||
153 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); | 157 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
154 | p[i] = (p2[i] - p1[i]) * r + p1[i]; | 158 | p[i] = (p2[i] - p1[i]) * r + p1[i]; |
155 | } | 159 | } |
160 | + free(p1); | ||
161 | + free(p2); | ||
156 | } | 162 | } |
157 | else //if the wavelength is equal to a wavelength in header file | 163 | else //if the wavelength is equal to a wavelength in header file |
158 | { | 164 | { |
@@ -488,8 +494,7 @@ public: | @@ -488,8 +494,7 @@ public: | ||
488 | } | 494 | } |
489 | return true; | 495 | return true; |
490 | } | 496 | } |
491 | - //untested | ||
492 | - //providing the left and the right bound wavelength, return baseline-corrected band height | 497 | + |
493 | bool height(double lb, double rb, double bandwavelength, T* result){ | 498 | bool height(double lb, double rb, double bandwavelength, T* result){ |
494 | 499 | ||
495 | T* lp; | 500 | T* lp; |
@@ -504,6 +509,8 @@ public: | @@ -504,6 +509,8 @@ public: | ||
504 | 509 | ||
505 | baseline_band(lb, rb, lp, rp, bandwavelength, result); | 510 | baseline_band(lb, rb, lp, rp, bandwavelength, result); |
506 | 511 | ||
512 | + free(lp); | ||
513 | + free(rp); | ||
507 | return true; | 514 | return true; |
508 | } | 515 | } |
509 | 516 | ||
@@ -566,6 +573,7 @@ public: | @@ -566,6 +573,7 @@ public: | ||
566 | for(unsigned j = 0; j < XY; j++){ | 573 | for(unsigned j = 0; j < XY; j++){ |
567 | result[j] += (w[ai] - lab) * (cur[j] + cur2[j]) / 2.0; | 574 | result[j] += (w[ai] - lab) * (cur[j] + cur2[j]) / 2.0; |
568 | } | 575 | } |
576 | + | ||
569 | //calculate the area | 577 | //calculate the area |
570 | ai++; | 578 | ai++; |
571 | for(unsigned i = ai; i <= bi ;i++) | 579 | for(unsigned i = ai; i <= bi ;i++) |
@@ -578,6 +586,10 @@ public: | @@ -578,6 +586,10 @@ public: | ||
578 | std::swap(cur,cur2); //swap the band pointers | 586 | std::swap(cur,cur2); //swap the band pointers |
579 | } | 587 | } |
580 | 588 | ||
589 | + free(lp); | ||
590 | + free(rp); | ||
591 | + free(cur); | ||
592 | + free(cur2); | ||
581 | return true; | 593 | return true; |
582 | } | 594 | } |
583 | 595 | ||
@@ -597,6 +609,9 @@ public: | @@ -597,6 +609,9 @@ public: | ||
597 | else | 609 | else |
598 | result[i] = p1[i] / p2[i]; | 610 | result[i] = p1[i] / p2[i]; |
599 | } | 611 | } |
612 | + | ||
613 | + free(p1); | ||
614 | + free(p2); | ||
600 | return true; | 615 | return true; |
601 | } | 616 | } |
602 | 617 | ||
@@ -617,6 +632,9 @@ public: | @@ -617,6 +632,9 @@ public: | ||
617 | else | 632 | else |
618 | result[i] = p1[i] / p2[i]; | 633 | result[i] = p1[i] / p2[i]; |
619 | } | 634 | } |
635 | + | ||
636 | + free(p1); | ||
637 | + free(p2); | ||
620 | return true; | 638 | return true; |
621 | } | 639 | } |
622 | 640 | ||
@@ -637,8 +655,108 @@ public: | @@ -637,8 +655,108 @@ public: | ||
637 | else | 655 | else |
638 | result[i] = p1[i] / p2[i]; | 656 | result[i] = p1[i] / p2[i]; |
639 | } | 657 | } |
658 | + | ||
659 | + free(p1); | ||
660 | + free(p2); | ||
640 | return true; | 661 | return true; |
641 | } | 662 | } |
663 | + | ||
664 | + //x * f(x) | ||
665 | + bool x_area(double lb, double rb, double lab, double rab, T* result){ | ||
666 | + T* lp; //left band pointer | ||
667 | + T* rp; //right band pointer | ||
668 | + T* cur; //current band 1 | ||
669 | + T* cur2; //current band 2 | ||
670 | + | ||
671 | + unsigned XY = R[0] * R[1]; | ||
672 | + unsigned S = XY * sizeof(T); | ||
673 | + | ||
674 | + lp = (T*) malloc(S); //memory allocation | ||
675 | + rp = (T*) malloc(S); | ||
676 | + cur = (T*) malloc(S); | ||
677 | + cur2 = (T*) malloc(S); | ||
678 | + | ||
679 | + memset(result, (char)0, S); | ||
680 | + | ||
681 | + //find the wavelenght position in the whole band | ||
682 | + unsigned int n = w.size(); | ||
683 | + unsigned int ai = 0; //left bound position | ||
684 | + unsigned int bi = n - 1; //right bound position | ||
685 | + | ||
686 | + //to make sure the left and the right bound are in the bandwidth | ||
687 | + if (lb < w[0] || rb < w[0] || lb > w[n-1] || rb >w[n-1]){ | ||
688 | + std::cout<<"ERROR: left bound or right bound out of bandwidth"<<std::endl; | ||
689 | + exit(1); | ||
690 | + } | ||
691 | + //to make sure rigth bound is bigger than left bound | ||
692 | + else if(lb > rb){ | ||
693 | + std::cout<<"ERROR: right bound should be bigger than left bound"<<std::endl; | ||
694 | + exit(1); | ||
695 | + } | ||
696 | + | ||
697 | + //get the position of lb and rb | ||
698 | + while (lab >= w[ai]){ | ||
699 | + ai++; | ||
700 | + } | ||
701 | + while (rab <= w[bi]){ | ||
702 | + bi--; | ||
703 | + } | ||
704 | + | ||
705 | + band(lp, lb); | ||
706 | + band(rp, rb); | ||
707 | + | ||
708 | + //calculate the beginning and the ending part | ||
709 | + baseline_band(lb, rb, lp, rp, rab, cur2); //ending part | ||
710 | + baseline_band(lb, rb, lp, rp, w[bi], cur); | ||
711 | + for(unsigned j = 0; j < XY; j++){ | ||
712 | + result[j] += (rab - w[bi]) * (rab + w[bi]) * (cur[j] + cur2[j]) / 4.0; | ||
713 | + } | ||
714 | + baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part | ||
715 | + baseline_band(lb, rb, lp, rp, w[ai], cur); | ||
716 | + for(unsigned j = 0; j < XY; j++){ | ||
717 | + result[j] += (w[ai] - lab) * (w[ai] + lab) * (cur[j] + cur2[j]) / 4.0; | ||
718 | + } | ||
719 | + | ||
720 | + //calculate f(x) times x | ||
721 | + ai++; | ||
722 | + for(unsigned i = ai; i <= bi ;i++) | ||
723 | + { | ||
724 | + baseline_band(lb, rb, lp, rp, w[ai], cur2); | ||
725 | + for(unsigned j = 0; j < XY; j++) | ||
726 | + { | ||
727 | + result[j] += (w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * (cur[j] + cur2[j]) / 4.0; | ||
728 | + } | ||
729 | + std::swap(cur,cur2); //swap the band pointers | ||
730 | + } | ||
731 | + | ||
732 | + free(lp); | ||
733 | + free(rp); | ||
734 | + free(cur); | ||
735 | + free(cur2); | ||
736 | + return true; | ||
737 | + } | ||
738 | + | ||
739 | + //centroid point | ||
740 | + bool cpoint(double lb, double rb, double lab, double rab, T* result){ | ||
741 | + T* p1 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
742 | + T* p2 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
743 | + | ||
744 | + //get the area and the peak band | ||
745 | + x_area(lb, rb, lab, rab, p1); | ||
746 | + area(lb, rb, lab, rab, p2); | ||
747 | + //calculate the ratio in result | ||
748 | + for(unsigned i = 0; i < R[0] * R[1]; i++){ | ||
749 | + if(p1[i] == 0 && p2[i] ==0) | ||
750 | + result[i] = 1; | ||
751 | + else | ||
752 | + result[i] = p1[i] / p2[i]; | ||
753 | + } | ||
754 | + | ||
755 | + free(p1); | ||
756 | + free(p2); | ||
757 | + return true; | ||
758 | + } | ||
759 | + | ||
642 | //create mask file | 760 | //create mask file |
643 | bool mask(unsigned char* p, double mask_band, double threshold){ | 761 | bool mask(unsigned char* p, double mask_band, double threshold){ |
644 | 762 | ||
@@ -652,6 +770,7 @@ public: | @@ -652,6 +770,7 @@ public: | ||
652 | p[i] = 255; | 770 | p[i] = 255; |
653 | } | 771 | } |
654 | 772 | ||
773 | + free(temp); | ||
655 | return true; | 774 | return true; |
656 | 775 | ||
657 | } | 776 | } |
envi/bsq.h
@@ -64,8 +64,7 @@ public: | @@ -64,8 +64,7 @@ public: | ||
64 | unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band | 64 | unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band |
65 | 65 | ||
66 | unsigned page=0; //bands around the wavelength | 66 | unsigned page=0; //bands around the wavelength |
67 | - T * p1; | ||
68 | - T * p2; | 67 | + |
69 | 68 | ||
70 | //get the bands numbers around the wavelength | 69 | //get the bands numbers around the wavelength |
71 | 70 | ||
@@ -86,6 +85,8 @@ public: | @@ -86,6 +85,8 @@ public: | ||
86 | } | 85 | } |
87 | if ( wavelength < w[page] ) | 86 | if ( wavelength < w[page] ) |
88 | { | 87 | { |
88 | + T * p1; | ||
89 | + T * p2; | ||
89 | p1=(T*)malloc( XY * sizeof(T)); //memory allocation | 90 | p1=(T*)malloc( XY * sizeof(T)); //memory allocation |
90 | p2=(T*)malloc( XY * sizeof(T)); | 91 | p2=(T*)malloc( XY * sizeof(T)); |
91 | band_index(p1, page - 1); | 92 | band_index(p1, page - 1); |
@@ -94,6 +95,8 @@ public: | @@ -94,6 +95,8 @@ public: | ||
94 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); | 95 | double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]); |
95 | p[i] = (p2[i] - p1[i]) * r + p1[i]; | 96 | p[i] = (p2[i] - p1[i]) * r + p1[i]; |
96 | } | 97 | } |
98 | + free(p1); | ||
99 | + free(p2); | ||
97 | } | 100 | } |
98 | else //if the wavelength is equal to a wavelength in header file | 101 | else //if the wavelength is equal to a wavelength in header file |
99 | { | 102 | { |
@@ -327,7 +330,7 @@ public: | @@ -327,7 +330,7 @@ public: | ||
327 | } | 330 | } |
328 | return true; | 331 | return true; |
329 | } | 332 | } |
330 | - //untested | 333 | + |
331 | //providing the left and the right bound wavelength, return baseline-corrected band height | 334 | //providing the left and the right bound wavelength, return baseline-corrected band height |
332 | bool height(double lb, double rb, double bandwavelength, T* result){ | 335 | bool height(double lb, double rb, double bandwavelength, T* result){ |
333 | 336 | ||
@@ -343,6 +346,8 @@ public: | @@ -343,6 +346,8 @@ public: | ||
343 | 346 | ||
344 | baseline_band(lb, rb, lp, rp, bandwavelength, result); | 347 | baseline_band(lb, rb, lp, rp, bandwavelength, result); |
345 | 348 | ||
349 | + free(lp); | ||
350 | + free(rp); | ||
346 | return true; | 351 | return true; |
347 | } | 352 | } |
348 | 353 | ||
@@ -418,6 +423,10 @@ public: | @@ -418,6 +423,10 @@ public: | ||
418 | std::swap(cur,cur2); //swap the band pointers | 423 | std::swap(cur,cur2); //swap the band pointers |
419 | } | 424 | } |
420 | 425 | ||
426 | + free(lp); | ||
427 | + free(rp); | ||
428 | + free(cur); | ||
429 | + free(cur2); | ||
421 | return true; | 430 | return true; |
422 | } | 431 | } |
423 | 432 | ||
@@ -437,6 +446,9 @@ public: | @@ -437,6 +446,9 @@ public: | ||
437 | else | 446 | else |
438 | result[i] = p1[i] / p2[i]; | 447 | result[i] = p1[i] / p2[i]; |
439 | } | 448 | } |
449 | + | ||
450 | + free(p1); | ||
451 | + free(p2); | ||
440 | return true; | 452 | return true; |
441 | } | 453 | } |
442 | 454 | ||
@@ -457,6 +469,9 @@ public: | @@ -457,6 +469,9 @@ public: | ||
457 | else | 469 | else |
458 | result[i] = p1[i] / p2[i]; | 470 | result[i] = p1[i] / p2[i]; |
459 | } | 471 | } |
472 | + | ||
473 | + free(p1); | ||
474 | + free(p2); | ||
460 | return true; | 475 | return true; |
461 | } | 476 | } |
462 | 477 | ||
@@ -477,8 +492,108 @@ public: | @@ -477,8 +492,108 @@ public: | ||
477 | else | 492 | else |
478 | result[i] = p1[i] / p2[i]; | 493 | result[i] = p1[i] / p2[i]; |
479 | } | 494 | } |
495 | + | ||
496 | + free(p1); | ||
497 | + free(p2); | ||
480 | return true; | 498 | return true; |
481 | } | 499 | } |
500 | + | ||
501 | + //x * f(x) | ||
502 | + bool x_area(double lb, double rb, double lab, double rab, T* result){ | ||
503 | + T* lp; //left band pointer | ||
504 | + T* rp; //right band pointer | ||
505 | + T* cur; //current band 1 | ||
506 | + T* cur2; //current band 2 | ||
507 | + | ||
508 | + unsigned XY = R[0] * R[1]; | ||
509 | + unsigned S = XY * sizeof(T); | ||
510 | + | ||
511 | + lp = (T*) malloc(S); //memory allocation | ||
512 | + rp = (T*) malloc(S); | ||
513 | + cur = (T*) malloc(S); | ||
514 | + cur2 = (T*) malloc(S); | ||
515 | + | ||
516 | + memset(result, (char)0, S); | ||
517 | + | ||
518 | + //find the wavelenght position in the whole band | ||
519 | + unsigned int n = w.size(); | ||
520 | + unsigned int ai = 0; //left bound position | ||
521 | + unsigned int bi = n - 1; //right bound position | ||
522 | + | ||
523 | + //to make sure the left and the right bound are in the bandwidth | ||
524 | + if (lb < w[0] || rb < w[0] || lb > w[n-1] || rb >w[n-1]){ | ||
525 | + std::cout<<"ERROR: left bound or right bound out of bandwidth"<<std::endl; | ||
526 | + exit(1); | ||
527 | + } | ||
528 | + //to make sure rigth bound is bigger than left bound | ||
529 | + else if(lb > rb){ | ||
530 | + std::cout<<"ERROR: right bound should be bigger than left bound"<<std::endl; | ||
531 | + exit(1); | ||
532 | + } | ||
533 | + | ||
534 | + //get the position of lb and rb | ||
535 | + while (lab >= w[ai]){ | ||
536 | + ai++; | ||
537 | + } | ||
538 | + while (rab <= w[bi]){ | ||
539 | + bi--; | ||
540 | + } | ||
541 | + | ||
542 | + band(lp, lb); | ||
543 | + band(rp, rb); | ||
544 | + | ||
545 | + //calculate the beginning and the ending part | ||
546 | + baseline_band(lb, rb, lp, rp, rab, cur2); //ending part | ||
547 | + baseline_band(lb, rb, lp, rp, w[bi], cur); | ||
548 | + for(unsigned j = 0; j < XY; j++){ | ||
549 | + result[j] += (rab - w[bi]) * (rab + w[bi]) * (cur[j] + cur2[j]) / 4.0; | ||
550 | + } | ||
551 | + baseline_band(lb, rb, lp, rp, lab, cur2); //beginnning part | ||
552 | + baseline_band(lb, rb, lp, rp, w[ai], cur); | ||
553 | + for(unsigned j = 0; j < XY; j++){ | ||
554 | + result[j] += (w[ai] - lab) * (w[ai] + lab) * (cur[j] + cur2[j]) / 4.0; | ||
555 | + } | ||
556 | + | ||
557 | + //calculate f(x) times x | ||
558 | + ai++; | ||
559 | + for(unsigned i = ai; i <= bi ;i++) | ||
560 | + { | ||
561 | + baseline_band(lb, rb, lp, rp, w[ai], cur2); | ||
562 | + for(unsigned j = 0; j < XY; j++) | ||
563 | + { | ||
564 | + result[j] += (w[ai] - w[ai-1]) * (w[ai] + w[ai-1]) * (cur[j] + cur2[j]) / 4.0; | ||
565 | + } | ||
566 | + std::swap(cur,cur2); //swap the band pointers | ||
567 | + } | ||
568 | + | ||
569 | + free(lp); | ||
570 | + free(rp); | ||
571 | + free(cur); | ||
572 | + free(cur2); | ||
573 | + return true; | ||
574 | + } | ||
575 | + | ||
576 | + //centroid point | ||
577 | + bool cpoint(double lb, double rb, double lab, double rab, T* result){ | ||
578 | + T* p1 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
579 | + T* p2 = (T*)malloc(R[0] * R[1] * sizeof(T)); | ||
580 | + | ||
581 | + //get the area and the peak band | ||
582 | + x_area(lb, rb, lab, rab, p1); | ||
583 | + area(lb, rb, lab, rab, p2); | ||
584 | + //calculate the ratio in result | ||
585 | + for(unsigned i = 0; i < R[0] * R[1]; i++){ | ||
586 | + if(p1[i] == 0 && p2[i] ==0) | ||
587 | + result[i] = 1; | ||
588 | + else | ||
589 | + result[i] = p1[i] / p2[i]; | ||
590 | + } | ||
591 | + | ||
592 | + free(p1); | ||
593 | + free(p2); | ||
594 | + return true; | ||
595 | + } | ||
596 | + | ||
482 | //create mask file | 597 | //create mask file |
483 | bool mask(unsigned char* p, double mask_band, double threshold){ | 598 | bool mask(unsigned char* p, double mask_band, double threshold){ |
484 | 599 | ||
@@ -492,6 +607,7 @@ public: | @@ -492,6 +607,7 @@ public: | ||
492 | p[i] = 255; | 607 | p[i] = 255; |
493 | } | 608 | } |
494 | 609 | ||
610 | + free(temp); | ||
495 | return true; | 611 | return true; |
496 | 612 | ||
497 | } | 613 | } |
envi/envi.h
@@ -419,6 +419,42 @@ public: | @@ -419,6 +419,42 @@ public: | ||
419 | return false; | 419 | return false; |
420 | } | 420 | } |
421 | 421 | ||
422 | + //center of gravity | ||
423 | + bool cpoint(double lb1, double rb1, double lab1, double rab1, void* result){ | ||
424 | + if(header.interleave == envi_header::BSQ){ //if the infile is bsq file | ||
425 | + if(header.data_type ==envi_header::float32) | ||
426 | + return ((bsq<float>*)file)->cpoint(lb1, rb1, lab1, rab1, (float*)result); | ||
427 | + else if(header.data_type == envi_header::float64) | ||
428 | + return ((bsq<double>*)file)->cpoint(lb1, rb1, lab1, rab1, (double*)result); | ||
429 | + else | ||
430 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
431 | + } | ||
432 | + | ||
433 | + else if(header.interleave == envi_header::BIL){ //if the infile is bil file | ||
434 | + if(header.data_type ==envi_header::float32) | ||
435 | + return ((bil<float>*)file)->cpoint(lb1, rb1, lab1, rab1, (float*)result); | ||
436 | + else if(header.data_type == envi_header::float64) | ||
437 | + return ((bil<double>*)file)->cpoint(lb1, rb1, lab1, rab1, (double*)result); | ||
438 | + else | ||
439 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
440 | + } | ||
441 | + | ||
442 | + else if(header.interleave == envi_header::BIP){ //if the infile is bip file | ||
443 | + if(header.data_type ==envi_header::float32) | ||
444 | + return ((bip<float>*)file)->cpoint(lb1, rb1, lab1, rab1,(float*)result); | ||
445 | + else if(header.data_type == envi_header::float64) | ||
446 | + return ((bip<double>*)file)->cpoint(lb1, rb1, lab1, rab1, (double*)result); | ||
447 | + else | ||
448 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
449 | + } | ||
450 | + | ||
451 | + else{ | ||
452 | + std::cout<<"ERROR: unidentified file type"<<std::endl; | ||
453 | + exit(1); | ||
454 | + } | ||
455 | + return false; | ||
456 | + } | ||
457 | + | ||
422 | bool close(){ | 458 | bool close(){ |
423 | if(header.interleave == envi_header::BSQ){ | 459 | if(header.interleave == envi_header::BSQ){ |
424 | if(header.data_type ==envi_header::float32) | 460 | if(header.data_type ==envi_header::float32) |