Commit 740f8cd2eaa4f6c9204ecb35047c0b65105d1440

Authored by heziqi
1 parent f4c5d71b

added apply_mask

Showing 4 changed files with 123 additions and 0 deletions   Show diff stats
envi/bil.h
... ... @@ -685,6 +685,36 @@ public:
685 685 return true;
686 686 }
687 687  
  688 + //apply mask
  689 + bool apply_mask(std::string outfile, unsigned char* p){
  690 +
  691 + std::ofstream target(outfile.c_str(), std::ios::binary);
  692 +
  693 + unsigned XZ = R[0] * R[2]; //calculate number of a band
  694 + unsigned L = XZ * sizeof(T);
  695 +
  696 + T * temp = (T*)malloc(L);
  697 +
  698 + for (unsigned i = 0; i < R[1]; i++)
  699 + {
  700 + getY(temp, i);
  701 + for ( unsigned j = 0; j < R[2]; j++)
  702 + {
  703 + for (unsigned k = 0; k < R[0]; k++)
  704 + {
  705 + if(p[i * R[0] + k] == 0)
  706 + temp[j * R[0] + k] = 0;
  707 + else
  708 + continue;
  709 + }
  710 + }
  711 + target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file
  712 + }
  713 + target.close();
  714 + free(temp);
  715 + return true;
  716 + }
  717 +
688 718 //close the file
689 719 bool close(){
690 720 file.close();
... ...
envi/bip.h
... ... @@ -777,6 +777,36 @@ public:
777 777  
778 778 }
779 779  
  780 + //apply mask
  781 + bool apply_mask(std::string outfile, unsigned char* p){
  782 +
  783 + std::ofstream target(outfile.c_str(), std::ios::binary);
  784 +
  785 + unsigned ZX = R[2] * R[0]; //calculate number of a band
  786 + unsigned L = ZX * sizeof(T);
  787 +
  788 + T * temp = (T*)malloc(L);
  789 +
  790 + for (unsigned i = 0; i < R[1]; i++)
  791 + {
  792 + getY(temp, i);
  793 + for ( unsigned j = 0; j < R[0]; j++)
  794 + {
  795 + for (unsigned k = 0; k < R[2]; k++)
  796 + {
  797 + if(p[i * R[0] + k] == 0)
  798 + temp[j * R[2] + k] = 0;
  799 + else
  800 + continue;
  801 + }
  802 + }
  803 + target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file
  804 + }
  805 + target.close();
  806 + free(temp);
  807 + return true;
  808 + }
  809 +
780 810 //close the file
781 811 bool close(){
782 812 file.close();
... ...
envi/bsq.h
... ... @@ -612,6 +612,37 @@ public:
612 612 return true;
613 613  
614 614 }
  615 +
  616 + //apply mask
  617 + bool apply_mask(std::string outfile, unsigned char* p){
  618 +
  619 + std::ofstream target(outfile.c_str(), std::ios::binary);
  620 +
  621 + unsigned XY = R[0] * R[1]; //calculate number of a band
  622 + unsigned L = XY * sizeof(T);
  623 +
  624 + T * temp = (T*)malloc(L);
  625 +
  626 + for (unsigned i = 0; i < R[2]; i++)
  627 + {
  628 + band_index(temp, i);
  629 + for ( unsigned j = 0; j < XY; j++)
  630 + {
  631 + if(p[j] == 0){
  632 + temp[j] = 0;
  633 + }
  634 + else{
  635 + continue;
  636 + }
  637 + }
  638 + target.write(reinterpret_cast<const char*>(temp), L); //write a band data into target file
  639 + }
  640 + target.close();
  641 + free(temp);
  642 + return true;
  643 + }
  644 +
  645 +
615 646 //close the file
616 647 bool close(){
617 648 file.close();
... ...
envi/envi.h
... ... @@ -302,6 +302,38 @@ public:
302 302 else
303 303 std::cout<<"ERROR: unidentified data type"<<std::endl;
304 304 }
  305 + }
  306 +
  307 + //apply mask
  308 + bool apply_mask(std::string outfile, unsigned char* p)
  309 + {
  310 +
  311 + if(header.interleave == envi_header::BSQ){ //if the infile is bsq file
  312 + if(header.data_type ==envi_header::float32)
  313 + return ((bsq<float>*)file)->apply_mask(outfile, p);
  314 + else if(header.data_type == envi_header::float64)
  315 + return ((bsq<double>*)file)->apply_mask(outfile, p);
  316 + else
  317 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  318 + }
  319 +
  320 + else if(header.interleave == envi_header::BIL){ //if the infile is bil file
  321 + if(header.data_type ==envi_header::float32)
  322 + return ((bil<float>*)file)->apply_mask(outfile, p);
  323 + else if(header.data_type == envi_header::float64)
  324 + return ((bil<double>*)file)->apply_mask(outfile, p);
  325 + else
  326 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  327 + }
  328 +
  329 + else if(header.interleave == envi_header::BIP){ //if the infile is bip file
  330 + if(header.data_type ==envi_header::float32)
  331 + return ((bip<float>*)file)->apply_mask(outfile, p);
  332 + else if(header.data_type == envi_header::float64)
  333 + return ((bip<double>*)file)->apply_mask(outfile, p);
  334 + else
  335 + std::cout<<"ERROR: unidentified data type"<<std::endl;
  336 + }
305 337  
306 338 else{
307 339 std::cout<<"ERROR: unidentified file type"<<std::endl;
... ...