Commit e9bddc57f2e79c9c378049499775a4be385b4101

Authored by David Mayerich
1 parent 912d9073

added band cropping for BSQ files

@@ -1005,7 +1005,12 @@ public: @@ -1005,7 +1005,12 @@ public:
1005 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image 1005 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image
1006 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image 1006 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image
1007 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image 1007 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image
1008 - bool crop(std::string outfile, unsigned x0, unsigned y0, unsigned x1, unsigned y1){ 1008 + bool crop(std::string outfile, unsigned long long x0,
  1009 + unsigned long long y0,
  1010 + unsigned long long x1,
  1011 + unsigned long long y1,
  1012 + unsigned long long b0,
  1013 + unsigned long long b1){
1009 1014
1010 //calculate the new number of samples and lines 1015 //calculate the new number of samples and lines
1011 unsigned long long sam = x1 - x0; //samples 1016 unsigned long long sam = x1 - x0; //samples
@@ -1061,7 +1061,12 @@ public: @@ -1061,7 +1061,12 @@ public:
1061 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image 1061 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image
1062 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image 1062 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image
1063 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image 1063 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image
1064 - bool crop(std::string outfile, unsigned x0, unsigned y0, unsigned x1, unsigned y1){ 1064 + bool crop(std::string outfile, unsigned long long x0,
  1065 + unsigned long long y0,
  1066 + unsigned long long x1,
  1067 + unsigned long long y1,
  1068 + unsigned long long b0,
  1069 + unsigned long long b1){
1065 1070
1066 //calculate the new number of samples and lines 1071 //calculate the new number of samples and lines
1067 unsigned long long sam = x1 - x0; //samples 1072 unsigned long long sam = x1 - x0; //samples
@@ -968,27 +968,45 @@ public: @@ -968,27 +968,45 @@ public:
968 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image 968 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image
969 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image 969 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image
970 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image 970 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image
971 - bool crop(std::string outfile, unsigned x0, unsigned y0, unsigned x1, unsigned y1){  
972 -  
973 - //calculate the new number of samples and lines  
974 - unsigned long long sam = x1 - x0; //samples  
975 - unsigned long long lin = y1 - y0; //lines  
976 - unsigned long long L = sam * lin * sizeof(T);  
977 - //get specified band and save 971 + bool crop(std::string outfile, unsigned long long x0,
  972 + unsigned long long y0,
  973 + unsigned long long x1,
  974 + unsigned long long y1,
  975 + unsigned long long b0,
  976 + unsigned long long b1){
  977 +
  978 + //calculate the new number of samples, lines, and bands
  979 + unsigned long long samples = x1 - x0;
  980 + unsigned long long lines = y1 - y0;
  981 + unsigned long long bands = b1 - b0;
  982 +
  983 + //calculate the size of a single band
  984 + unsigned long long L = samples * lines * sizeof(T);
  985 +
  986 + //allocate space for a single band
978 T* temp = (T*)malloc(L); 987 T* temp = (T*)malloc(L);
  988 +
  989 + //create an output stream to store the output file
979 std::ofstream out(outfile.c_str(), std::ios::binary); 990 std::ofstream out(outfile.c_str(), std::ios::binary);
980 - unsigned long long jumpb = X() * (Y() - lin) * sizeof(T); //jump pointer to the next band  
981 - unsigned long long jumpl = (X() - sam) * sizeof(T); //jump pointer to the next line  
982 - //get start  
983 - file.seekg((y0 * X() + x0) * sizeof(T), std::ios::beg);  
984 - for (unsigned z = 0; z < Z(); z++) 991 +
  992 + //calculate the distance required to jump from the end of one band to the beginning of another
  993 + unsigned long long jumpb = X() * (Y() - lines) * sizeof(T);
  994 +
  995 + //calculate the distance required to jump from the end of one line to the beginning of another
  996 + unsigned long long jumpl = (X() - samples) * sizeof(T);
  997 +
  998 + //seek to the start of the cropped region in the input file
  999 + file.seekg( (b0 * X() * Y() + y0 * X() + x0) * sizeof(T), std::ios::beg);
  1000 +
  1001 + //for each band
  1002 + for (unsigned long long z = b0; z < b1; z++)
985 { 1003 {
986 - for (unsigned j = 0; j < lin; j++) 1004 + for (unsigned y = 0; y < lines; y++)
987 { 1005 {
988 - file.read((char *)(temp + j * sam), sizeof(T) * sam); 1006 + file.read((char *)(temp + y * samples), sizeof(T) * samples);
989 file.seekg(jumpl, std::ios::cur); //go to the next band 1007 file.seekg(jumpl, std::ios::cur); //go to the next band
990 1008
991 - thread_data = (double)(z * lin + j) / (Z() * lin) * 100; 1009 + thread_data = (double)(z * lines + y) / (Z() * lines) * 100;
992 } 1010 }
993 out.write(reinterpret_cast<const char*>(temp), L); //write slice data into target file 1011 out.write(reinterpret_cast<const char*>(temp), L); //write slice data into target file
994 file.seekg(jumpb, std::ios::cur); 1012 file.seekg(jumpb, std::ios::cur);
@@ -1022,13 +1022,13 @@ public: @@ -1022,13 +1022,13 @@ public:
1022 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image 1022 /// @param y0 is the lower-left y pixel coordinate to be included in the cropped image
1023 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image 1023 /// @param x1 is the upper-right x pixel coordinate to be included in the cropped image
1024 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image 1024 /// @param y1 is the upper-right y pixel coordinate to be included in the cropped image
1025 - bool crop(std::string outfile,unsigned x0, unsigned y0, unsigned x1, unsigned y1){ 1025 + bool crop(std::string outfile,unsigned x0, unsigned y0, unsigned x1, unsigned y1, unsigned b0, unsigned b1){
1026 1026
1027 if (header.interleave == envi_header::BSQ){ 1027 if (header.interleave == envi_header::BSQ){
1028 if (header.data_type == envi_header::float32) 1028 if (header.data_type == envi_header::float32)
1029 - return ((bsq<float>*)file)->crop(outfile, x0, y0, x1, y1); 1029 + return ((bsq<float>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1030 else if (header.data_type == envi_header::float64) 1030 else if (header.data_type == envi_header::float64)
1031 - return ((bsq<double>*)file)->crop(outfile, x0, y0, x1, y1); 1031 + return ((bsq<double>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1032 else{ 1032 else{
1033 std::cout << "ERROR: unidentified data type" << std::endl; 1033 std::cout << "ERROR: unidentified data type" << std::endl;
1034 exit(1); 1034 exit(1);
@@ -1036,9 +1036,9 @@ public: @@ -1036,9 +1036,9 @@ public:
1036 } 1036 }
1037 else if (header.interleave == envi_header::BIL){ 1037 else if (header.interleave == envi_header::BIL){
1038 if (header.data_type == envi_header::float32) 1038 if (header.data_type == envi_header::float32)
1039 - return ((bil<float>*)file)->crop(outfile, x0, y0, x1, y1); 1039 + return ((bil<float>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1040 else if (header.data_type == envi_header::float64) 1040 else if (header.data_type == envi_header::float64)
1041 - return ((bil<double>*)file)->crop(outfile, x0, y0, x1, y1); 1041 + return ((bil<double>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1042 else{ 1042 else{
1043 std::cout << "ERROR: unidentified data type" << std::endl; 1043 std::cout << "ERROR: unidentified data type" << std::endl;
1044 exit(1); 1044 exit(1);
@@ -1046,9 +1046,9 @@ public: @@ -1046,9 +1046,9 @@ public:
1046 } 1046 }
1047 else if (header.interleave == envi_header::BIP){ 1047 else if (header.interleave == envi_header::BIP){
1048 if (header.data_type == envi_header::float32) 1048 if (header.data_type == envi_header::float32)
1049 - return ((bip<float>*)file)->crop(outfile, x0, y0, x1, y1); 1049 + return ((bip<float>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1050 else if (header.data_type == envi_header::float64) 1050 else if (header.data_type == envi_header::float64)
1051 - return ((bip<double>*)file)->crop(outfile, x0, y0, x1, y1); 1051 + return ((bip<double>*)file)->crop(outfile, x0, y0, x1, y1, b0, b1);
1052 else{ 1052 else{
1053 std::cout << "ERROR: unidentified data type" << std::endl; 1053 std::cout << "ERROR: unidentified data type" << std::endl;
1054 exit(1); 1054 exit(1);
stim/parser/arguments.h
@@ -479,6 +479,14 @@ namespace stim{ @@ -479,6 +479,14 @@ namespace stim{
479 return args.size(); 479 return args.size();
480 } 480 }
481 481
  482 + /// Returns the number of options that are set
  483 + unsigned int nopts(){
  484 + unsigned int n = 0; //initialize the counter for the number of options
  485 + for(unsigned int i = 0; i < opts.size(); i++) //go through each option
  486 + if(opts[i].is_set()) n++; //if a value is specified, increment the counter
  487 + return n;
  488 + }
  489 +
482 ///Returns the name of an argument, given its index 490 ///Returns the name of an argument, given its index
483 491
484 /// @param a is the index of the requested argument 492 /// @param a is the index of the requested argument