Commit c30dd3e6d042a18dccdcc2538354c83a7b0205ba

Authored by David Mayerich
1 parent 9d77bbd9

added vector normalization to stim::envi

stim/envi/bil.h
... ... @@ -353,7 +353,7 @@ public:
353 353 /// @param outname is the name of the output file used to store the resulting baseline-corrected data.
354 354 /// @param w is the label specifying the band that the hyperspectral image will be normalized to.
355 355 /// @param t is a threshold specified such that a spectrum with a value at w less than t is set to zero. Setting this threshold allows the user to limit division by extremely small numbers.
356   - bool normalize(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
  356 + bool ratio(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
357 357 {
358 358 unsigned long long B = Z(); //calculate the number of bands
359 359 unsigned long long ZX = Z() * X();
... ... @@ -395,6 +395,8 @@ public:
395 395 target.close();
396 396 return true;
397 397 }
  398 +
  399 + void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){}
398 400  
399 401 /// Convert the current BIL file to a BSQ file with the specified file name.
400 402  
... ...
stim/envi/bip.h
... ... @@ -320,7 +320,7 @@ public:
320 320 /// @param outname is the name of the output file used to store the resulting baseline-corrected data.
321 321 /// @param w is the label specifying the band that the hyperspectral image will be normalized to.
322 322 /// @param t is a threshold specified such that a spectrum with a value at w less than t is set to zero. Setting this threshold allows the user to limit division by extremely small numbers.
323   - bool normalize(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
  323 + bool ratio(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
324 324 {
325 325 std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file
326 326 std::string headername = outname + ".hdr"; //the header file name
... ... @@ -349,6 +349,8 @@ public:
349 349 target.close();
350 350 return true;
351 351 }
  352 +
  353 + void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){}
352 354  
353 355  
354 356 /// Convert the current BIP file to a BIL file with the specified file name.
... ...
stim/envi/bsq.h
... ... @@ -286,7 +286,7 @@ public:
286 286 /// @param outname is the name of the output file used to store the resulting baseline-corrected data.
287 287 /// @param w is the label specifying the band that the hyperspectral image will be normalized to.
288 288 /// @param t is a threshold specified such that a spectrum with a value at w less than t is set to zero. Setting this threshold allows the user to limit division by extremely small numbers.
289   - bool normalize(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
  289 + bool ratio(std::string outname, double w, unsigned char* mask = NULL, bool PROGRESS = false)
290 290 {
291 291 unsigned long long B = Z(); //calculate the number of bands
292 292 unsigned long long XY = X() * Y(); //calculate the number of pixels in a band
... ... @@ -328,6 +328,47 @@ public:
328 328 return true;
329 329 }
330 330  
  331 + void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){
  332 + size_t B = Z(); //calculate the number of bands
  333 + size_t XY = X() * Y(); //calculate the number of pixels in a band
  334 + size_t XYb = XY * sizeof(T); //calculate the size of a band in bytes
  335 +
  336 + std::ofstream out(outfile.c_str(), std::ios::binary); //open the output file
  337 + file.seekg(0, std::ios::beg); //move the pointer to the current file to the beginning
  338 +
  339 + T* len = (T*)malloc(XYb); //allocate space to store the vector length
  340 + memset(len, 0, XYb); //initialize the vector length to zero (0)
  341 +
  342 + T* band = (T*) malloc(XYb); //allocate space to store a band image
  343 +
  344 + for(size_t b = 0; b < B; b++){
  345 + file.read((char*)band, XYb);
  346 + for(size_t xy = 0; xy < XY; xy++){
  347 + if(mask == NULL || mask[xy]){
  348 + len[xy] += pow(band[xy], 2); //sum the squared value for each pixel value in the band
  349 + }
  350 + }
  351 + if(PROGRESS) progress = (double) (b+1) / (double)B * 50;
  352 + }
  353 + for(size_t xy = 0; xy < XY; xy++){ //for each pixel, calculate the square root
  354 + if(mask == NULL || mask[xy]){
  355 + len[xy] += pow(band[xy], 2); //sum the squared value for each pixel value in the band
  356 + }
  357 + }
  358 + file.seekg(0, std::ios::beg); //move the pointer to the current file to the beginning
  359 + for(size_t b = 0; b < B; b++){
  360 + file.read((char*)band, XYb);
  361 + for(size_t xy = 0; xy < XY; xy++){
  362 + if(mask == NULL || mask[xy]){
  363 + band[xy] /= len[xy]; //divide the band by the vector length
  364 + }
  365 + }
  366 + out.write((char*)band, XYb);
  367 + if(PROGRESS) progress = (double) (b+1) / (double)B * 50 + 50;
  368 + }
  369 +
  370 + }
  371 +
331 372 /// Convert the current BSQ file to a BIL file with the specified file name.
332 373  
333 374 /// @param outname is the name of the output BIL file to be saved to disk.
... ...
stim/envi/envi.h
... ... @@ -214,31 +214,31 @@ public:
214 214 /// @param outfile is the name of the normalized file to be output
215 215 /// @param band is the band label to be output
216 216 /// @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)
217   - bool normalize(std::string outfile, double band, unsigned char* mask = NULL, bool PROGRESS = false){
  217 + bool ratio(std::string outfile, double band, unsigned char* mask = NULL, bool PROGRESS = false){
218 218 header.save(outfile + ".hdr");
219 219 if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
220 220 if(header.data_type ==envi_header::float32)
221   - return ((bsq<float>*)file)->normalize(outfile, band, mask, PROGRESS);
  221 + return ((bsq<float>*)file)->ratio(outfile, band, mask, PROGRESS);
222 222 else if(header.data_type == envi_header::float64)
223   - return ((bsq<double>*)file)->normalize(outfile,band, mask, PROGRESS);
  223 + return ((bsq<double>*)file)->ratio(outfile,band, mask, PROGRESS);
224 224 else
225 225 std::cout<<"ERROR: unidentified data type"<<std::endl;
226 226 }
227 227  
228 228 else if(header.interleave == envi_header::BIL){ //if the infile is bil file
229 229 if(header.data_type ==envi_header::float32)
230   - return ((bil<float>*)file)->normalize(outfile, band, mask, PROGRESS);
  230 + return ((bil<float>*)file)->ratio(outfile, band, mask, PROGRESS);
231 231 else if(header.data_type == envi_header::float64)
232   - return ((bil<double>*)file)->normalize(outfile,band, mask, PROGRESS);
  232 + return ((bil<double>*)file)->ratio(outfile,band, mask, PROGRESS);
233 233 else
234 234 std::cout<<"ERROR: unidentified data type"<<std::endl;
235 235 }
236 236  
237 237 else if(header.interleave == envi_header::BIP){ //if the infile is bip file
238 238 if(header.data_type ==envi_header::float32)
239   - return ((bip<float>*)file)->normalize(outfile, band, mask, PROGRESS);
  239 + return ((bip<float>*)file)->ratio(outfile, band, mask, PROGRESS);
240 240 else if(header.data_type == envi_header::float64)
241   - return ((bip<double>*)file)->normalize(outfile,band, mask, PROGRESS);
  241 + return ((bip<double>*)file)->ratio(outfile,band, mask, PROGRESS);
242 242 else
243 243 std::cout<<"ERROR: unidentified data type"<<std::endl;
244 244 }
... ... @@ -250,6 +250,42 @@ public:
250 250 return false;
251 251 }
252 252  
  253 + /// Perform vector normalization on the ENVI image
  254 + void normalize(std::string outfile, unsigned char* mask = NULL, bool PROGRESS = false){
  255 + header.save(outfile + ".hdr");
  256 + if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
  257 + if(header.data_type ==envi_header::float32)
  258 + ((bsq<float>*)file)->normalize(outfile, mask, PROGRESS);
  259 + else if(header.data_type == envi_header::float64)
  260 + ((bsq<double>*)file)->normalize(outfile, mask, PROGRESS);
  261 + else
  262 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  263 + }
  264 +
  265 + else if(header.interleave == envi_header::BIL){ //if the infile is bil file
  266 + if(header.data_type ==envi_header::float32)
  267 + ((bil<float>*)file)->normalize(outfile, mask, PROGRESS);
  268 + else if(header.data_type == envi_header::float64)
  269 + ((bil<double>*)file)->normalize(outfile, mask, PROGRESS);
  270 + else
  271 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  272 + }
  273 +
  274 + else if(header.interleave == envi_header::BIP){ //if the infile is bip file
  275 + if(header.data_type ==envi_header::float32)
  276 + ((bip<float>*)file)->normalize(outfile, mask, PROGRESS);
  277 + else if(header.data_type == envi_header::float64)
  278 + ((bip<double>*)file)->normalize(outfile, mask, PROGRESS);
  279 + else
  280 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  281 + }
  282 +
  283 + else{
  284 + std::cout<<"ERROR: unidentified file type"<<std::endl;
  285 + exit(1);
  286 + }
  287 + }
  288 +
253 289 /// Performs piecewise linear baseline correction of a hyperspectral file/
254 290  
255 291 /// @param outfile is the file name for the baseline corrected output
... ...
stim/visualization/colormap.h
... ... @@ -313,10 +313,6 @@ static void cpu2cpu(T* cpuSource, unsigned char* cpuDest, unsigned long long nVa
313 313 minVal = cpuSource[i];
314 314 }
315 315  
316   - //if(positive)
317   - // cpu2cpu(cpuSource, cpuDest, nVals, (T)0, maxVal, cm);
318   - //else
319   - // cpu2cpu(cpuSource, cpuDest, nVals, -maxVal, maxVal, cm);
320 316 cpu2cpu(cpuSource, cpuDest, nVals, minVal, maxVal, cm);
321 317  
322 318 }
... ...