Commit bfe9c6db5bec258b7992a0c9bc63f1d3ff547904
1 parent
1582ce07
added feature_matrix in envi class
Showing
4 changed files
with
130 additions
and
3 deletions
Show diff stats
envi/bil.h
@@ -164,13 +164,25 @@ public: | @@ -164,13 +164,25 @@ public: | ||
164 | file.seekg((y * R[0] * R[2] + x) * sizeof(T), std::ios::beg); | 164 | file.seekg((y * R[0] * R[2] + x) * sizeof(T), std::ios::beg); |
165 | 165 | ||
166 | for(unsigned i = 0; i < R[2]; i++) | 166 | for(unsigned i = 0; i < R[2]; i++) |
167 | - { //point to the certain sample and line | 167 | + { |
168 | + //point to the certain sample and line | ||
168 | file.read((char *)(p + i), sizeof(T)); | 169 | file.read((char *)(p + i), sizeof(T)); |
169 | file.seekg(jump, std::ios::cur); | 170 | file.seekg(jump, std::ios::cur); |
170 | } | 171 | } |
171 | 172 | ||
172 | return true; | 173 | return true; |
173 | } | 174 | } |
175 | + | ||
176 | + //save one pixel into memory | ||
177 | + bool pixel(T * p, unsigned n){ | ||
178 | + | ||
179 | + //calculate the corresponding x, y | ||
180 | + unsigned int x = n % R[0]; | ||
181 | + unsigned int y = n / R[0]; | ||
182 | + | ||
183 | + //get the pixel | ||
184 | + return spectrum(p, x, y); | ||
185 | + } | ||
174 | 186 | ||
175 | //given a Y ,return a XZ slice | 187 | //given a Y ,return a XZ slice |
176 | bool getY(T * p, unsigned y) | 188 | bool getY(T * p, unsigned y) |
envi/bip.h
@@ -261,6 +261,20 @@ public: | @@ -261,6 +261,20 @@ public: | ||
261 | 261 | ||
262 | return true; | 262 | return true; |
263 | } | 263 | } |
264 | + | ||
265 | + //save one pixel into memory | ||
266 | + bool pixel(T * p, unsigned n){ | ||
267 | + | ||
268 | + unsigned bandnum = R[0] * R[1]; //calculate numbers in one band | ||
269 | + if ( n >= bandnum){ //make sure the pixel number is right | ||
270 | + std::cout<<"ERROR: sample or line out of range"<<std::endl; | ||
271 | + return false; | ||
272 | + } | ||
273 | + | ||
274 | + file.seekg(n * R[2] * sizeof(T), std::ios::beg); //point to the certain pixel | ||
275 | + file.read((char *)p, sizeof(T) * R[2]); | ||
276 | + return true; | ||
277 | + } | ||
264 | 278 | ||
265 | //given a Y ,return a ZX slice | 279 | //given a Y ,return a ZX slice |
266 | bool getY(T * p, unsigned y) | 280 | bool getY(T * p, unsigned y) |
envi/bsq.h
@@ -118,7 +118,7 @@ public: | @@ -118,7 +118,7 @@ public: | ||
118 | } | 118 | } |
119 | 119 | ||
120 | file.seekg((x + y * R[0]) * sizeof(T), std::ios::beg); //point to the certain sample and line | 120 | file.seekg((x + y * R[0]) * sizeof(T), std::ios::beg); //point to the certain sample and line |
121 | - for (i = 0; i < R[3]; i++) | 121 | + for (i = 0; i < R[2]; i++) |
122 | { | 122 | { |
123 | file.read((char *)(p + i), sizeof(T)); | 123 | file.read((char *)(p + i), sizeof(T)); |
124 | file.seekg((R[1] * R[0] - 1) * sizeof(T), std::ios::cur); //go to the next band | 124 | file.seekg((R[1] * R[0] - 1) * sizeof(T), std::ios::cur); //go to the next band |
@@ -127,6 +127,25 @@ public: | @@ -127,6 +127,25 @@ public: | ||
127 | return true; | 127 | return true; |
128 | } | 128 | } |
129 | 129 | ||
130 | + //save one pixel into memory | ||
131 | + bool pixel(T * p, unsigned n){ | ||
132 | + | ||
133 | + unsigned bandnum = R[0] * R[1]; //calculate numbers in one band | ||
134 | + if ( n >= bandnum){ //make sure the pixel number is right | ||
135 | + std::cout<<"ERROR: sample or line out of range"<<std::endl; | ||
136 | + return false; | ||
137 | + } | ||
138 | + | ||
139 | + file.seekg(n * sizeof(T), std::ios::beg); //point to the certain pixel | ||
140 | + for (unsigned i = 0; i < R[2]; i++) | ||
141 | + { | ||
142 | + file.read((char *)(p + i), sizeof(T)); | ||
143 | + file.seekg((bandnum - 1) * sizeof(T), std::ios::cur); //go to the next band | ||
144 | + } | ||
145 | + | ||
146 | + return true; | ||
147 | + } | ||
148 | + | ||
130 | //baseline correction and save it into file | 149 | //baseline correction and save it into file |
131 | 150 | ||
132 | bool baseline(std::string outname, std::vector<double> wls ) | 151 | bool baseline(std::string outname, std::vector<double> wls ) |
envi/envi.h
@@ -5,6 +5,8 @@ | @@ -5,6 +5,8 @@ | ||
5 | #include "../envi/bsq.h" | 5 | #include "../envi/bsq.h" |
6 | #include "../envi/bip.h" | 6 | #include "../envi/bip.h" |
7 | #include "../envi/bil.h" | 7 | #include "../envi/bil.h" |
8 | +#include <iostream> | ||
9 | +#include "../../CImg/CImg.h" | ||
8 | 10 | ||
9 | namespace stim{ | 11 | namespace stim{ |
10 | 12 | ||
@@ -524,6 +526,40 @@ public: | @@ -524,6 +526,40 @@ public: | ||
524 | } | 526 | } |
525 | return false; | 527 | return false; |
526 | } | 528 | } |
529 | + //get one pixel from binary file | ||
530 | + bool pixel(void * p, unsigned n){ | ||
531 | + if(header.interleave == envi_header::BSQ){ | ||
532 | + if(header.data_type ==envi_header::float32) | ||
533 | + return ((bsq<float>*)file)->pixel((float*)p, n); | ||
534 | + else if(header.data_type == envi_header::float64) | ||
535 | + return ((bsq<double>*)file)->pixel((double*)p, n); | ||
536 | + else{ | ||
537 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
538 | + exit(1); | ||
539 | + } | ||
540 | + } | ||
541 | + else if(header.interleave == envi_header::BIL){ | ||
542 | + if(header.data_type ==envi_header::float32) | ||
543 | + return ((bil<float>*)file)->pixel((float*)p, n); | ||
544 | + else if(header.data_type == envi_header::float64) | ||
545 | + return ((bil<double>*)file)->pixel((double*)p, n); | ||
546 | + else{ | ||
547 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
548 | + exit(1); | ||
549 | + } | ||
550 | + } | ||
551 | + else if(header.interleave == envi_header::BIP){ | ||
552 | + if(header.data_type ==envi_header::float32) | ||
553 | + return ((bip<float>*)file)->pixel((float*)p, n); | ||
554 | + else if(header.data_type == envi_header::float64) | ||
555 | + return ((bip<double>*)file)->pixel((double*)p, n); | ||
556 | + else{ | ||
557 | + std::cout<<"ERROR: unidentified data type"<<std::endl; | ||
558 | + exit(1); | ||
559 | + } | ||
560 | + } | ||
561 | + return false; | ||
562 | + } | ||
527 | 563 | ||
528 | bool save_header(std::string filename){ | 564 | bool save_header(std::string filename){ |
529 | 565 | ||
@@ -551,8 +587,54 @@ public: | @@ -551,8 +587,54 @@ public: | ||
551 | } | 587 | } |
552 | return false; | 588 | return false; |
553 | } | 589 | } |
590 | + /* | ||
591 | + //load mask from maskfile and save it into memory | ||
592 | + bool load_mask(unsigned char * mask, std::string maskname){ | ||
593 | + //open the mask file | ||
594 | + cimg_library::CImg<unsigned char> mask_image(maskname.c_str(),true); | ||
595 | + //save mask file into memory | ||
596 | + for (unsigned i = 0; i < header.lines * header.samples; i++) | ||
597 | + mask[i] = mask_image.at(i); //how to copy value from cimg class? | ||
598 | + //close mask file | ||
599 | + mask_image.clear(); | ||
600 | + return true; | ||
601 | + }*/ | ||
554 | 602 | ||
555 | - | 603 | + //p:start positon; N: number of pixels saved in X; |
604 | + bool feature_matrix(void * X, std::string maskname, unsigned char * mask, unsigned start, unsigned N) | ||
605 | + { | ||
606 | + cimg_library::CImg<unsigned char> mask_image(maskname.c_str()); | ||
607 | + //save mask file into memory | ||
608 | + mask = mask_image.data(); | ||
609 | + //save pixels in X as floating numbers | ||
610 | + float * p = (float *)malloc(header.bands * sizeof(float)); | ||
611 | + | ||
612 | + //use mask to save valid pixel in X | ||
613 | + unsigned bandnum = header.samples * header.lines; //calculate pixel numbers in a band | ||
614 | + unsigned count = 0; //for counting use | ||
615 | + unsigned j = 0; //memory the pointer location in X | ||
616 | + | ||
617 | + for(unsigned i = start; i < bandnum; i++){ | ||
618 | + if(mask[i] != 0){ | ||
619 | + pixel(p, i); | ||
620 | + //copy p to X | ||
621 | + for(unsigned k = 0; k < header.bands; k++){ | ||
622 | + ((float *)X)[j] = p[k]; | ||
623 | + j++; | ||
624 | + } | ||
625 | + count++; | ||
626 | + if(count == N) | ||
627 | + break; | ||
628 | + } | ||
629 | + else | ||
630 | + continue; | ||
631 | + } | ||
632 | + if(count < N){ | ||
633 | + std::cout << "number of valid pixels in the mask : " << count <<"is less than N: "<< N; | ||
634 | + exit(1); | ||
635 | + } | ||
636 | + return true; | ||
637 | + } | ||
556 | 638 | ||
557 | 639 | ||
558 | 640 |