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
|