Commit f0d5a76974f4e7c17194dcbb839694d8946543b6
1 parent
0e48cc9c
Ziqi changed the baseline to double float
Showing
1 changed file
with
119 additions
and
17 deletions
Show diff stats
envi/bsq.h
... | ... | @@ -85,8 +85,8 @@ public: |
85 | 85 | getSlice(p, 2, page); |
86 | 86 | } |
87 | 87 | |
88 | - free(p1); | |
89 | - free(p2); | |
88 | +// free(p1); | |
89 | +// free(p2); | |
90 | 90 | return true; |
91 | 91 | } |
92 | 92 | |
... | ... | @@ -107,13 +107,11 @@ public: |
107 | 107 | file.seekg((header.lines * header.samples - 1) * sizeof(T), std::ios::cur); //go to the next band |
108 | 108 | } |
109 | 109 | |
110 | - free(p1); | |
111 | - free(p2); | |
112 | 110 | return true; |
113 | 111 | } |
114 | - | |
115 | - //baseline correction and save it into file | |
116 | - bool baseline(std::string outname, std::vector<unsigned> bands ) | |
112 | + /* | |
113 | + // for bands only | |
114 | + bool baselineold(std::string outname, std::vector<unsigned> bands ) | |
117 | 115 | { |
118 | 116 | unsigned N = bands.size(); //get the number of baseline points |
119 | 117 | |
... | ... | @@ -153,33 +151,36 @@ public: |
153 | 151 | //else get the low band |
154 | 152 | else{ |
155 | 153 | control += 1; |
156 | - getBand(a, ai); | |
154 | + band_index(a, ai); | |
157 | 155 | bi = bands[control]; |
158 | 156 | } |
159 | 157 | //get the high band |
160 | - getBand(b, bi); | |
158 | + band_index(b, bi); | |
161 | 159 | |
162 | 160 | //correct every band |
163 | 161 | for(unsigned ci = 0; ci < B; ci++){ |
164 | 162 | |
165 | 163 | //update baseline points, if necessary |
166 | - if( ci == bi && ci != B - 1) { | |
164 | + if( ci == bi && ci != B - 1) | |
165 | + { | |
167 | 166 | //if the high band is now on the last BL point? |
168 | - if (control != N-1) { | |
167 | + if (control != N-1) | |
168 | + { | |
169 | 169 | |
170 | 170 | control++; //increment the index |
171 | 171 | |
172 | - std::swap<T*>(a, b); //swap the baseline band pointers | |
172 | + std::swap(a, b); //swap the baseline band pointers | |
173 | 173 | |
174 | 174 | ai = bi; |
175 | 175 | bi = bands[control]; |
176 | - getBand(b, bi); | |
176 | + band_index(b, bi); | |
177 | 177 | |
178 | 178 | } |
179 | 179 | //if the last BL point on the last band of the file? |
180 | - else if ( bands[control] != B - 1) { | |
180 | + else if ( bands[control] != B - 1) | |
181 | + { | |
181 | 182 | |
182 | - std::swap<T*>(a, b); //swap the baseline band pointers | |
183 | + std::swap(a, b); //swap the baseline band pointers | |
183 | 184 | |
184 | 185 | memset(b, (char)0, S); //clear the high band |
185 | 186 | |
... | ... | @@ -189,7 +190,7 @@ public: |
189 | 190 | } |
190 | 191 | |
191 | 192 | //get the current band |
192 | - getBand(c, ci); | |
193 | + band_index(c, ci); | |
193 | 194 | |
194 | 195 | //perform the baseline correction |
195 | 196 | for(unsigned i=0; i < XY; i++){ |
... | ... | @@ -199,7 +200,7 @@ public: |
199 | 200 | |
200 | 201 | target.write(reinterpret_cast<const char*>(c), S); //write the corrected data into destination |
201 | 202 | |
202 | - } | |
203 | + } | |
203 | 204 | |
204 | 205 | free(a); |
205 | 206 | free(b); |
... | ... | @@ -207,7 +208,108 @@ public: |
207 | 208 | target.close(); |
208 | 209 | return true; |
209 | 210 | } |
211 | + */ | |
212 | + | |
213 | + //baseline correction and save it into file | |
214 | + | |
215 | + bool baseline(std::string outname, std::vector<double> wls ) | |
216 | + { | |
217 | + unsigned N = wls.size(); //get the number of baseline points | |
210 | 218 | |
219 | + std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file | |
220 | + | |
221 | + //simplify image resolution | |
222 | + unsigned int B = header.bands; //calculate the number of bands | |
223 | + unsigned int XY = header.samples * header.lines; //calculate the number of pixels in a band | |
224 | + unsigned int S = XY * sizeof(T); //calculate the number of bytes in a band | |
225 | + | |
226 | + double ai, bi; //stores the two baseline points wavelength surrounding the current band | |
227 | + double ci; //stores the current band's wavelength | |
228 | +// unsigned aii, bii; //stores the two baseline points number surrounding the current band | |
229 | + unsigned control=0; | |
230 | + | |
231 | + T * a; //pointers to the high and low band images | |
232 | + T * b; | |
233 | + T * c; //pointer to the current image | |
234 | + | |
235 | + a = (T*)malloc( S ); //memory allocation | |
236 | + b = (T*)malloc( S ); | |
237 | + c = (T*)malloc( S ); | |
238 | + | |
239 | + if (a == NULL || b == NULL || c == NULL){ | |
240 | + std::cout<<"ERROR: error allocating memory"; | |
241 | + exit(1); | |
242 | + } | |
243 | + | |
244 | + | |
245 | + //initialize lownum, highnum, low, high | |
246 | + ai=header.wavelength[0]; | |
247 | + | |
248 | + //if no baseline point is specified at band 0, | |
249 | + //set the baseline point at band 0 to 0 | |
250 | + if(wls[0] != header.wavelength[0]){ | |
251 | + bi = wls[control]; | |
252 | + memset(a, (char)0, S); | |
253 | + } | |
254 | + //else get the low band | |
255 | + else{ | |
256 | + control += 1; | |
257 | + getBand(a, ai); | |
258 | + bi = wls[control]; | |
259 | + } | |
260 | + //get the high band | |
261 | + getBand(b, bi); | |
262 | + | |
263 | + //correct every band | |
264 | + for(unsigned cii = 0; cii < B; cii++){ | |
265 | + | |
266 | + //update baseline points, if necessary | |
267 | + if( header.wavelength[cii] >= bi && cii != B - 1) { | |
268 | + //if the high band is now on the last BL point? | |
269 | + if (control != N-1) { | |
270 | + | |
271 | + control++; //increment the index | |
272 | + | |
273 | + std::swap(a, b); //swap the baseline band pointers | |
274 | + | |
275 | + ai = bi; | |
276 | + bi = wls[control]; | |
277 | + getBand(b, bi); | |
278 | + | |
279 | + } | |
280 | + //if the last BL point on the last band of the file? | |
281 | + else if ( wls[control] < header.wavelength[B - 1]) { | |
282 | + | |
283 | + std::swap(a, b); //swap the baseline band pointers | |
284 | + | |
285 | + memset(b, (char)0, S); //clear the high band | |
286 | + | |
287 | + ai = bi; | |
288 | + bi = header.wavelength[B - 1]; | |
289 | + } | |
290 | + } | |
291 | + | |
292 | + //get the current band | |
293 | + band_index(c, cii); | |
294 | + ci = header.wavelength[cii]; | |
295 | + | |
296 | + //perform the baseline correction | |
297 | + for(unsigned i=0; i < XY; i++){ | |
298 | + double r = (double) (ci - ai) / (double) (bi - ai); | |
299 | + (float) c[i] =(float) ( c[i] - (b[i] - a[i]) * r - a[i] ); | |
300 | + } | |
301 | + | |
302 | + target.write(reinterpret_cast<const char*>(c), S); //write the corrected data into destination | |
303 | + | |
304 | + } | |
305 | + | |
306 | + free(a); | |
307 | + free(b); | |
308 | + free(c); | |
309 | + target.close(); | |
310 | + return true; | |
311 | + } | |
312 | + | |
211 | 313 | |
212 | 314 | }; |
213 | 315 | } | ... | ... |