TePDIWaveletAtrous.cpp

Go to the documentation of this file.
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 /* Getting parameters */
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   // Retriving filter matrix
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 /* Allocating output rasters */ 
00214         /*TeRasterParams base_raster_params = input_raster->params();
00215         for(int l = 1; l <= levels; l++)
00216         {
00217                 TeRasterParams input_raster_params = base_raster_params;
00218                 input_raster_params.nBands(waveletPlanes);
00219                 if (input_raster_params.projection() != 0)
00220                 {
00221                         TeSharedPtr<TeProjection> proj(TeProjectionFactory::make(base_raster_params.projection()->params()));
00222                         input_raster_params.projection(proj.nakedPointer());
00223                 }
00224                 input_raster_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_);
00225                 input_raster_params.setPhotometric(TeRasterParams::TeMultiBand, -1);
00226                 input_raster_params.setDataType(TeFLOAT, -1);
00227                 input_raster_params.setDummy(0.0, -1);
00228                 for(int n = 0; n < waveletPlanes; n++)
00229                         input_raster_params.nbitsperPixel_[n] = base_raster_params.nbitsperPixel_[band];
00230                 TEAGN_TRUE_OR_RETURN(output_wavelets[l]->init(input_raster_params), "Output wavelets reset error " + Te2String(l));
00231         }*/
00232 
00233 /* Setting variables */
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 /* Computing wavelet decomposition */
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 /* Getting parameters */
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 /* Setting variables */
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                 //channelMaxLevel.push_back(pow(2.0, (double)input_rasters_wavelets[b][0]->params().nbitsperPixel_[0])-1.0);
00321                 channelMaxLevel.push_back(255.0);
00322         }
00323 
00324 /* Allocating output rasters */
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 /* Computing wavelet recomposition */
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                                 //pixel = (pixel > channelMaxLevel[b]?channelMaxLevel[b]:(pixel < channelMinLevel[b]?channelMinLevel[b]:pixel));
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 /* Getting parameters */
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 }

Generated on Sun Jul 29 04:01:25 2012 for TerraLib - Development Source by  doxygen 1.5.3