27 filter::Filter::Filter(
void)
28 : m_padding(
"symmetric")
33 filter::Filter::Filter(
const vector<double> &taps)
34 : m_padding(
"symmetric")
39 void filter::Filter::setTaps(
const vector<double> &taps,
bool normalize)
41 m_taps.resize(taps.size());
43 for(
int itap=0;itap<taps.size();++itap)
46 for(
int itap=0;itap<taps.size();++itap)
47 m_taps[itap]=taps[itap]/norm;
51 assert(m_taps.size()%2);
54 void filter::Filter::dwtForward(
const ImgReaderGdal& input,
ImgWriterGdal& output,
const std::string& wavelet_type,
int family){
55 const char* pszMessage;
56 void* pProgressArg=NULL;
57 GDALProgressFunc pfnProgress=GDALTermProgress;
59 pfnProgress(progress,pszMessage,pProgressArg);
62 for(
int y=0;y<input.nrOfRow();++y){
63 for(
int iband=0;iband<input.nrOfBand();++iband)
64 input.readData(lineInput[iband],GDT_Float64,y,iband);
65 vector<double> pixelInput(input.nrOfBand());
66 for(
int x=0;x<input.nrOfCol();++x){
67 pixelInput=lineInput.selectCol(x);
68 dwtForward(pixelInput,wavelet_type,family);
69 for(
int iband=0;iband<input.nrOfBand();++iband)
70 lineOutput[iband][x]=pixelInput[iband];
72 for(
int iband=0;iband<input.nrOfBand();++iband){
74 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
76 catch(
string errorstring){
77 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
80 progress=(1.0+y)/output.nrOfRow();
81 pfnProgress(progress,pszMessage,pProgressArg);
85 void filter::Filter::dwtInverse(
const ImgReaderGdal& input,
ImgWriterGdal& output,
const std::string& wavelet_type,
int family){
86 const char* pszMessage;
87 void* pProgressArg=NULL;
88 GDALProgressFunc pfnProgress=GDALTermProgress;
90 pfnProgress(progress,pszMessage,pProgressArg);
93 for(
int y=0;y<input.nrOfRow();++y){
94 for(
int iband=0;iband<input.nrOfBand();++iband)
95 input.readData(lineInput[iband],GDT_Float64,y,iband);
96 vector<double> pixelInput(input.nrOfBand());
97 for(
int x=0;x<input.nrOfCol();++x){
98 pixelInput=lineInput.selectCol(x);
99 dwtInverse(pixelInput,wavelet_type,family);
100 for(
int iband=0;iband<input.nrOfBand();++iband)
101 lineOutput[iband][x]=pixelInput[iband];
103 for(
int iband=0;iband<input.nrOfBand();++iband){
105 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
107 catch(
string errorstring){
108 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
111 progress=(1.0+y)/output.nrOfRow();
112 pfnProgress(progress,pszMessage,pProgressArg);
116 void filter::Filter::dwtCut(
const ImgReaderGdal& input,
ImgWriterGdal& output,
const std::string& wavelet_type,
int family,
double cut){
117 const char* pszMessage;
118 void* pProgressArg=NULL;
119 GDALProgressFunc pfnProgress=GDALTermProgress;
121 pfnProgress(progress,pszMessage,pProgressArg);
124 for(
int y=0;y<input.nrOfRow();++y){
125 for(
int iband=0;iband<input.nrOfBand();++iband)
126 input.readData(lineInput[iband],GDT_Float64,y,iband);
127 vector<double> pixelInput(input.nrOfBand());
128 for(
int x=0;x<input.nrOfCol();++x){
129 pixelInput=lineInput.selectCol(x);
130 dwtCut(pixelInput,wavelet_type,family,cut);
131 for(
int iband=0;iband<input.nrOfBand();++iband)
132 lineOutput[iband][x]=pixelInput[iband];
134 for(
int iband=0;iband<input.nrOfBand();++iband){
136 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
138 catch(
string errorstring){
139 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
142 progress=(1.0+y)/output.nrOfRow();
143 pfnProgress(progress,pszMessage,pProgressArg);
147 void filter::Filter::dwtCutFrom(
const ImgReaderGdal& input,
ImgWriterGdal& output,
const std::string& wavelet_type,
int family,
int band){
148 const char* pszMessage;
149 void* pProgressArg=NULL;
150 GDALProgressFunc pfnProgress=GDALTermProgress;
152 pfnProgress(progress,pszMessage,pProgressArg);
155 for(
int y=0;y<input.nrOfRow();++y){
156 for(
int iband=0;iband<input.nrOfBand();++iband)
157 input.readData(lineInput[iband],GDT_Float64,y,iband);
158 vector<double> pixelInput(input.nrOfBand());
159 for(
int x=0;x<input.nrOfCol();++x){
160 pixelInput=lineInput.selectCol(x);
161 dwtForward(pixelInput,wavelet_type,family);
162 for(
int iband=0;iband<input.nrOfBand();++iband){
166 dwtInverse(pixelInput,wavelet_type,family);
167 for(
int iband=0;iband<input.nrOfBand();++iband)
168 lineOutput[iband][x]=pixelInput[iband];
170 for(
int iband=0;iband<input.nrOfBand();++iband){
172 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
174 catch(
string errorstring){
175 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
178 progress=(1.0+y)/output.nrOfRow();
179 pfnProgress(progress,pszMessage,pProgressArg);
184 void filter::Filter::dwtForward(std::vector<double>& data,
const std::string& wavelet_type,
int family){
185 int origsize=data.size();
187 while(data.size()&(data.size()-1))
188 data.push_back(data.back());
190 int nsize=data.size();
192 gsl_wavelet_workspace *work;
194 w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);
195 work=gsl_wavelet_workspace_alloc(nsize);
196 gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);
197 data.erase(data.begin()+origsize,data.end());
198 gsl_wavelet_free (w);
199 gsl_wavelet_workspace_free (work);
203 void filter::Filter::dwtInverse(std::vector<double>& data,
const std::string& wavelet_type,
int family){
204 int origsize=data.size();
206 while(data.size()&(data.size()-1))
207 data.push_back(data.back());
208 int nsize=data.size();
210 gsl_wavelet_workspace *work;
212 w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);
213 work=gsl_wavelet_workspace_alloc(nsize);
214 gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);
215 data.erase(data.begin()+origsize,data.end());
216 gsl_wavelet_free (w);
217 gsl_wavelet_workspace_free (work);
221 void filter::Filter::dwtCut(std::vector<double>& data,
const std::string& wavelet_type,
int family,
double cut){
222 int origsize=data.size();
224 while(data.size()&(data.size()-1))
225 data.push_back(data.back());
226 int nsize=data.size();
228 gsl_wavelet_workspace *work;
230 w=gsl_wavelet_alloc(getWaveletType(wavelet_type),family);
231 work=gsl_wavelet_workspace_alloc(nsize);
232 gsl_wavelet_transform_forward(w,&(data[0]),1,nsize,work);
233 std::vector<double> abscoeff(data.size());
234 size_t* p=
new size_t[data.size()];
235 for(
int index=0;index<data.size();++index){
236 abscoeff[index]=fabs(data[index]);
238 int nc=(100-cut)/100.0*nsize;
239 gsl_sort_index(p,&(abscoeff[0]),1,nsize);
240 for(
int i=0;(i+nc)<nsize;i++)
242 gsl_wavelet_transform_inverse(w,&(data[0]),1,nsize,work);
243 data.erase(data.begin()+origsize,data.end());
245 gsl_wavelet_free (w);
246 gsl_wavelet_workspace_free (work);
249 void filter::Filter::morphology(
const ImgReaderGdal& input,
ImgWriterGdal& output,
const std::string& method,
int dim,
short verbose)
254 const char* pszMessage;
255 void* pProgressArg=NULL;
256 GDALProgressFunc pfnProgress=GDALTermProgress;
258 pfnProgress(progress,pszMessage,pProgressArg);
259 for(
int y=0;y<input.nrOfRow();++y){
260 for(
int iband=0;iband<input.nrOfBand();++iband)
261 input.readData(lineInput[iband],GDT_Float64,y,iband);
262 vector<double> pixelInput(input.nrOfBand());
263 vector<double> pixelOutput(input.nrOfBand());
264 for(
int x=0;x<input.nrOfCol();++x){
265 pixelInput=lineInput.selectCol(x);
266 filter(pixelInput,pixelOutput,method,dim);
268 for(
int iband=0;iband<input.nrOfBand();++iband)
269 lineOutput[iband][x]=pixelOutput[iband];
271 for(
int iband=0;iband<input.nrOfBand();++iband){
273 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
275 catch(
string errorstring){
276 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
279 progress=(1.0+y)/output.nrOfRow();
280 pfnProgress(progress,pszMessage,pProgressArg);
288 for(
int itap=0;itap<dim;++itap)
289 m_taps[itap]=1.0/dim;
290 filter(input,output);
306 const char* pszMessage;
307 void* pProgressArg=NULL;
308 GDALProgressFunc pfnProgress=GDALTermProgress;
310 pfnProgress(progress,pszMessage,pProgressArg);
311 for(
int y=0;y<input.nrOfRow();++y){
312 for(
int iband=0;iband<input.nrOfBand();++iband)
313 input.readData(lineInput[iband],GDT_Float64,y,iband);
314 vector<double> pixelInput(input.nrOfBand());
315 vector<double> pixelOutput(input.nrOfBand());
316 for(
int x=0;x<input.nrOfCol();++x){
317 pixelInput=lineInput.selectCol(x);
318 filter(pixelInput,pixelOutput);
319 for(
int iband=0;iband<input.nrOfBand();++iband)
320 lineOutput[iband][x]=pixelOutput[iband];
322 for(
int iband=0;iband<input.nrOfBand();++iband){
324 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
326 catch(
string errorstring){
327 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
330 progress=(1.0+y)/output.nrOfRow();
331 pfnProgress(progress,pszMessage,pProgressArg);
338 assert(output.nrOfCol()==input.nrOfCol());
339 vector<double> lineOutput(output.nrOfCol());
341 const char* pszMessage;
342 void* pProgressArg=NULL;
343 GDALProgressFunc pfnProgress=GDALTermProgress;
345 pfnProgress(progress,pszMessage,pProgressArg);
346 for(
int y=0;y<input.nrOfRow();++y){
347 for(
int iband=0;iband<input.nrOfBand();++iband)
348 input.readData(lineInput[iband],GDT_Float64,y,iband);
349 vector<double> pixelInput(input.nrOfBand());
350 for(
int x=0;x<input.nrOfCol();++x){
351 pixelInput=lineInput.selectCol(x);
352 switch(getFilterType(method)){
353 case(filter::median):
354 lineOutput[x]=stat.median(pixelInput);
357 lineOutput[x]=stat.mymin(pixelInput);
360 lineOutput[x]=stat.mymax(pixelInput);
363 lineOutput[x]=stat.sum(pixelInput);
366 lineOutput[x]=stat.var(pixelInput);
369 lineOutput[x]=sqrt(stat.var(pixelInput));
372 lineOutput[x]=stat.mean(pixelInput);
375 std::string errorString=
"method not supported";
381 output.writeData(lineOutput,GDT_Float64,y);
383 catch(
string errorstring){
384 cerr << errorstring <<
"in line " << y << endl;
386 progress=(1.0+y)/output.nrOfRow();
387 pfnProgress(progress,pszMessage,pProgressArg);
395 const char* pszMessage;
396 void* pProgressArg=NULL;
397 GDALProgressFunc pfnProgress=GDALTermProgress;
399 pfnProgress(progress,pszMessage,pProgressArg);
400 for(
int y=0;y<input.nrOfRow();++y){
401 for(
int iband=0;iband<input.nrOfBand();++iband)
402 input.readData(lineInput[iband],GDT_Float64,y,iband);
403 vector<double> pixelInput(input.nrOfBand());
404 vector<double> pixelOutput;
405 for(
int x=0;x<input.nrOfCol();++x){
406 pixelInput=lineInput.selectCol(x);
407 filter(pixelInput,pixelOutput,method,dim);
408 for(
int iband=0;iband<pixelOutput.size();++iband){
409 lineOutput[iband][x]=pixelOutput[iband];
414 for(
int iband=0;iband<input.nrOfBand();++iband){
416 output.writeData(lineOutput[iband],GDT_Float64,y,iband);
418 catch(
string errorstring){
419 cerr << errorstring <<
"in band " << iband <<
", line " << y << endl;
422 progress=(1.0+y)/output.nrOfRow();
423 pfnProgress(progress,pszMessage,pProgressArg);
427 double filter::Filter::getCentreWavelength(
const std::vector<double> &wavelengthIn,
const Vector2d<double>& srf,
const std::string& interpolationType,
double delta,
bool verbose)
429 assert(srf.size()==2);
430 int nband=srf[0].size();
431 double start=floor(wavelengthIn[0]);
432 double end=ceil(wavelengthIn.back());
434 std::cout <<
"wavelengths in [" << start <<
"," << end <<
"]" << std::endl << std::flush;
438 gsl_interp_accel *acc;
441 stat.getSpline(interpolationType,nband,spline);
442 stat.initSpline(spline,&(srf[0][0]),&(srf[1][0]),nband);
444 std::cout <<
"calculating norm of srf" << std::endl << std::flush;
446 norm=gsl_spline_eval_integ(spline,srf[0].front(),srf[0].back(),acc);
448 std::cout <<
"norm of srf: " << norm << std::endl << std::flush;
449 gsl_spline_free(spline);
450 gsl_interp_accel_free(acc);
451 std::vector<double> wavelength_fine;
452 for(
double win=floor(wavelengthIn[0]);win<=ceil(wavelengthIn.back());win+=delta)
453 wavelength_fine.push_back(win);
456 std::cout <<
"interpolate wavelengths to " << wavelength_fine.size() <<
" entries " << std::endl;
457 std::vector<double> srf_fine;
459 stat.interpolateUp(srf[0],srf[1],wavelength_fine,interpolationType,srf_fine,verbose);
460 assert(srf_fine.size()==wavelength_fine.size());
462 gsl_interp_accel *accOut;
463 stat.allocAcc(accOut);
464 gsl_spline *splineOut;
465 stat.getSpline(interpolationType,wavelength_fine.size(),splineOut);
468 std::vector<double> wavelengthOut(wavelength_fine.size());
470 for(
int iband=0;iband<wavelengthOut.size();++iband)
471 wavelengthOut[iband]=wavelength_fine[iband]*srf_fine[iband];
473 stat.initSpline(splineOut,&(wavelength_fine[0]),&(wavelengthOut[0]),wavelength_fine.size());
474 double centreWavelength=gsl_spline_eval_integ(splineOut,start,end,accOut)/norm;
476 gsl_spline_free(splineOut);
477 gsl_interp_accel_free(accOut);
479 return(centreWavelength);