Commit f6169dea23a742c01a4642b185c6e58cbbcf0708
1 parent
c25e7d0d
Ziqi completed bil bip bsq
Showing
3 changed files
with
116 additions
and
54 deletions
Show diff stats
envi/bil.h
... | ... | @@ -17,7 +17,6 @@ public: |
17 | 17 | |
18 | 18 | using binary<T>::open; |
19 | 19 | using binary<T>::file; |
20 | - using binary<T>::getSlice; | |
21 | 20 | |
22 | 21 | //open a file, given the file and its header's names |
23 | 22 | bool open(std::string filename, std::string headername){ |
... | ... | @@ -207,7 +206,7 @@ public: |
207 | 206 | |
208 | 207 | double ai, bi; //stores the two baseline points wavelength surrounding the current band |
209 | 208 | double ci; //stores the current band's wavelength |
210 | - unsigned control=0; | |
209 | + unsigned control; | |
211 | 210 | |
212 | 211 | if (a == NULL || b == NULL || c == NULL){ |
213 | 212 | std::cout<<"ERROR: error allocating memory"; |
... | ... | @@ -222,6 +221,7 @@ public: |
222 | 221 | |
223 | 222 | //initialize lownum, highnum, low, high |
224 | 223 | ai = header.wavelength[0]; |
224 | + control=0; | |
225 | 225 | //if no baseline point is specified at band 0, |
226 | 226 | //set the baseline point at band 0 to 0 |
227 | 227 | if(wls[0] != header.wavelength[0]){ |
... | ... | @@ -266,16 +266,6 @@ public: |
266 | 266 | bi = header.wavelength[B - 1]; |
267 | 267 | } |
268 | 268 | } |
269 | - | |
270 | - //get the current YZ line | |
271 | - //band_index(c, cii);??????????????????????????????????? | |
272 | - /* | |
273 | - file.seekg( (k * header.bands * X + cii)* sizeof(T), std::ios::beg); | |
274 | - for(unsigned j = 0; j < X; j++) | |
275 | - { | |
276 | - file.read((char *)(c + j), sizeof(T)); | |
277 | - file.seekg((B - 1) * sizeof(T), std::ios::cur); | |
278 | - }*/ | |
279 | 269 | |
280 | 270 | ci = header.wavelength[cii]; |
281 | 271 | |
... | ... | @@ -288,7 +278,6 @@ public: |
288 | 278 | } |
289 | 279 | |
290 | 280 | }//loop for YZ line end |
291 | - std::cout<<k<<std::endl; | |
292 | 281 | target.write(reinterpret_cast<const char*>(c), L); //write the corrected data into destination |
293 | 282 | }//loop for Y slice end |
294 | 283 | |
... | ... | @@ -302,7 +291,7 @@ public: |
302 | 291 | |
303 | 292 | } |
304 | 293 | |
305 | - // normalize the BIP file | |
294 | + // normalize the BIL file | |
306 | 295 | bool normalize(std::string outname, double band) |
307 | 296 | { |
308 | 297 | unsigned int B = header.bands; //calculate the number of bands |
... | ... | @@ -327,11 +316,11 @@ public: |
327 | 316 | for(unsigned j = 0; j < Y; j++) |
328 | 317 | { |
329 | 318 | getY(c, j); |
330 | - for(unsigned i = 0; i < X; i++) | |
319 | + for(unsigned i = 0; i < B; i++) | |
331 | 320 | { |
332 | - for(unsigned m = 0; m < B; m++) | |
321 | + for(unsigned m = 0; m < X; m++) | |
333 | 322 | { |
334 | - c[m + i * B] = c[m + i * B] / b[i + j * X]; | |
323 | + c[m + i * X] = c[m + i * X] / b[m + j * X]; | |
335 | 324 | } |
336 | 325 | } |
337 | 326 | target.write(reinterpret_cast<const char*>(c), L); //write normalized data into destination |
... | ... | @@ -344,7 +333,7 @@ public: |
344 | 333 | return true; |
345 | 334 | } |
346 | 335 | |
347 | - //convert BIP file to BSQ file and save it | |
336 | + //convert BIL file to BSQ file and save it | |
348 | 337 | bool bsq(std::string outname) |
349 | 338 | { |
350 | 339 | unsigned int S = header.samples * header.lines * sizeof(T); //calculate the number of bytes in a band |
... | ... | @@ -360,6 +349,7 @@ public: |
360 | 349 | band_index(p, i); |
361 | 350 | target.write(reinterpret_cast<const char*>(p), S); //write a band data into target file |
362 | 351 | } |
352 | + | |
363 | 353 | header.interleave = rts::envi::interleaveType::BSQ; //change the type of file in header file |
364 | 354 | header.save(headername); |
365 | 355 | |
... | ... | @@ -368,5 +358,46 @@ public: |
368 | 358 | return true; |
369 | 359 | } |
370 | 360 | |
361 | + //convert bil file to bip file and save it | |
362 | + bool bip(std::string outname) | |
363 | + { | |
364 | + unsigned int S = header.samples * header.bands * sizeof(T); //calculate the number of bytes in a ZX slice | |
365 | + | |
366 | + std::ofstream target(outname.c_str(), std::ios::binary); | |
367 | + std::string headername = outname + ".hdr"; | |
368 | + | |
369 | + T * p; //pointer to the current XZ slice for bil file | |
370 | + p = (T*)malloc(S); | |
371 | + T * q; //pointer to the current ZX slice for bip file | |
372 | + q = (T*)malloc(S); | |
373 | + | |
374 | + for ( unsigned i = 0; i < header.lines; i++) | |
375 | + { | |
376 | + getY(p, i); | |
377 | + for ( unsigned k = 0; k < header.bands; k++) | |
378 | + { | |
379 | + unsigned ks = k * header.samples; | |
380 | + for ( unsigned j = 0; j < header.samples; j++) | |
381 | + q[k + j * header.bands] = p[ks + j]; | |
382 | + } | |
383 | + | |
384 | + target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
385 | + } | |
386 | + | |
387 | + header.interleave = rts::envi::interleaveType::BIP; //change the type of file in header file | |
388 | + header.save(headername); | |
389 | + | |
390 | + free(p); | |
391 | + free(q); | |
392 | + target.close(); | |
393 | + return true; | |
394 | + } | |
395 | + | |
396 | + //close the file | |
397 | + bool close(){ | |
398 | + file.close(); | |
399 | + return true; | |
400 | + } | |
401 | + | |
371 | 402 | }; |
372 | 403 | } |
373 | 404 | \ No newline at end of file | ... | ... |
envi/bip.h
... | ... | @@ -17,7 +17,6 @@ public: |
17 | 17 | |
18 | 18 | using binary<T>::open; |
19 | 19 | using binary<T>::file; |
20 | - using binary<T>::getSlice; | |
21 | 20 | |
22 | 21 | //open a file, given the file and its header's names |
23 | 22 | bool open(std::string filename, std::string headername){ |
... | ... | @@ -231,14 +230,10 @@ public: |
231 | 230 | file.seekg((header.bands - 1) * sizeof(T), std::ios::cur); |
232 | 231 | } |
233 | 232 | } |
234 | - | |
235 | - //free(p1); | |
236 | - //free(p2); | |
237 | 233 | return true; |
238 | 234 | } |
239 | 235 | |
240 | 236 | //save one pixel of the BIP file into the memory, and return the pointer |
241 | - //I have not used it so far | |
242 | 237 | bool getSpectrum(T * p, unsigned x, unsigned y){ |
243 | 238 | |
244 | 239 | if ( x >= header.samples || y >= header.lines){ //make sure the sample and line number is right |
... | ... | @@ -294,7 +289,7 @@ public: |
294 | 289 | |
295 | 290 | double ai, bi; //stores the two baseline points wavelength surrounding the current band |
296 | 291 | double ci; //stores the current band's wavelength |
297 | - unsigned control=0; | |
292 | + unsigned control; | |
298 | 293 | |
299 | 294 | if (a == NULL || b == NULL || c == NULL){ |
300 | 295 | std::cout<<"ERROR: error allocating memory"; |
... | ... | @@ -308,6 +303,7 @@ public: |
308 | 303 | getY(c, k); |
309 | 304 | |
310 | 305 | //initialize lownum, highnum, low, high |
306 | + control=0; | |
311 | 307 | ai = header.wavelength[0]; |
312 | 308 | //if no baseline point is specified at band 0, |
313 | 309 | //set the baseline point at band 0 to 0 |
... | ... | @@ -327,7 +323,6 @@ public: |
327 | 323 | //correct every YZ line |
328 | 324 | |
329 | 325 | for(unsigned cii = 0; cii < B; cii++){ |
330 | - | |
331 | 326 | //update baseline points, if necessary |
332 | 327 | if( header.wavelength[cii] >= bi && cii != B - 1) { |
333 | 328 | //if the high band is now on the last BL point? |
... | ... | @@ -402,11 +397,13 @@ public: |
402 | 397 | for(unsigned j = 0; j < Y; j++) |
403 | 398 | { |
404 | 399 | getY(c, j); |
400 | + unsigned jX = j * X; //to avoid calculating it many times | |
405 | 401 | for(unsigned i = 0; i < X; i++) |
406 | 402 | { |
403 | + unsigned iB = i * B; | |
407 | 404 | for(unsigned m = 0; m < B; m++) |
408 | 405 | { |
409 | - c[m + i * B] = c[m + i * B] / b[i + j * X]; | |
406 | + c[m + iB] = c[m + iB] / b[i + jX]; //perform normalization | |
410 | 407 | } |
411 | 408 | } |
412 | 409 | target.write(reinterpret_cast<const char*>(c), L); //write normalized data into destination |
... | ... | @@ -421,27 +418,64 @@ public: |
421 | 418 | |
422 | 419 | //convert BIP file to BSQ file and save it |
423 | 420 | bool bsq(std::string outname) |
421 | + { | |
422 | + std::string temp = outname + "_temp"; | |
423 | + std::string headtemp = temp + ".hdr"; | |
424 | + //first creat a temporary bil file and convert bip file to bil file | |
425 | + bil(temp); | |
426 | + | |
427 | + rts::bil<T> n; | |
428 | + if(n.open(temp, headtemp)==false){ //open infile | |
429 | + std::cout<<"ERROR: unable to open input file"<<std::endl; | |
430 | + exit(1); | |
431 | + } | |
432 | + //then convert bil file to bsq file | |
433 | + n.bsq(outname); | |
434 | + n.close(); | |
435 | + remove(temp.c_str()); | |
436 | + remove(headtemp.c_str()); | |
437 | + return true; | |
438 | + } | |
439 | + | |
440 | + //convert bip file to bil file and save it | |
441 | + bool bil(std::string outname) | |
424 | 442 | { |
425 | - unsigned int S = header.samples * header.lines * sizeof(T); //calculate the number of bytes in a band | |
443 | + unsigned int S = header.samples * header.bands * sizeof(T); //calculate the number of bytes in a ZX slice | |
426 | 444 | |
427 | 445 | std::ofstream target(outname.c_str(), std::ios::binary); |
428 | 446 | std::string headername = outname + ".hdr"; |
429 | 447 | |
430 | - T * p; //pointer to the current band | |
448 | + T * p; //pointer to the current ZX slice for bip file | |
431 | 449 | p = (T*)malloc(S); |
450 | + T * q; //pointer to the current XZ slice for bil file | |
451 | + q = (T*)malloc(S); | |
432 | 452 | |
433 | - for ( unsigned i = 0; i < header.bands; i++) | |
453 | + for ( unsigned i = 0; i < header.lines; i++) | |
434 | 454 | { |
435 | - band_index(p, i); | |
436 | - target.write(reinterpret_cast<const char*>(p), S); //write a band data into target file | |
455 | + getY(p, i); | |
456 | + for ( unsigned k = 0; k < header.bands; k++) | |
457 | + { | |
458 | + unsigned ks = k * header.samples; | |
459 | + for ( unsigned j = 0; j < header.samples; j++) | |
460 | + q[ks + j] = p[k + j * header.bands]; | |
461 | + } | |
462 | + target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file | |
437 | 463 | } |
438 | - header.interleave = rts::envi::interleaveType::BSQ; //change the type of file in header file | |
464 | + | |
465 | + header.interleave = rts::envi::interleaveType::BIL; //change the type of file in header file | |
439 | 466 | header.save(headername); |
440 | 467 | |
441 | 468 | free(p); |
469 | + free(q); | |
442 | 470 | target.close(); |
443 | 471 | return true; |
444 | 472 | } |
445 | 473 | |
474 | + //close the file | |
475 | + bool close(){ | |
476 | + file.close(); | |
477 | + return true; | |
478 | + } | |
479 | + | |
446 | 480 | }; |
447 | 481 | } |
448 | 482 | \ No newline at end of file | ... | ... |
envi/bsq.h
... | ... | @@ -85,8 +85,6 @@ public: |
85 | 85 | getSlice(p, 2, page); |
86 | 86 | } |
87 | 87 | |
88 | - free(p1); | |
89 | - free(p2); | |
90 | 88 | return true; |
91 | 89 | } |
92 | 90 | |
... | ... | @@ -252,27 +250,21 @@ public: |
252 | 250 | //convert BSQ file to BIP file and save it |
253 | 251 | bool bip(std::string outname) |
254 | 252 | { |
255 | - unsigned int L = header.bands * sizeof(T); //calculate the number of bytes in a spectrum | |
256 | - | |
257 | - std::ofstream target(outname.c_str(), std::ios::binary); | |
258 | - std::string headername = outname + ".hdr"; | |
259 | - | |
260 | - T * p; //pointer to the current spectrum | |
261 | - p = (T*)malloc(L); | |
262 | - | |
263 | - for ( unsigned i = 0; i < header.lines; i++) | |
264 | - { | |
265 | - for ( unsigned j = 0; j < header.samples; j++ ) | |
266 | - { | |
267 | - getSpectrum(p, j, i); | |
268 | - target.write(reinterpret_cast<const char*>(p), L); //write spectrum data into target file | |
269 | - } | |
253 | + std::string temp = outname + "_temp"; | |
254 | + std::string headtemp = temp + ".hdr"; | |
255 | + //first creat a temporary bil file and convert bsq file to bil file | |
256 | + bil(temp); | |
257 | + | |
258 | + rts::bil<T> n; | |
259 | + if(n.open(temp, headtemp)==false){ //open infile | |
260 | + std::cout<<"ERROR: unable to open input file"<<std::endl; | |
261 | + exit(1); | |
270 | 262 | } |
271 | - header.interleave = rts::envi::interleaveType::BIP; //change the type of file in header file | |
272 | - header.save(headername); | |
273 | - | |
274 | - free(p); | |
275 | - target.close(); | |
263 | + //then convert bil file to bip file | |
264 | + n.bip(outname); | |
265 | + n.close(); | |
266 | + remove(temp.c_str()); | |
267 | + remove(headtemp.c_str()); | |
276 | 268 | return true; |
277 | 269 | } |
278 | 270 | |
... | ... | @@ -307,6 +299,11 @@ public: |
307 | 299 | return true; |
308 | 300 | } |
309 | 301 | |
302 | + //close the file | |
303 | + bool close(){ | |
304 | + file.close(); | |
305 | + return true; | |
306 | + } | |
310 | 307 | |
311 | 308 | }; |
312 | 309 | } | ... | ... |