Commit c30dd3e6d042a18dccdcc2538354c83a7b0205ba
1 parent
9d77bbd9
added vector normalization to stim::envi
Showing
5 changed files
with
91 additions
and
14 deletions
Show diff stats
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 | } | ... | ... |