Blame view

envi/envi.h 12.3 KB
e8eb202f   David Mayerich   added a new ENVI ...
1
2
3
4
5
6
7
8
9
10
11
  #ifndef STIM_ENVI_H
  #define STIM_ENVI_H
  
  #include "../envi/envi_header.h"
  #include "../envi/bsq.h"
  #include "../envi/bip.h"
  #include "../envi/bil.h"
  
  namespace rts{
  
  //container class for an ENVI binary file reader
4a6f666c   heziqi   Added mask method
12
  class envi{	
e8eb202f   David Mayerich   added a new ENVI ...
13
14
15
16
17
  
  	void* file;		//void pointer to the relevant file reader (bip, bsq, or bil - with appropriate data type)
  
  public:
  
4a6f666c   heziqi   Added mask method
18
19
  	envi_header header;
  
e8eb202f   David Mayerich   added a new ENVI ...
20
21
22
23
  	bool allocate(){
  
  		file = NULL;	//set file to a NULL pointer
  
6708cc25   heziqi   Ziqi added envi c...
24
  		if(header.interleave == envi_header::BSQ){
e8eb202f   David Mayerich   added a new ENVI ...
25
26
  			if(header.data_type ==envi_header::float32)
  				return(file = new bsq<float>());
6708cc25   heziqi   Ziqi added envi c...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  			else if(header.data_type == envi_header::float64)
  				return(file = new bsq<double>());
  		}
  		else if(header.interleave == envi_header::BIP){
  			if(header.data_type ==envi_header::float32)
  				return(file = new bip<float>());
  			else if(header.data_type == envi_header::float64)
  				return(file = new bip<double>());
  		}
  		else if(header.interleave == envi_header::BIL){
  			if(header.data_type ==envi_header::float32)
  				return(file = new bil<float>());
  			else if(header.data_type == envi_header::float64)
  				return(file = new bil<double>());
  		}
e8eb202f   David Mayerich   added a new ENVI ...
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  
  		exit(1);	//if the function hasn't already returned, we don't handle this state
  
  	}
  
  	bool open(std::string filename, std::string headername){
  
  		//allocate memory
  		allocate();
  
  		//load the header
  		header.load(headername);
  
  		//load the file
6708cc25   heziqi   Ziqi added envi c...
56
57
  		if(header.interleave == envi_header::BSQ) {		//if the infile is bsq file
  			if(header.data_type == envi_header::float32) {
e8eb202f   David Mayerich   added a new ENVI ...
58
  				return ((bsq<float>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
6708cc25   heziqi   Ziqi added envi c...
59
60
61
62
63
64
65
  			}
  			else if(header.data_type == envi_header::float64) {
  				return ((bsq<double>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
  			}
  			else
  				return false;
  		}
e8eb202f   David Mayerich   added a new ENVI ...
66
  
6708cc25   heziqi   Ziqi added envi c...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  		else if(header.interleave == envi_header::BIL) {		//if the infile is bil file
  			if(header.data_type == envi_header::float32) {
  				return ((bil<float>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
  			}
  			else if(header.data_type == envi_header::float64) {
  				return ((bil<double>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
  			}
  			else
  				return false;
  		}
  				
  		else if(header.interleave == envi_header::BIP) {		//if the infile is bip file
  			if(header.data_type == envi_header::float32) {
  				return ((bip<float>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
  			}
  			else if(header.data_type == envi_header::float64) {
  				return ((bip<double>*)file)->open(filename, header.samples, header.lines, header.bands, header.header_offset, header.wavelength);
  			}
  			else
  				return false;		
  		}
  		
  		else{
  		std::cout<<"ERROR: unidentified type file       "<<headername<<std::cout;
e8eb202f   David Mayerich   added a new ENVI ...
91
  		exit(1);
6708cc25   heziqi   Ziqi added envi c...
92
93
  		}
  
e8eb202f   David Mayerich   added a new ENVI ...
94
95
  	}
  
6708cc25   heziqi   Ziqi added envi c...
96
  	//perform normalization
e8eb202f   David Mayerich   added a new ENVI ...
97
  	bool normalize(std::string outfile, double band){
6708cc25   heziqi   Ziqi added envi c...
98
99
  	
  		if(header.interleave == envi_header::BSQ){		//if the infile is bsq file
e8eb202f   David Mayerich   added a new ENVI ...
100
101
  			if(header.data_type ==envi_header::float32)
  				return ((bsq<float>*)file)->normalize(outfile, band);
6708cc25   heziqi   Ziqi added envi c...
102
103
104
105
106
  			else if(header.data_type == envi_header::float64)
  				return ((bsq<double>*)file)->normalize(outfile,band);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
e8eb202f   David Mayerich   added a new ENVI ...
107
  
6708cc25   heziqi   Ziqi added envi c...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  		else if(header.interleave == envi_header::BIL){		//if the infile is bil file
  			if(header.data_type ==envi_header::float32)
  				return ((bil<float>*)file)->normalize(outfile, band);
  			else if(header.data_type == envi_header::float64)
  				return ((bil<double>*)file)->normalize(outfile,band);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else if(header.interleave == envi_header::BIP){		//if the infile is bip file
  			if(header.data_type ==envi_header::float32)
  				return ((bip<float>*)file)->normalize(outfile, band);
  			else if(header.data_type == envi_header::float64)
  				return ((bip<double>*)file)->normalize(outfile,band);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else{
  			std::cout<<"ERROR: unidentified file type"<<std::endl;
  			exit(1);
  		}
e933c14e   David Mayerich   cleaned up the code
130
  		return false;
6708cc25   heziqi   Ziqi added envi c...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  	}
  
  	//perform baseline correction
  	bool baseline(std::string outfile, std::vector<double> w){
  
  		if(header.interleave == envi_header::BSQ){		//if the infile is bsq file
  			if(header.data_type ==envi_header::float32)
  				return ((bsq<float>*)file)->baseline(outfile, w);
  			else if(header.data_type == envi_header::float64)
  				return ((bsq<double>*)file)->baseline(outfile,w);
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
  
  		else if(header.interleave == envi_header::BIL){		//if the infile is bil file
  			if(header.data_type ==envi_header::float32)
  				return ((bil<float>*)file)->baseline(outfile, w);
  			else if(header.data_type == envi_header::float64)
  				return ((bil<double>*)file)->baseline(outfile, w);
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
  
  		else if(header.interleave == envi_header::BIP){		//if the infile is bip file 
  			if(header.data_type ==envi_header::float32)
  				return ((bip<float>*)file)->baseline(outfile, w);
  			else if(header.data_type == envi_header::float64)
  				return ((bip<double>*)file)->baseline(outfile, w);
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
  
  		else{
  			std::cout<<"ERROR: unidentified file type"<<std::endl;
  			exit(1);
  		}
  	}
  
  	//perform conversion
  	bool convert(std::string outfile, rts::envi_header::interleaveType interleave){
  
  		if(header.interleave == envi_header::BSQ){			//if the infile is bsq file
  
  			if(header.data_type ==envi_header::float32){		//if the data type of infile is float
  				if(interleave == envi_header::BSQ){
  					std::cout<<"ERROR:  is already BSQ file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BIL)			//if the target file is bil file
  					return ((bsq<float>*)file)->bil(outfile);
  				else if(interleave == envi_header::BIP)			//if the target file is bip file
  					return ((bsq<float>*)file)->bip(outfile);
  			}
  
  			else if(header.data_type == envi_header::float64){		//if the data type is float
  				if(interleave == envi_header::BSQ){
  					std::cout<<"ERROR:  is already BSQ file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BIL)
  					return ((bsq<double>*)file)->bil(outfile);
  				else if(interleave == envi_header::BIP)
  					return ((bsq<double>*)file)->bip(outfile);
  			}
  			
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);				
  			}
  		}
  
  		else if(header.interleave == envi_header::BIL){
  
  			if(header.data_type ==envi_header::float32){		//if the data type of infile is float
  				if(interleave == envi_header::BIL){
  					std::cout<<"ERROR:  is already BIL file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BSQ)			//if the target file is bsq file
  					return ((bil<float>*)file)->bsq(outfile);
  				else if(interleave == envi_header::BIP)			//if the target file is bip file
  					return ((bil<float>*)file)->bip(outfile);
  			}
  
  			else if(header.data_type == envi_header::float64){		//if the data type is float
  				if(interleave == envi_header::BIL){
  					std::cout<<"ERROR:  is already BIL file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BSQ)
  					return ((bil<double>*)file)->bsq(outfile);
  				else if(interleave == envi_header::BIP)
  					return ((bil<double>*)file)->bip(outfile);
  			}
  			
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);				
  			}
  		}
  
  		else if(header.interleave == envi_header::BIP){
  		
  			if(header.data_type ==envi_header::float32){		//if the data type of infile is float
  				if(interleave == envi_header::BIP){
  					std::cout<<"ERROR:  is already BIP file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BIL)			//if the target file is bil file
  					return ((bip<float>*)file)->bil(outfile);
  				else if(interleave == envi_header::BSQ)			//if the target file is bsq file
  					return ((bip<float>*)file)->bsq(outfile);
  			}
  
  			else if(header.data_type == envi_header::float64){		//if the data type is float
  				if(interleave == envi_header::BIP){
  					std::cout<<"ERROR:  is already BIP file"<<std::endl;
  					exit(1);
  				}
  				else if(interleave == envi_header::BIL)			//if the target file is bil file
  					return ((bip<double>*)file)->bil(outfile);
  				else if(interleave == envi_header::BSQ)			//if the target file is bsq file
  					return ((bip<double>*)file)->bsq(outfile);
  			}
  			
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);				
  			}
  		}
  		
  		else{
  			std::cout<<"ERROR: unidentified interleave type"<<std::endl;
  			exit(1);
  		}
e933c14e   David Mayerich   cleaned up the code
272
  		return false;
6708cc25   heziqi   Ziqi added envi c...
273
274
275
  	
  	}
  
cacc3cdc   heziqi   attempt to fix CImg
276
  	//get the mask
4a6f666c   heziqi   Added mask method
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  	bool mask(unsigned char* p, double mask_band, double threshold)	{
  
  		if(header.interleave == envi_header::BSQ){		//if the infile is bsq file
  			if(header.data_type ==envi_header::float32)
  				return ((bsq<float>*)file)->mask(p, mask_band, threshold);
  			else if(header.data_type == envi_header::float64)
  				return ((bsq<double>*)file)->mask(p, mask_band, threshold);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else if(header.interleave == envi_header::BIL){		//if the infile is bil file
  			if(header.data_type ==envi_header::float32)
  				return ((bil<float>*)file)->mask(p, mask_band, threshold);
  			else if(header.data_type == envi_header::float64)
  				return ((bil<double>*)file)->mask(p, mask_band, threshold);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
cacc3cdc   heziqi   attempt to fix CImg
296
  
4a6f666c   heziqi   Added mask method
297
298
299
300
301
302
303
304
305
306
307
308
309
310
  		else if(header.interleave == envi_header::BIP){		//if the infile is bip file
  			if(header.data_type ==envi_header::float32)
  				return ((bip<float>*)file)->mask(p, mask_band, threshold);
  			else if(header.data_type == envi_header::float64)
  				return ((bip<double>*)file)->mask(p, mask_band, threshold);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else{
  			std::cout<<"ERROR: unidentified file type"<<std::endl;
  			exit(1);
  		}
  		return false;
cacc3cdc   heziqi   attempt to fix CImg
311
312
  	}
  
20c212c0   heziqi   Ziqi added functi...
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
  	//do baseline correction and caculate the area between two bounds
  	bool area(double lb, double rb){
  		if(header.interleave == envi_header::BSQ){		//if the infile is bsq file
  			if(header.data_type ==envi_header::float32)
  				return ((bsq<float>*)file)->area(lb, rb);
  			else if(header.data_type == envi_header::float64)
  				return ((bsq<double>*)file)->area(lb, rb);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else if(header.interleave == envi_header::BIL){		//if the infile is bil file
  			if(header.data_type ==envi_header::float32)
  				return ((bil<float>*)file)->area(lb, rb);
  			else if(header.data_type == envi_header::float64)
  				return ((bil<double>*)file)->area(lb, rb);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else if(header.interleave == envi_header::BIP){		//if the infile is bip file
  			if(header.data_type ==envi_header::float32)
  				return ((bip<float>*)file)->area(lb, rb);
  			else if(header.data_type == envi_header::float64)
  				return ((bip<double>*)file)->area(lb, rb);
  			else
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  		}
  
  		else{
  			std::cout<<"ERROR: unidentified file type"<<std::endl;
  			exit(1);
  		}
  		return false;
  	}
  
6708cc25   heziqi   Ziqi added envi c...
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
  	bool close(){
  		if(header.interleave == envi_header::BSQ){
  			if(header.data_type ==envi_header::float32)
  				return ((bsq<float>*)file)->close();
  			else if(header.data_type == envi_header::float64)
  				return ((bsq<double>*)file)->close();
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
  
  		else if(header.interleave == envi_header::BIL){
  			if(header.data_type ==envi_header::float32)
  				return ((bil<float>*)file)->close();
  			else if(header.data_type == envi_header::float64)
  				return ((bil<double>*)file)->close();
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
  
  		else if(header.interleave == envi_header::BIP){
  			if(header.data_type ==envi_header::float32)
  				return ((bip<float>*)file)->close();
  			else if(header.data_type == envi_header::float64)
  				return ((bip<double>*)file)->close();
  			else{
  				std::cout<<"ERROR: unidentified data type"<<std::endl;
  				exit(1);
  			}
  		}
e933c14e   David Mayerich   cleaned up the code
382
  		return false;
e8eb202f   David Mayerich   added a new ENVI ...
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
  	}
  
  	bool save_header(std::string filename){
  
  		//save the header file here
  		header.save(filename);
  
  		return true;
  	}
  
  
  
  
  
  };
  
  }	//end namespace rts
  
  #endif