Commit cb455f987f19e090f47b5d856b5863642807c97e

Authored by David Mayerich
1 parent f6aa45e7

removed old ENVI files

envi/EnviClose.h deleted
1 -#ifndef ENVICLOSE_H  
2 -#define ENVICLOSE_H  
3 -  
4 -  
5 -#include <fstream>  
6 -#include <stdio.h>  
7 -#include "EnviHeader.h"  
8 -#include "EnviFid.h"  
9 -#include "EnviOpen.h"  
10 -  
11 -// this is to close all the opened files and to create a header file for the written files  
12 -  
13 -static void EnviClose(EnviFidClass &fid, int dimX=0)  
14 -{  
15 -  
16 - float* zeroPtr = (float*) malloc(sizeof(float) * fid.header.nF);  
17 - memset(zeroPtr, 0, sizeof(float) * fid.header.nF);  
18 -  
19 - if(fid.mode=="r")  
20 - {  
21 - fclose(fid.file);  
22 - }  
23 -  
24 - else  
25 - {  
26 - int totalPixels = fid.header.sX;  
27 - int dimY = totalPixels/dimX;  
28 -  
29 - if(totalPixels % dimX > 0)  
30 - {  
31 - dimY++;  
32 -  
33 - int padding = dimY*dimX-totalPixels;  
34 -  
35 - for(int p=0; p < padding; p++)  
36 - fwrite(zeroPtr, sizeof(float), fid.header.nF, fid.file);  
37 - }  
38 -  
39 - //write the calculated values to the header object  
40 - fid.header.sX = dimX;  
41 - fid.header.sY = dimY;  
42 -  
43 -  
44 - //write the header file to disk  
45 - //TODO  
46 -  
47 -  
48 - //close the binary file  
49 - fclose(fid.file);  
50 -  
51 - }  
52 -  
53 -  
54 -  
55 -  
56 -}  
57 -#endif  
58 -  
envi/EnviFid.h deleted
1 -#ifndef ENVIFID_H  
2 -#define ENVIFID_H  
3 -  
4 -#include <string>  
5 -#include <iostream>  
6 -#include <fstream>  
7 -#include <ctime>  
8 -#include <sstream>  
9 -#include "EnviHeader.h"  
10 -using namespace std;  
11 -  
12 -class EnviFidClass  
13 -{  
14 -public:  
15 - //binary file name  
16 - string fileName;  
17 -  
18 - //header structure  
19 - EnviHeaderClass header;  
20 -  
21 - //valid flag (is the current file valid)  
22 - int isValid;  
23 -  
24 - //file mask (NULL if the whole file is to be read)  
25 - char* mask;  
26 -  
27 - //current position (in pixels) in the file  
28 - int filePos;  
29 -  
30 - //read/write mode ("r" or "w")  
31 - string mode;  
32 -  
33 - //create a variable to store a pointer to the binary file  
34 - FILE * file;  
35 -  
36 - //constructor, set default values  
37 - EnviFidClass()  
38 - {  
39 - isValid = 0;  
40 - filePos = 0;  
41 - }  
42 -  
43 -  
44 -};  
45 -  
46 -  
47 -#endif  
envi/EnviHeader.h deleted
1 -#ifndef ENVIHEADER_H  
2 -#define ENVIHEADER_H  
3 -#include <string>  
4 -#include <iostream>  
5 -#include <fstream>  
6 -#include <ctime>  
7 -#include <sstream>  
8 -using namespace std;  
9 -  
10 -enum InterleaveType {bip, bil, bsq};  
11 -class EnviHeaderClass //"EnviheaderClass" will be used to store data into variables sX, sY, etc.  
12 -{  
13 -public:  
14 - unsigned int sX; //samples = "sX"  
15 - unsigned int sY; //lines = "sY"  
16 - unsigned int nF; //bands = "nF"  
17 - unsigned int headersize; //header offset = "headersize"  
18 - unsigned int datatype; //data type = "datatype"  
19 - InterleaveType type;  
20 - string units; //wavelength units = "units" (Usully in Wavenumber or Wavelength)  
21 - int LoadHeader(string filename)  
22 - {  
23 - ifstream inFile;  
24 - //Load the header file in the same directory, for future note, might want to modify code to either "cin" the file name of have a feature in the GUI which take into account different fileneames  
25 - inFile.open (filename.c_str());  
26 -  
27 - //If or not there is a file  
28 - if (!inFile)  
29 - {  
30 - cout<<"Error"<<endl;  
31 - return 1;  
32 - }  
33 -  
34 - string line;  
35 - getline(inFile,line);  
36 -  
37 - //If the 1st line of text file does not read ENVI, spit out an error.  
38 - if (line.compare("ENVI"))  
39 - {  
40 - cout<<"Error, not an ENVI file"<<endl;  
41 - return 1;  
42 - }  
43 -  
44 - while(inFile) //Loops through entire file  
45 - {  
46 - getline(inFile,line);  
47 - if(line.find("samples")==0)  
48 - {  
49 - sX=getNumber(line); //Calls getNumber function for "samples", stores in header.sX  
50 - }  
51 - if(line.find("lines")==0)  
52 - {  
53 - sY=getNumber(line); //Calls getNumber function for "lines", stores in header.sY  
54 - }  
55 - if(line.find("bands")==0)  
56 - {  
57 - nF=getNumber(line); //Calls getNumber function for "bands", stores in header.nF  
58 - }  
59 - if(line.find("header offset")==0)  
60 - {  
61 - headersize=getNumber(line); //Calls getNumber function for "header offset", stores in header.headersize  
62 - }  
63 - if(line.find("data type")==0)  
64 - {  
65 - datatype=getNumber(line); //Calls getNumber function for "data type", stores in header.datatype  
66 - }  
67 -  
68 - line.find("interleave");  
69 - if(line.find("interleave")==0)  
70 - {  
71 - string typeStr;  
72 - typeStr=getString(line);  
73 - if (typeStr.find("bip")==0)  
74 - type=bip;  
75 - else if(typeStr.find("bsq")==0)  
76 - type=bsq;  
77 - else if(typeStr.find("bil")==0)  
78 - type=bil;  
79 - else  
80 - {  
81 - //throw an error and exit  
82 - cout<<"Type not recognized"<<endl;  
83 - return 1;  
84 - }  
85 -  
86 - }  
87 - if(line.find("wavelength units")==0)  
88 - {  
89 - //Calls getString function for "wavelength units", stores in header.units  
90 - units=getString(line);  
91 - }  
92 - }  
93 - return 0;  
94 - }  
95 -  
96 -  
97 -private:  
98 - //retrieves a numerical parameter from a line of text  
99 - int getNumber(string line)  
100 - {  
101 - int result=0;  
102 - int position;  
103 - position=line.find("="); //Finds the position of the equal sign  
104 -  
105 - string numStr; //Creates a string for storing data called "numStr"  
106 - numStr=line.substr(position+2); //Moves from the position of "=" 2 spaces to the right...  
107 - istringstream convert(numStr); //...and converts the string into numbers using "istringstream"  
108 -  
109 - convert>>result; //converts result from previous line  
110 -  
111 - return result;  
112 - }  
113 - //retrieves a string parameter from a line of text  
114 - string getString(string line)  
115 - {  
116 - int position;  
117 - position=line.find("="); //Finds the position of the equal sign  
118 -  
119 - string word; //Creates a string for storing word data called "word"  
120 - word=line.substr(position+2); //Moves from the position of "=" 2 spaces to the right  
121 - //Note: We do not need to convert word using "istringstream"  
122 -  
123 - return word;  
124 - }  
125 -};  
126 -#endif  
envi/EnviOpen.h deleted
1 -#ifndef ENVIOPEN_H  
2 -#define ENVIOPEN_H  
3 -#include <string>  
4 -#include <iostream>  
5 -#include <fstream>  
6 -#include <ctime>  
7 -#include <sstream>  
8 -#include <stdio.h>  
9 -#include "EnviHeader.h"  
10 -#include "EnviFid.h"  
11 -using namespace std;  
12 -  
13 -  
14 -  
15 -//return value is incorrect  
16 -static EnviFidClass EnviOpen(string filename, char* mask = NULL, string mode = "r", int nBands = 0, int sX = 0)  
17 -{  
18 - //create a file ID object  
19 - EnviFidClass fid;  
20 -  
21 - //set the file read/write mode  
22 - fid.mode = mode;  
23 -  
24 - //set the mask (if specified)  
25 - fid.mask = mask;  
26 -  
27 - // load the header file only while reading  
28 - if(mode=="r")  
29 - {  
30 - //load the header file  
31 - int error = fid.header.LoadHeader(filename);  
32 -  
33 - //if the LoadHeader function is not zero, the header is invalid  
34 - if (error != 0)  
35 - {  
36 - fid.isValid = 0;  
37 - return fid;  
38 - }  
39 -  
40 - }  
41 -  
42 - //default header to be used in case of writing a file  
43 - else  
44 - {  
45 -  
46 - fid.header.datatype= 4;  
47 - fid.header.nF= nBands;  
48 - fid.header.sX=0;  
49 - fid.header.sY=1;  
50 - fid.header.headersize=0;  
51 - }  
52 - //load the binary file associated with this header  
53 - //get the binary file name  
54 -  
55 - //find the binary file name  
56 -  
57 - //locate the position of the extension  
58 - int pos = filename.find(".hdr");  
59 - string binaryname = filename.substr(0, pos);  
60 - //load the binary file using fopen()  
61 - //store the resulting FILE pointer in the EnviFidClass variable  
62 - mode += "b";  
63 - fid.file = fopen (binaryname.c_str(), mode.c_str());  
64 - if(fid.file == NULL)  
65 - {  
66 - cout<<"Error opening binary file."<<endl;  
67 - fid.isValid = 0;  
68 - return fid;  
69 - }  
70 -  
71 - //set the file name  
72 - fid.fileName = binaryname;  
73 -  
74 - fid.isValid = 1;  
75 - return fid;  
76 -}  
77 -  
78 -static EnviFidClass EnviOpen(EnviFidClass fid, char* mask = NULL, string mode = "r")  
79 -{  
80 - string filename = fid.fileName;  
81 - filename += ".hdr";  
82 -  
83 - return EnviOpen(filename, mask, mode);  
84 -}  
85 -  
86 -#endif  
87 -  
envi/EnviRead.h deleted
1 -#ifndef ENVIREAD_H  
2 -#define ENVIREAD_H  
3 -  
4 -#include <string>  
5 -#include <iostream>  
6 -#include <fstream>  
7 -#include <ctime>  
8 -#include <sstream>  
9 -#include <stdio.h>  
10 -#include "EnviHeader.h"  
11 -#include "EnviFid.h"  
12 -#include "EnviOpen.h"  
13 -using namespace std;  
14 -  
15 -  
16 -static int EnviRead(float* ptr, int nPixels, EnviFidClass &fid)  
17 -{  
18 - //number of values to read from the file  
19 - int totalPixels = fid.header.sX * fid.header.sY;  
20 -  
21 - //ERROR TEST: make sure that fid.file is a valid file pointer  
22 - if (fid.file == NULL)  
23 - {  
24 - cout<<"Binary file isn't open."<<endl;  
25 - return 0;  
26 - }  
27 -  
28 - //---------MASK implementation  
29 -  
30 -  
31 - int i=0;  
32 - unsigned int sizeRead;  
33 - //iterate through every pixel in the image  
34 - //while we have not encountered the end of the file AND we have not read nPixels pixels  
35 - while(fid.filePos < totalPixels && i < nPixels)  
36 - {  
37 - //if there is no mask OR the current pixel is valid, read it  
38 - if(fid.mask == NULL || fid.mask[fid.filePos] == 1)  
39 - {  
40 - //read the pixel directly from disk  
41 - sizeRead = fread(&ptr[fid.header.nF * i], sizeof(float), fid.header.nF, fid.file);  
42 -  
43 - //catch an error if one occurs  
44 - if (sizeRead != fid.header.nF)  
45 - {  
46 - cout<<"Error during read # "<<i<<endl;  
47 - return 0;  
48 - }  
49 - i++;  
50 - }  
51 -  
52 -  
53 - //otherwise, skip it  
54 - else  
55 - fseek(fid.file, sizeof(float) * fid.header.nF, SEEK_CUR);  
56 -  
57 - //increment the file position (used to index into the mask)  
58 - fid.filePos++;  
59 -  
60 - }  
61 -  
62 - return i;  
63 -}  
64 -  
65 -#endif  
envi/EnviWrite.h deleted
1 -#ifndef ENVIWRITE_H  
2 -#define ENVIWRITE_H  
3 -#include <fstream>  
4 -#include <stdio.h>  
5 -#include "EnviHeader.h"  
6 -#include "EnviFid.h"  
7 -#include "EnviOpen.h"  
8 -  
9 -// Take a memory pointer, and copy all of that data to disk.  
10 -static int EnviWrite(float* ptr, int npixels, EnviFidClass &fid)  
11 -{  
12 - if(fid.mode == "r") return 0;  
13 -  
14 - //open a binary file for writing  
15 - if (fid.file == NULL)  
16 - {  
17 - cout<<"Binary file isn't open."<<endl;  
18 - return 1;  
19 - }  
20 -  
21 - //allocate an array of zeros equal to the size of a single pixel  
22 - float* zeroPtr = (float*) malloc(sizeof(float) * fid.header.nF);  
23 - memset(zeroPtr, 0, sizeof(float) * fid.header.nF);  
24 -  
25 -  
26 - int j = 0;  
27 - //for each pixel send to the EnviRead function  
28 - for(int p = 0; p<npixels; p++)  
29 - {  
30 -  
31 - //while the mask is zero  
32 - while(fid.mask[fid.filePos] == 0)  
33 - {  
34 - //increment filePos  
35 - fid.filePos++;  
36 - fid.header.sX++;  
37 - j++;  
38 -  
39 - //write a sequence of zeros  
40 - size_t results= fwrite(zeroPtr, sizeof(float), fid.header.nF, fid.file);  
41 - //check for errors  
42 - if (results != fid.header.nF)  
43 - {  
44 - cout<<"Error during read # "<<j<<endl;  
45 - return 0;  
46 - }  
47 - }  
48 -  
49 - //write a pixel  
50 - size_t results= fwrite(&ptr[fid.header.nF * p], sizeof(float), fid.header.nF, fid.file);  
51 - if (results != fid.header.nF)  
52 - {  
53 - cout<<"Error during read # "<<j<<endl;  
54 - return 0;  
55 - }  
56 -  
57 - //increment filePos  
58 - fid.filePos++;  
59 - fid.header.sX++;  
60 - j++;  
61 - }  
62 -  
63 - return j;  
64 -  
65 -}  
66 -  
67 -  
68 -  
69 -  
70 -  
71 -#endif  
@@ -10,7 +10,11 @@ @@ -10,7 +10,11 @@
10 10
11 namespace stim{ 11 namespace stim{
12 12
13 -//container class for an ENVI binary file reader 13 +/** This class implements reading of ENVI hyperspectral files. These files can be stored in multiple orientations
  14 + (including BSQ, BIP, and BIL) in order to optimize streaming speed depending on applications. Basic ENVI
  15 + files are stored on disk as a large binary file with a corresponding header. Code for reading and processing
  16 + ENVI header files is in the envi_header class.
  17 +*/
14 class envi{ 18 class envi{
15 19
16 void* file; //void pointer to the relevant file reader (bip, bsq, or bil - with appropriate data type) 20 void* file; //void pointer to the relevant file reader (bip, bsq, or bil - with appropriate data type)
@@ -19,6 +23,7 @@ public: @@ -19,6 +23,7 @@ public:
19 23
20 envi_header header; 24 envi_header header;
21 25
  26 + /// Allocate memory for a new ENVI file based on the current interleave format (BIP, BIL, BSQ) and data type.
22 bool allocate(){ 27 bool allocate(){
23 28
24 file = NULL; //set file to a NULL pointer 29 file = NULL; //set file to a NULL pointer
@@ -46,6 +51,10 @@ public: @@ -46,6 +51,10 @@ public:
46 51
47 } 52 }
48 53
  54 + /// Open an existing ENVI file given the file and header names.
  55 +
  56 + /// @param filename is the name of the ENVI binary file
  57 + /// @param headername is the name of the ENVI header file
49 bool open(std::string filename, std::string headername){ 58 bool open(std::string filename, std::string headername){
50 59
51 //allocate memory 60 //allocate memory
@@ -95,7 +104,11 @@ public: @@ -95,7 +104,11 @@ public:
95 104
96 } 105 }
97 106
98 - //perform normalization 107 + /// Normalize a hyperspectral ENVI file given a band number and threshold.
  108 +
  109 + /// @param outfile is the name of the normalized file to be output
  110 + /// @param band is the band label to be output
  111 + /// @param threshold is a threshold value specified such that normalization will only be done to values in the band > threshold (preventing division by small numbers)
99 bool normalize(std::string outfile, double band, double threshold = 0.0){ 112 bool normalize(std::string outfile, double band, double threshold = 0.0){
100 113
101 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 114 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -132,7 +145,10 @@ public: @@ -132,7 +145,10 @@ public:
132 return false; 145 return false;
133 } 146 }
134 147
135 - //perform baseline correction 148 + /// Performs piecewise linear baseline correction of a hyperspectral file/
  149 +
  150 + /// @param outfile is the file name for the baseline corrected output
  151 + /// @param w is a list of band labels to serve as baseline points (zero values)
136 bool baseline(std::string outfile, std::vector<double> w){ 152 bool baseline(std::string outfile, std::vector<double> w){
137 153
138 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 154 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -174,7 +190,10 @@ public: @@ -174,7 +190,10 @@ public:
174 } 190 }
175 } 191 }
176 192
177 - //perform conversion 193 + /// Converts ENVI files between interleave types (BSQ, BIL, and BIP)
  194 +
  195 + /// @param outfile is the file name for the converted output
  196 + /// @param interleave is the interleave format for the destination file
178 bool convert(std::string outfile, stim::envi_header::interleaveType interleave){ 197 bool convert(std::string outfile, stim::envi_header::interleaveType interleave){
179 198
180 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 199 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -275,7 +294,11 @@ public: @@ -275,7 +294,11 @@ public:
275 294
276 } 295 }
277 296
278 - //create a mask based on a band and threshold, save it to p (if p is not NULL) 297 + /// Builds a mask from a band image and threshold value
  298 +
  299 + /// @param mask_band is the label for the band that will be used to build the mask
  300 + /// @param threshold is a value selected such that all band values greater than threshold will have a mask value of 'true'
  301 + /// @param p is memory of size X*Y that will store the resulting mask
279 bool build_mask(double mask_band, double threshold, unsigned char* p = NULL) { 302 bool build_mask(double mask_band, double threshold, unsigned char* p = NULL) {
280 303
281 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 304 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -308,7 +331,10 @@ public: @@ -308,7 +331,10 @@ public:
308 return false; 331 return false;
309 } 332 }
310 333
311 - //apply mask 334 + /// Applies a mask to the ENVI file.
  335 +
  336 + /// @param outfile is the name of the resulting masked output file
  337 + /// @param p is memory of size X*Y containing the mask (0 = false, all other values are true)
312 bool apply_mask(std::string outfile, unsigned char* p) 338 bool apply_mask(std::string outfile, unsigned char* p)
313 { 339 {
314 340
@@ -346,7 +372,15 @@ public: @@ -346,7 +372,15 @@ public:
346 return false; 372 return false;
347 } 373 }
348 374
349 - //peak height to peak height ratio 375 + /// Compute the ratio of two baseline-corrected peaks. The result is stored in a pre-allocated array.
  376 +
  377 + /// @param lb1 is the label value for the left baseline point for the first peak (numerator)
  378 + /// @param rb1 is the label value for the right baseline point for the first peak (numerator)
  379 + /// @param pos1 is the label value for the first peak (numerator) position
  380 + /// @param lb2 is the label value for the left baseline point for the second peak (denominator)
  381 + /// @param rb2 is the label value for the right baseline point for the second peak (denominator)
  382 + /// @param pos2 is the label value for the second peak (denominator) position
  383 + /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size
350 bool ph_to_ph(double lb1, double rb1, double pos1, double lb2, double rb2, double pos2, void * result){ 384 bool ph_to_ph(double lb1, double rb1, double pos1, double lb2, double rb2, double pos2, void * result){
351 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 385 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
352 if(header.data_type ==envi_header::float32) 386 if(header.data_type ==envi_header::float32)
@@ -382,7 +416,15 @@ public: @@ -382,7 +416,15 @@ public:
382 return false; 416 return false;
383 } 417 }
384 418
385 - //peak area to peak height ratio 419 + /// Compute the ratio between a peak area and peak height.
  420 +
  421 + /// @param lb1 is the label value for the left baseline point for the first peak (numerator)
  422 + /// @param rb1 is the label value for the right baseline point for the first peak (numerator)
  423 + /// @param pos1 is the label value for the first peak (numerator) position
  424 + /// @param lb2 is the label value for the left baseline point for the second peak (denominator)
  425 + /// @param rb2 is the label value for the right baseline point for the second peak (denominator)
  426 + /// @param pos2 is the label value for the second peak (denominator) position
  427 + /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size
386 bool pa_to_ph(double lb1, double rb1, double lab1, double rab1, double lb2, double rb2, double pos, void * result){ 428 bool pa_to_ph(double lb1, double rb1, double lab1, double rab1, double lb2, double rb2, double pos, void * result){
387 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 429 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
388 if(header.data_type ==envi_header::float32) 430 if(header.data_type ==envi_header::float32)
@@ -418,7 +460,17 @@ public: @@ -418,7 +460,17 @@ public:
418 return false; 460 return false;
419 } 461 }
420 462
421 - //peak area to peak area ratio 463 + /// Compute the ratio between two peak areas.
  464 +
  465 + /// @param lb1 is the label value for the left baseline point for the first peak (numerator)
  466 + /// @param rb1 is the label value for the right baseline point for the first peak (numerator)
  467 + /// @param lab1 is the label value for the left bound (start of the integration) of the first peak (numerator)
  468 + /// @param rab1 is the label value for the right bound (end of the integration) of the first peak (numerator)
  469 + /// @param lb2 is the label value for the left baseline point for the second peak (denominator)
  470 + /// @param rb2 is the label value for the right baseline point for the second peak (denominator)
  471 + /// @param lab2 is the label value for the left bound (start of the integration) of the second peak (denominator)
  472 + /// @param rab2 is the label value for the right bound (end of the integration) of the second peak (denominator)
  473 + /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size
422 bool pa_to_pa(double lb1, double rb1, double lab1, double rab1, 474 bool pa_to_pa(double lb1, double rb1, double lab1, double rab1,
423 double lb2, double rb2, double lab2, double rab2, void* result){ 475 double lb2, double rb2, double lab2, double rab2, void* result){
424 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 476 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -455,7 +507,13 @@ public: @@ -455,7 +507,13 @@ public:
455 return false; 507 return false;
456 } 508 }
457 509
458 - //center of gravity 510 + /// Compute the centroid of a baseline corrected peak.
  511 +
  512 + /// @param lb is the label value for the left baseline point
  513 + /// @param rb is the label value for the right baseline point
  514 + /// @param lab is the label for the start of the peak
  515 + /// @param rab is the label for the end of the peak
  516 + /// @param result is a pointer to a pre-allocated array at least X * Y * sizeof(T) in size
459 bool cpoint(double lb1, double rb1, double lab1, double rab1, void* result){ 517 bool cpoint(double lb1, double rb1, double lab1, double rab1, void* result){
460 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 518 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
461 if(header.data_type ==envi_header::float32) 519 if(header.data_type ==envi_header::float32)
@@ -491,6 +549,7 @@ public: @@ -491,6 +549,7 @@ public:
491 return false; 549 return false;
492 } 550 }
493 551
  552 + /// Closes the ENVI file.
494 bool close(){ 553 bool close(){
495 if(header.interleave == envi_header::BSQ){ 554 if(header.interleave == envi_header::BSQ){
496 if(header.data_type ==envi_header::float32) 555 if(header.data_type ==envi_header::float32)
@@ -526,7 +585,11 @@ public: @@ -526,7 +585,11 @@ public:
526 } 585 }
527 return false; 586 return false;
528 } 587 }
529 - //get one pixel from binary file 588 +
  589 + /// Retrieve a single pixel and stores it in pre-allocated memory.
  590 +
  591 + /// @param p is a pointer to pre-allocated memory at least sizeof(T) in size.
  592 + /// @param n is an integer index to the pixel using linear array indexing.
530 bool pixel(void * p, unsigned n){ 593 bool pixel(void * p, unsigned n){
531 if(header.interleave == envi_header::BSQ){ 594 if(header.interleave == envi_header::BSQ){
532 if(header.data_type ==envi_header::float32) 595 if(header.data_type ==envi_header::float32)
@@ -561,6 +624,7 @@ public: @@ -561,6 +624,7 @@ public:
561 return false; 624 return false;
562 } 625 }
563 626
  627 + /// Saves a header file describing the current ENVI file parameters.
564 bool save_header(std::string filename){ 628 bool save_header(std::string filename){
565 629
566 //save the header file here 630 //save the header file here
@@ -569,6 +633,10 @@ public: @@ -569,6 +633,10 @@ public:
569 return true; 633 return true;
570 } 634 }
571 635
  636 + /// Retrieve a single band (by numerical label) and stores it in pre-allocated memory.
  637 +
  638 + /// @param p is a pointer to an allocated region of memory at least X * Y * sizeof(T) in size.
  639 + /// @param wavelength is a floating point value (usually a wavelength in spectral data) used as a label for the band to be copied.
572 bool band(void* ptr, double wavelength){ 640 bool band(void* ptr, double wavelength){
573 641
574 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file 642 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
@@ -604,6 +672,10 @@ public: @@ -604,6 +672,10 @@ public:
604 return false; 672 return false;
605 } 673 }
606 674
  675 + /// Retrieve a single band (based on index) and stores it in pre-allocated memory.
  676 +
  677 + /// @param p is a pointer to an allocated region of memory at least X * Y * sizeof(T) in size.
  678 + /// @param page <= B is the integer number of the band to be copied.
607 bool band_index(void* ptr, unsigned int b){ 679 bool band_index(void* ptr, unsigned int b){
608 if (header.interleave == envi_header::BSQ){ //if the infile is bsq file 680 if (header.interleave == envi_header::BSQ){ //if the infile is bsq file
609 if (header.data_type == envi_header::float32) 681 if (header.data_type == envi_header::float32)
@@ -638,7 +710,10 @@ public: @@ -638,7 +710,10 @@ public:
638 return false; 710 return false;
639 } 711 }
640 712
641 - //load mask from maskfile and save it into memory 713 + /// Helper function that loads a mask into memory given a filename.
  714 +
  715 + /// @param mask is a pointer to pre-allocated memory of size X*Y
  716 + /// @param maskname is the file name for the image that will serve as the mask
642 bool load_mask(unsigned char * mask, std::string maskname){ 717 bool load_mask(unsigned char * mask, std::string maskname){
643 //open the mask file 718 //open the mask file
644 stim::image<unsigned char> mask_image(maskname); 719 stim::image<unsigned char> mask_image(maskname);
@@ -693,7 +768,10 @@ public: @@ -693,7 +768,10 @@ public:
693 return true; 768 return true;
694 } 769 }
695 770
696 - //calculate band average 771 + /// Calculate the mean value for all masked (or valid) pixels in a band and returns the average spectrum
  772 +
  773 + /// @param p is a pointer to pre-allocated memory of size [B * sizeof(T)] that stores the mean spectrum
  774 + /// @param mask is a pointer to memory of size [X * Y] that stores the mask value at each pixel location
697 bool avg_band(void * p, unsigned char* mask){ 775 bool avg_band(void * p, unsigned char* mask){
698 if (header.interleave == envi_header::BSQ){ 776 if (header.interleave == envi_header::BSQ){
699 if (header.data_type == envi_header::float32) 777 if (header.data_type == envi_header::float32)
@@ -728,7 +806,11 @@ public: @@ -728,7 +806,11 @@ public:
728 return false; 806 return false;
729 } 807 }
730 808
731 - //calculate correlation coefficient matrix with mask 809 + /// Calculate the covariance matrix for all masked pixels in the image.
  810 +
  811 + /// @param co is a pointer to pre-allocated memory of size [B * B] that stores the resulting covariance matrix
  812 + /// @param avg is a pointer to memory of size B that stores the average spectrum
  813 + /// @param mask is a pointer to memory of size [X * Y] that stores the mask value at each pixel location
732 bool co_matrix(void* co, void* avg, unsigned char* mask){ 814 bool co_matrix(void* co, void* avg, unsigned char* mask){
733 if (header.interleave == envi_header::BSQ){ 815 if (header.interleave == envi_header::BSQ){
734 if (header.data_type == envi_header::float32) 816 if (header.data_type == envi_header::float32)
@@ -764,7 +846,13 @@ public: @@ -764,7 +846,13 @@ public:
764 } 846 }
765 847
766 848
767 - //crop specified area the of the original file 849 + /// Crop a region of the image and save it to a new file.
  850 +
  851 + /// @param outfile is the file name for the new cropped image
  852 + /// @param x0 is the lower-left x pixel coordinate to be included in the cropped image
  853 + /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image
  854 + /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image
  855 + /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image
768 bool crop(std::string outfile,unsigned x0, unsigned y0, unsigned x1, unsigned y1){ 856 bool crop(std::string outfile,unsigned x0, unsigned y0, unsigned x1, unsigned y1){
769 857
770 if (header.interleave == envi_header::BSQ){ 858 if (header.interleave == envi_header::BSQ){