Commit f6169dea23a742c01a4642b185c6e58cbbcf0708

Authored by heziqi
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 }
... ...