Commit 8550e94f60fe751491ee61e6ebc242b085f6ae24
1 parent
2fcab4f0
added sifting and unsifting support for BIP files
Showing
2 changed files
with
93 additions
and
27 deletions
Show diff stats
stim/envi/bip.h
@@ -837,40 +837,101 @@ public: | @@ -837,40 +837,101 @@ public: | ||
837 | 837 | ||
838 | 838 | ||
839 | /// Saves to disk only those spectra corresponding to mask values != 0 | 839 | /// Saves to disk only those spectra corresponding to mask values != 0 |
840 | - bool sift(std::string outfile, unsigned char* p){ | ||
841 | - // Assume X() = X, Y() = Y, Z() = Z. | 840 | + bool sift(std::string outfile, unsigned char* mask){ |
841 | + | ||
842 | + //reset the file pointer to the beginning of the file | ||
843 | + file.seekg(0, std::ios::beg); | ||
844 | + | ||
845 | + // open an output stream | ||
842 | std::ofstream target(outfile.c_str(), std::ios::binary); | 846 | std::ofstream target(outfile.c_str(), std::ios::binary); |
843 | 847 | ||
844 | - //for loading pages: | ||
845 | - unsigned ZX = X() * Z(); //calculate the number of values in an XZ page on disk | ||
846 | - unsigned L = ZX * sizeof(T); //calculate the size of the page (in bytes) | ||
847 | - T * temp = (T*)malloc(L); //allocate memory for a temporary page | 848 | + //allocate space for a single spectrum |
849 | + unsigned int B = Z(); | ||
850 | + T* spectrum = (T*) malloc(B * sizeof(T)); | ||
848 | 851 | ||
849 | - //for saving spectra: | ||
850 | - unsigned LZ = Z() * sizeof(T); //calculate the size of the spectrum (in bytes) | ||
851 | - T * tempZ = (T*)malloc(LZ); //allocate memory for a temporary spectrum | ||
852 | - spectrum(tempZ, X() - 1, Y() - 1); //creates a dummy spectrum by taking the last spectrum in the image | 852 | + //calculate the number of pixels in a band |
853 | + unsigned int XY = X() * Y(); | ||
853 | 854 | ||
854 | - for (unsigned i = 0; i < Y(); i++) //Select a page by choosing Y coordinate, Y() | ||
855 | - { | ||
856 | - read_plane_y(temp, i); //retrieve an ZX page, store in "temp" | ||
857 | - for (unsigned j = 0; j < X(); j++) //Select a pixel by choosing X coordinate in the page, X() | ||
858 | - { | ||
859 | - if (p[j * X() + i] != 0) //if the mask != 0 at that XY pixel | ||
860 | - { | ||
861 | - for (unsigned k = 0; k < Z(); k++) //Select a voxel by choosing Z coordinate at the pixel | ||
862 | - { | ||
863 | - tempZ[k] = temp[i*Z() + k]; //Pass the correct spectral value from XZ page into the spectrum to be saved. | ||
864 | - } | ||
865 | - target.write(reinterpret_cast<const char*>(tempZ), LZ); //write that spectrum to disk. Size is L2. | ||
866 | - } | ||
867 | - else | ||
868 | - continue; | 855 | + //for each pixel |
856 | + unsigned int skip = 0; //number of spectra to skip | ||
857 | + for(unsigned int x = 0; x < XY; x++){ | ||
858 | + | ||
859 | + //if the current pixel isn't masked | ||
860 | + if( mask[x] == 0){ | ||
861 | + //increment the number of skipped pixels | ||
862 | + skip++; | ||
869 | } | 863 | } |
864 | + //if the current pixel is masked | ||
865 | + else{ | ||
866 | + | ||
867 | + //skip the intermediate pixels | ||
868 | + file.seekg(skip * B * sizeof(T), std::ios::cur); | ||
869 | + | ||
870 | + //set the skip value to zero | ||
871 | + skip = 0; | ||
872 | + | ||
873 | + //read this pixel into memory | ||
874 | + file.read((char *)spectrum, B * sizeof(T)); | ||
875 | + | ||
876 | + //write this pixel out | ||
877 | + target.write((char *)spectrum, B * sizeof(T)); | ||
878 | + } | ||
879 | + | ||
870 | } | 880 | } |
881 | + | ||
882 | + //close the output file | ||
871 | target.close(); | 883 | target.close(); |
872 | - free(temp); | 884 | + free(spectrum); |
885 | + } | ||
886 | + | ||
887 | + bool unsift(std::string outfile, unsigned char* mask, unsigned int samples, unsigned int lines){ | ||
888 | + | ||
889 | + // open an output stream | ||
890 | + std::ofstream target(outfile.c_str(), std::ios::binary); | ||
891 | + | ||
892 | + //reset the file pointer to the beginning of the file | ||
893 | + file.seekg(0, std::ios::beg); | ||
894 | + | ||
895 | + //allocate space for a single spectrum | ||
896 | + unsigned int B = Z(); | ||
897 | + T* spectrum = (T*) malloc(B * sizeof(T)); | ||
898 | + | ||
899 | + //allocate space for a spectrum of zeros | ||
900 | + T* zeros = (T*) malloc(B * sizeof(T)); | ||
901 | + memset(zeros, 0, B * sizeof(T)); | ||
902 | + | ||
903 | + //calculate the number of pixels in a band | ||
904 | + unsigned int XY = samples * lines; | ||
905 | + | ||
906 | + //for each pixel | ||
907 | + unsigned int skip = 0; //number of spectra to skip | ||
908 | + for(unsigned int x = 0; x < XY; x++){ | ||
909 | + | ||
910 | + //if the current pixel isn't masked | ||
911 | + if( mask[x] == 0){ | ||
912 | + | ||
913 | + //write a bunch of zeros | ||
914 | + target.write((char *)zeros, B * sizeof(T)); | ||
915 | + } | ||
916 | + //if the current pixel is masked | ||
917 | + else{ | ||
918 | + | ||
919 | + //read a pixel into memory | ||
920 | + file.read((char *)spectrum, B * sizeof(T)); | ||
921 | + | ||
922 | + //write this pixel out | ||
923 | + target.write((char *)spectrum, B * sizeof(T)); | ||
924 | + } | ||
925 | + | ||
926 | + } | ||
927 | + | ||
928 | + //close the output file | ||
929 | + target.close(); | ||
930 | + free(spectrum); | ||
931 | + | ||
873 | return true; | 932 | return true; |
933 | + | ||
934 | + | ||
874 | } | 935 | } |
875 | 936 | ||
876 | 937 |
stim/envi/envi.h
@@ -455,7 +455,12 @@ public: | @@ -455,7 +455,12 @@ public: | ||
455 | 455 | ||
456 | else if (header.interleave == envi_header::BIP){ //if the infile is bip file | 456 | else if (header.interleave == envi_header::BIP){ //if the infile is bip file |
457 | 457 | ||
458 | - std::cout << "ERROR in stim::envi::unsift - BIP files aren't supported yet" << std::endl; | 458 | + if (header.data_type == envi_header::float32) |
459 | + return ((bip<float>*)file)->unsift(outfile, mask, samples, lines); | ||
460 | + else if (header.data_type == envi_header::float64) | ||
461 | + return ((bip<double>*)file)->unsift(outfile, mask, samples, lines); | ||
462 | + else | ||
463 | + std::cout << "ERROR: unidentified data type" << std::endl; | ||
459 | } | 464 | } |
460 | 465 | ||
461 | else{ | 466 | else{ |