00001 #include "TePDIWaveletAtrous.hpp"
00002
00003 #include "../kernel/TeAgnostic.h"
00004 #include "TePDIUtils.hpp"
00005 #include "TePDITypes.hpp"
00006 #include "TePDIStatistic.hpp"
00007 #include "TePDIPrincipalComponents.hpp"
00008 #include "../kernel/TeRasterRemap.h"
00009 #include "../kernel/TeMatrix.h"
00010 #include "../kernel/TeUtils.h"
00011
00012 #include <math.h>
00013 #include <queue>
00014
00015 TePDIWaveletAtrous::TePDIWaveletAtrous()
00016 {
00017 }
00018
00019 TePDIWaveletAtrous::~TePDIWaveletAtrous()
00020 {
00021 }
00022
00023 void TePDIWaveletAtrous::ResetState(const TePDIParameters&)
00024 {
00025 }
00026
00027 bool TePDIWaveletAtrous::CheckParameters(const TePDIParameters& parameters) const
00028 {
00029 int direction;
00030 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("direction", direction), "Missing parameter: direction");
00031
00032 if (direction == DECOMPOSE)
00033 {
00034 TePDITypes::TePDIRasterPtrType input_raster;
00035 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("input_raster", input_raster), "Missing parameter: input_raster");
00036 TEAGN_TRUE_OR_RETURN(input_raster.isActive(), "Invalid parameter: input_raster inactive");
00037 TEAGN_TRUE_OR_RETURN(input_raster->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: input_raster not ready");
00038
00039 int band;
00040 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("band", band), "Missing parameter: band");
00041 TEAGN_TRUE_OR_RETURN(band < input_raster->nBands(), "Invalid parameter: band number");
00042
00043 int levels;
00044 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("levels", levels), "Missing parameter: levels");
00045
00046 TePDITypes::TePDIRasterVectorType output_wavelets;
00047 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("output_wavelets", output_wavelets), "Missing parameter: output_wavelets");
00048
00049 TEAGN_TRUE_OR_RETURN((int)output_wavelets.size() == (levels + 1), "Invalid output rasters number");
00050
00051 for(unsigned int b = 0; b < output_wavelets.size(); b++)
00052 {
00053 TEAGN_TRUE_OR_RETURN(output_wavelets[b].isActive(), "Invalid parameter: output_wavelets " + Te2String(b) + " inactive");
00054 TEAGN_TRUE_OR_RETURN(output_wavelets[b]->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: output_wavelets " + Te2String(b) + " not ready");
00055 }
00056 }
00057 else if (direction == RECOMPOSE)
00058 {
00059 std::vector<TePDITypes::TePDIRasterVectorType> input_rasters_wavelets;
00060 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("input_rasters_wavelets", input_rasters_wavelets), "Missing parameter: input_rasters_wavelets");
00061 for(unsigned int w = 0; w < input_rasters_wavelets.size(); w++)
00062 for(unsigned int b = 0; b < input_rasters_wavelets[w].size(); b++)
00063 {
00064 TEAGN_TRUE_OR_RETURN(input_rasters_wavelets[w][b].isActive(), "Invalid parameter: input_rasters_wavelets inactive");
00065 TEAGN_TRUE_OR_RETURN(input_rasters_wavelets[w][b]->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: input_rasters_wavelets not ready");
00066 }
00067
00068 int rasters_levels;
00069 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("rasters_levels", rasters_levels), "Missing parameter: rasters_levels");
00070 for(unsigned int w = 0; w < input_rasters_wavelets.size(); w++)
00071 TEAGN_TRUE_OR_RETURN((rasters_levels + 1) == (int)input_rasters_wavelets[w].size(), "Invalid parameter: rasters_levels not ready");
00072
00073 TePDITypes::TePDIRasterVectorType reference_raster_wavelets;
00074 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("reference_raster_wavelets", reference_raster_wavelets), "Missing parameter: reference_raster_wavelets");
00075 for(unsigned int b = 0; b < reference_raster_wavelets.size(); b++)
00076 {
00077 TEAGN_TRUE_OR_RETURN(reference_raster_wavelets[b].isActive(), "Invalid parameter: reference_raster_wavelets inactive");
00078 TEAGN_TRUE_OR_RETURN(reference_raster_wavelets[b]->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: reference_raster_wavelets not ready");
00079 }
00080
00081 int reference_levels;
00082 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("reference_levels", reference_levels), "Missing parameter: reference_levels");
00083 TEAGN_TRUE_OR_RETURN((reference_levels + 1) == (int)reference_raster_wavelets.size(), "Invalid parameter: reference_levels not ready");
00084
00085 TePDITypes::TePDIRasterVectorType output_rasters;
00086 TEAGN_TRUE_OR_RETURN(parameters.GetParameter("output_rasters", output_rasters), "Missing parameter: output_rasters");
00087
00088 for(unsigned int b = 0; b < output_rasters.size(); b++)
00089 {
00090 TEAGN_TRUE_OR_RETURN(output_rasters[b].isActive(), "Invalid parameter: output_rasters " + Te2String(b) + " inactive");
00091 TEAGN_TRUE_OR_RETURN(output_rasters[b]->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: output_rasters " + Te2String(b) + " not ready");
00092 }
00093 }
00094 else
00095 return false;
00096
00097 return true;
00098 }
00099
00100 bool TePDIWaveletAtrous::filterBank(string filterFile,TeMatrix &filter)
00101 {
00102 FILE *ff;
00103 int l,
00104 c;
00105 double t,
00106 w;
00107
00108
00109 if ((ff = fopen(filterFile.c_str(), "r")) != NULL)
00110 {
00111 fscanf(ff, "%d %d %lf", &l, &c, &t);
00112 filter.Init(l, c, 0.0);
00113
00114 std::queue<double> maskWeights;
00115 while(fscanf(ff, "%lf", &w) == 1)
00116 maskWeights.push(w/t);
00117
00118 for (int i = 0; i < l; i++)
00119 for (int j = 0; j < c; j++)
00120 {
00121 filter(i, j) = maskWeights.front();
00122 maskWeights.pop();
00123 }
00124
00125 fclose(ff);
00126 }
00127 else
00128 return false;
00129
00130 return true;
00131 }
00132
00133 bool TePDIWaveletAtrous::filterBank(FilterType filtertype,TeMatrix &filter)
00134 {
00135 switch( filtertype )
00136 {
00137 case B3SplineFilter :
00138 {
00139 TEAGN_TRUE_OR_RETURN( filter.Init( 5, 5, 0.0 ), "Filter init error" );
00140 const double weight = 256;
00141
00142 filter(0,0) = 1/weight; filter(0,1) = 4/weight; filter(0,2) = 6/weight; filter(0,3) = 4/weight; filter(0,4) = 1/weight;
00143 filter(1,0) = 4/weight; filter(1,1) = 16/weight; filter(1,2) = 24/weight; filter(1,3) = 16/weight; filter(1,4) = 4/weight;
00144 filter(2,0) = 6/weight; filter(2,1) = 24/weight; filter(2,2) = 36/weight; filter(2,3) = 24/weight; filter(2,4) = 6/weight;
00145 filter(3,0) = 4/weight; filter(3,1) = 16/weight; filter(3,2) = 24/weight; filter(3,3) = 16/weight; filter(3,4) = 4/weight;
00146 filter(4,0) = 1/weight; filter(4,1) = 4/weight; filter(4,2) = 6/weight; filter(4,3) = 4/weight; filter(4,4) = 1/weight;
00147
00148 break;
00149 }
00150 case TriangleFilter :
00151 {
00152 TEAGN_TRUE_OR_RETURN( filter.Init( 3, 3, 0.0 ), "Filter init error" );
00153 const double weight = 16;
00154
00155 filter(0,0) = 1/weight; filter(0,1) = 2/weight; filter(0,2) = 1/weight;
00156 filter(1,0) = 2/weight; filter(1,1) = 4/weight; filter(1,2) = 2/weight;
00157 filter(2,0) = 1/weight; filter(2,1) = 2/weight; filter(2,2) = 1/weight;
00158
00159 break;
00160 }
00161 default :
00162 {
00163 TEAGN_LOG_AND_RETURN( "Invalid filter type" )
00164 break;
00165 }
00166 }
00167
00168 return true;
00169 }
00170
00171 bool TePDIWaveletAtrous::RunImplementation_decompose()
00172 {
00173
00174 TePDITypes::TePDIRasterPtrType input_raster;
00175 TEAGN_TRUE_OR_RETURN(params_.GetParameter("input_raster", input_raster), "Missing parameter: input_raster");
00176
00177 int band;
00178 TEAGN_TRUE_OR_RETURN(params_.GetParameter("band", band), "Missing parameter: band");
00179
00180 int levels;
00181 TEAGN_TRUE_OR_RETURN(params_.GetParameter("levels", levels), "Missing parameter: levels");
00182
00183 TePDITypes::TePDIRasterVectorType output_wavelets;
00184 TEAGN_TRUE_OR_RETURN(params_.GetParameter("output_wavelets", output_wavelets), "Missing parameter: output_wavelets");
00185
00186
00187
00188 TeMatrix filter;
00189 if( params_.CheckParameter< FilterType > ( "filter_type" ) )
00190 {
00191 FilterType filterType;
00192 TEAGN_TRUE_OR_RETURN( params_.GetParameter( "filter_type",
00193 filterType ), "Missin parameter filter_type" );
00194
00195 TEAGN_TRUE_OR_THROW( filterBank( filterType, filter ),
00196 "Filter matrix generation failed");
00197 }
00198 else if( params_.CheckParameter< std::string > ( "filter_file" ) )
00199 {
00200 std::string filter_file;
00201 TEAGN_TRUE_OR_RETURN( params_.GetParameter( "filter_file",
00202 filter_file ), "Missin parameter filter_file" );
00203
00204 TEAGN_TRUE_OR_THROW( filterBank( filter_file, filter),
00205 "Filter matrix generation failed");
00206 }
00207 else
00208 {
00209 TEAGN_TRUE_OR_THROW( filterBank( TriangleFilter, filter ),
00210 "Filter matrix generation failed");
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 int l,
00235 multi,
00236 x,
00237 y,
00238 i,
00239 j,
00240 filter_dim = filter.Nrow(),
00241 offset = (int)(filter_dim / 2),
00242 k,
00243 m,
00244 lines = input_raster->params().nlines_,
00245 columns = input_raster->params().ncols_;
00246 double p_ori,
00247 p_ant,
00248 p_new;
00249
00250
00251 for(l = 1; l <= levels; l++)
00252 {
00253 multi = (int)pow(2.0, l-1);
00254 TePDIPIManager progress("Decomposing Wavelet Level " + Te2String(l), input_raster->params().nlines_, progress_enabled_);
00255 for (j = 0; j < lines; j++)
00256 {
00257 for (i = 0; i < columns; i++)
00258 {
00259 p_ori = p_ant = p_new = 0.0;
00260 for (k = 0; k < filter_dim; k++)
00261 {
00262 for (m = 0; m < filter_dim; m++)
00263 {
00264 x = i+(k-offset)*multi;
00265 y = j+(m-offset)*multi;
00266 if (x < 0)
00267 x = columns + x;
00268 else if (x >= columns)
00269 x = x - columns;
00270 if (y < 0)
00271 y = lines + y;
00272 else if (y >= lines)
00273 y = y - lines;
00274 output_wavelets[l-1]->getElement(x, y, p_ori, 0);
00275 p_new += p_ori * filter(k, m);
00276 }
00277 }
00278 output_wavelets[l]->setElement(i, j, p_new, 0);
00279 output_wavelets[l-1]->getElement(i, j, p_ori, 0);
00280 output_wavelets[l]->setElement(i, j, p_ori-p_new, 1);
00281 }
00282 progress.Increment();
00283 }
00284 }
00285
00286 return true;
00287 }
00288
00289 bool TePDIWaveletAtrous::RunImplementation_recompose()
00290 {
00291
00292 std::vector<TePDITypes::TePDIRasterVectorType> input_rasters_wavelets;
00293 TEAGN_TRUE_OR_RETURN(params_.GetParameter("input_rasters_wavelets", input_rasters_wavelets), "Missing parameter: input_rasters_wavelets");
00294
00295 int rasters_levels;
00296 TEAGN_TRUE_OR_RETURN(params_.GetParameter("rasters_levels", rasters_levels), "Missing parameter: rasters_levels");
00297
00298 TePDITypes::TePDIRasterVectorType reference_raster_wavelets;
00299 TEAGN_TRUE_OR_RETURN(params_.GetParameter("reference_raster_wavelets", reference_raster_wavelets), "Missing parameter: reference_raster_wavelets");
00300
00301 int reference_levels;
00302 TEAGN_TRUE_OR_RETURN(params_.GetParameter("reference_levels", reference_levels), "Missing parameter: reference_levels");
00303
00304 TePDITypes::TePDIRasterVectorType output_rasters;
00305 TEAGN_TRUE_OR_RETURN(params_.GetParameter("output_rasters", output_rasters), "Missing parameter: output_rasters");
00306
00307
00308 unsigned int b;
00309 int i,
00310 j,
00311 l;
00312 double pixel,
00313 p_pan;
00314 std::vector<double> channelMinLevel,
00315 channelMaxLevel;
00316
00317 for(b = 0; b < input_rasters_wavelets.size(); b++)
00318 {
00319 channelMinLevel.push_back(0.0);
00320
00321 channelMaxLevel.push_back(255.0);
00322 }
00323
00324
00325 for(b = 0; b < input_rasters_wavelets.size(); b++)
00326 {
00327 TeRasterParams base_raster_params = input_rasters_wavelets[b][0]->params();
00328 TeRasterParams output_rasters_params = base_raster_params;
00329 output_rasters_params.nBands(1);
00330 output_rasters_params.projection( base_raster_params.projection() );
00331 output_rasters_params.boxResolution(base_raster_params.box().x1(), base_raster_params.box().y1(), base_raster_params.box().x2(), base_raster_params.box().y2(), base_raster_params.resx_, base_raster_params.resy_);
00332 output_rasters_params.setPhotometric(TeRasterParams::TeMultiBand, -1);
00333 output_rasters_params.setDummy(0.0, -1);
00334 output_rasters_params.setDataType(TeFLOAT, -1);
00335 TEAGN_TRUE_OR_RETURN(output_rasters[b]->init(output_rasters_params), "Output rasters reset error " + Te2String(b));
00336 }
00337
00338
00339 for(b = 0; b < input_rasters_wavelets.size(); b++)
00340 {
00341 int lines = input_rasters_wavelets[b][0]->params().nlines_,
00342 columns = input_rasters_wavelets[b][0]->params().ncols_;
00343
00344 double maxOutValue = 0;
00345 double minOutValue = 0;
00346 TEAGN_TRUE_OR_RETURN( TePDIUtils::TeGetRasterMinMaxBounds(
00347 output_rasters[b], 0, minOutValue, maxOutValue ),
00348 "Unable to determine the min/max output values" )
00349
00350 TePDIPIManager progress("Recomposing Wavelet Band " + Te2String(b+1), input_rasters_wavelets[0][0]->params().nlines_, progress_enabled_);
00351 for (j = 0; j < lines; j++)
00352 {
00353 for (i = 0; i < columns; i++)
00354 {
00355 input_rasters_wavelets[b][rasters_levels]->getElement(i, j, pixel, 0);
00356 for(l = 1; l <= reference_levels; l++)
00357 {
00358 reference_raster_wavelets[l]->getElement(i, j, p_pan, 1);
00359 pixel += p_pan;
00360 }
00361
00362
00363 pixel = MIN( pixel, maxOutValue );
00364 pixel = MAX( pixel, minOutValue );
00365
00366 output_rasters[b]->setElement(i, j, pixel, 0);
00367 }
00368 progress.Increment();
00369 }
00370 }
00371
00372 return true;
00373 }
00374
00375 bool TePDIWaveletAtrous::RunImplementation()
00376 {
00377
00378
00379 int direction;
00380 TEAGN_TRUE_OR_RETURN(params_.GetParameter("direction", direction), "Missing parameter: direction");
00381
00382 if (direction == DECOMPOSE)
00383 return RunImplementation_decompose();
00384 else if (direction == RECOMPOSE)
00385 return RunImplementation_recompose();
00386
00387 return false;
00388 }