TePDIPrincoMixModelStrategy Class Reference
[Algorithm strategies.]

#include <TePDIPrincoMixModelStrategy.hpp>

Inheritance diagram for TePDIPrincoMixModelStrategy:

TePDIMixModelStrategy TePDIStrategy

Detailed Description

This is the class for princo mixmodel strategy.
Author:
Felipe Castro da Silva <tkorting@dpi.inpe.br>
Note:
The required parameters are:
Parameters:
mixmodel_type (std::string): Must be "princo", "mqp" or "mpr".
component_list (TePDIMixModelComponentList): components list.
spectral_band_list (TePDIMixModelSpectralBandList): spectral bands list.
input_rasters (TePDITypes::TePDIRasterVectorType): input rasters.
bands (std::vector<int>): band number of each input raster.
output_rasters (TePDITypes::TePDIRasterVectorType): output rasters (ratio images).
compute_error_rasters (int): if 1, the algorithm compute the error rasters, if 0, not.
output_error_rasters (TePDITypes::TePDIRasterVectorType): if compute_error_rasters, here we have to set output error rasters.
compute_average_error (int): if 1, the algorithm compute the average error, if 0, not.
average_error (double): if compute_average_error, here we have the average error value.
normalize (double): if 1, the output images are normalized, if 0, not.

Definition at line 61 of file TePDIPrincoMixModelStrategy.hpp.


Public Types

typedef const
TeSharedPtr
< TePDIPrincoMixModelStrategy
const_pointer
 Type definition for a const instance pointer.
typedef TeSharedPtr
< TePDIPrincoMixModelStrategy
pointer
 Type definition for a instance pointer.

Public Member Functions

bool Apply (const TePDIParameters &params)
bool CheckParameters (const TePDIParameters &parameters) const
 Checks if the supplied parameters fits the requirements of each PDI strategy.
void ToggleProgInt (bool enabled)
 ~TePDIPrincoMixModelStrategy ()
 Default destructor.

Static Public Member Functions

static
TePDIMixModelStrategy
DefaultObject (const TePDIParameters &)

Protected Member Functions

bool Implementation (const TePDIParameters &params)
 Runs the algorithm implementation.
 TePDIPrincoMixModelStrategy ()
 Default constructor.

Protected Attributes

bool progress_interface_enabled_

Friends

class TePDIPrincoMixModelSF

Member Typedef Documentation

typedef const TeSharedPtr< TePDIPrincoMixModelStrategy > TePDIPrincoMixModelStrategy::const_pointer

Reimplemented from TePDIMixModelStrategy.

Definition at line 66 of file TePDIPrincoMixModelStrategy.hpp.

typedef TeSharedPtr< TePDIPrincoMixModelStrategy > TePDIPrincoMixModelStrategy::pointer

Reimplemented from TePDIMixModelStrategy.

Definition at line 65 of file TePDIPrincoMixModelStrategy.hpp.


Constructor & Destructor Documentation

TePDIPrincoMixModelStrategy::~TePDIPrincoMixModelStrategy (  ) 

Definition at line 7 of file TePDIPrincoMixModelStrategy.cpp.

00008 {
00009 };

TePDIPrincoMixModelStrategy::TePDIPrincoMixModelStrategy (  )  [protected]

Parameters:
factoryName Factory name.

Definition at line 3 of file TePDIPrincoMixModelStrategy.cpp.

00004 {
00005 };


Member Function Documentation

bool TePDIStrategy::Apply ( const TePDIParameters params  )  [inherited]

Applies the strategy.

Note:
Parameters checking will be performed.
Returns:
true if OK. false on error.

Definition at line 22 of file TePDIStrategy.cpp.

References TePDIStrategy::CheckParameters(), TePDIStrategy::Implementation(), and TEAGN_TRUE_OR_RETURN.

00023 {
00024   TEAGN_TRUE_OR_RETURN( CheckParameters( params ), 
00025     "Parameter checking failed" );
00026     
00027   return Implementation( params );
00028 }

bool TePDIPrincoMixModelStrategy::CheckParameters ( const TePDIParameters parameters  )  const [virtual]

Error log messages must be generated. No exceptions generated.

Parameters:
parameters The parameters to be checked.
Returns:
true if the parameters are OK. false if not.

Implements TePDIStrategy.

Definition at line 11 of file TePDIPrincoMixModelStrategy.cpp.

References TePDIMixModelComponentList::getComponentSize(), TePDIParameters::GetParameter(), TePDIMixModelComponentList::getSize(), Te2String(), TEAGN_TRUE_OR_RETURN, and TeRasterParams::TeNotReady.

00012 {
00013 // Components e spectralbands checking
00014 
00015   TePDIMixModelComponentList componentList;
00016   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("component_list", componentList), "Missing parameter: component_list");
00017 
00018   TePDIMixModelSpectralBandList spectralBandList;
00019   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("spectral_band_list", spectralBandList), "Missing parameter: spectral_band_list");
00020 
00021   TEAGN_TRUE_OR_RETURN(componentList.getSize() <= spectralBandList.getSize(), "Invalid parameter: componentsNumber greater than spectralBandsNumber");
00022   for (unsigned int nc = 0; nc < componentList.getSize(); nc++)
00023     TEAGN_TRUE_OR_RETURN(componentList.getComponentSize(nc) == 
00024       (int)spectralBandList.getSize(), 
00025       "Invalid parameter: components bands diferred from spectralBandsNumber");
00026     
00027 
00028 // Input rasters and bands checking
00029 
00030   TePDITypes::TePDIRasterVectorType input_rasters;
00031   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("input_rasters", input_rasters), "Missing parameter: input_rasters");
00032   TEAGN_TRUE_OR_RETURN(input_rasters.size() > 1, "Invalid input rasters number");
00033 
00034   TEAGN_TRUE_OR_RETURN(input_rasters.size() == spectralBandList.getSize(), "Invalid parameter: input_raster number diferred from spectralBandsNumber");
00035 
00036   std::vector<int> bands;
00037   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("bands", bands), "Missing parameter: bands");
00038   TEAGN_TRUE_OR_RETURN(bands.size() == input_rasters.size(), Te2String(input_rasters.size()) + " Invalid parameter: bands number " + Te2String(bands.size()));
00039 
00040   for (unsigned int input_rasters_index = 0 ; input_rasters_index < input_rasters.size(); input_rasters_index++)
00041   {
00042     TEAGN_TRUE_OR_RETURN(input_rasters[input_rasters_index].isActive(), "Invalid parameter: input_raster " + Te2String(input_rasters_index) + " inactive");
00043     TEAGN_TRUE_OR_RETURN(input_rasters[input_rasters_index]->params().status_ != TeRasterParams::TeNotReady, "Invalid parameter: input_raster " + Te2String(input_rasters_index) + " not ready");
00044     TEAGN_TRUE_OR_RETURN(bands[input_rasters_index] < input_rasters[input_rasters_index]->nBands(), "Invalid parameter: bands[" + Te2String(input_rasters_index) + "]");
00045         TEAGN_TRUE_OR_RETURN(input_rasters[input_rasters_index]->params().nlines_ == input_rasters[0]->params().nlines_, "Invalid parameter: input_raster " + Te2String(input_rasters_index) + " with imcompatible number of lines");
00046     TEAGN_TRUE_OR_RETURN(input_rasters[input_rasters_index]->params().ncols_ == input_rasters[0]->params().ncols_, "Invalid parameter: input_raster " + Te2String(input_rasters_index) + " with imcompatible number of columns" );
00047   }
00048  
00049 // Output rasters checking
00050 
00051   TePDITypes::TePDIRasterVectorType output_rasters;
00052   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("output_rasters", output_rasters), "Missing parameter: output_rasters");
00053   TEAGN_TRUE_OR_RETURN(output_rasters.size() > 1, "Invalid output rasters number");
00054 
00055 // Compute error raster flag checking
00056   int computeErrorRasters;
00057   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("compute_error_rasters", computeErrorRasters), "Missing parameter: compute error rasters");
00058   if (computeErrorRasters)
00059   {
00060     TePDITypes::TePDIRasterVectorType output_error_rasters;
00061     TEAGN_TRUE_OR_RETURN(parameters.GetParameter("output_error_rasters", output_error_rasters), "Missing parameter: output_error_rasters");
00062     TEAGN_TRUE_OR_RETURN(output_error_rasters.size() > 1, "Invalid output error rasters number");
00063   }
00064 
00065 // Normalize flag checking
00066   int normalize;
00067   TEAGN_TRUE_OR_RETURN(parameters.GetParameter("normalize", normalize), "Missing parameter: normalize");
00068   TEAGN_TRUE_OR_RETURN((normalize >= 0) && (normalize <= 1) , "Inavlid parameter value: normalize");
00069   
00070   return true;
00071 }

TePDIMixModelStrategy * TePDIMixModelStrategy::DefaultObject ( const TePDIParameters  )  [static, inherited]

Returns a default object.

Returns:
A default object.

Reimplemented from TePDIStrategy.

Definition at line 15 of file TePDIMixModelStrategy.cpp.

References TEAGN_LOG_AND_THROW.

00017 {
00018   TEAGN_LOG_AND_THROW( 
00019     "Trying to build an invalid mixmodel strategy instance" );
00020   return 0; 
00021 }

bool TePDIPrincoMixModelStrategy::Implementation ( const TePDIParameters params  )  [protected, virtual]

Returns:
true if OK. false on errors.

Implements TePDIStrategy.

Definition at line 164 of file TePDIPrincoMixModelStrategy.cpp.

References aux, TeRasterParams::boundingBoxLinesColumns(), TeMatrix::Clear(), componentsNumber, TeMatrix::EigenVectors(), TePDIParameters::GetParameter(), TePDIMixModelComponentList::getPixel(), TePDIMixModelComponentList::getSize(), TePDIPIManager::Increment(), TeMatrix::Init(), TeRasterParams::nBands(), TeMatrix::Ncol(), TeMatrix::Nrow(), TePDIStrategy::progress_interface_enabled_, TeRasterParams::projection(), SFowardBackSubstitution(), SGaussElimination(), spectralBandsNumber, TEAGN_TRUE_OR_RETURN, TEAGN_TRUE_OR_THROW, TeDOUBLE, TeBox::TeUPPERLEFT, TePDIPIManager::Toggle(), and TeMatrix::Transpose().

00165 {
00166 // Check components e spectralbands parameters
00167   TePDIMixModelComponentList componentList;
00168   TEAGN_TRUE_OR_RETURN(params.GetParameter("component_list", componentList), "Missing parameter: component_list");
00169 
00170   TePDIMixModelSpectralBandList spectralBandList;
00171   TEAGN_TRUE_OR_RETURN(params.GetParameter("spectral_band_list", spectralBandList), "Missing parameter: spectral_band_list");
00172 
00173   unsigned int  componentsNumber = componentList.getSize(),
00174       spectralBandsNumber = spectralBandList.getSize(),
00175       componentsNumberLessOne = componentsNumber - 1;
00176 
00177 // Check input_rasters parameter
00178   TePDITypes::TePDIRasterVectorType input_rasters;
00179   TEAGN_TRUE_OR_RETURN(params.GetParameter("input_rasters", input_rasters), "Missing parameter: input_rasters");
00180   
00181   std::vector<int> bands;
00182   TEAGN_TRUE_OR_RETURN(params.GetParameter("bands", bands), 
00183     "Missing parameter: bands");
00184 
00185 // Check output_rasters parameter
00186   TePDITypes::TePDIRasterVectorType output_rasters;
00187   TEAGN_TRUE_OR_RETURN(params.GetParameter("output_rasters", output_rasters), "Missing parameter: output_rasters");
00188 
00189 // Initialize output_rasters based on first input raster
00190 
00191   TeRasterParams base_raster_params = input_rasters[0]->params();
00192   base_raster_params.setDataType( TeDOUBLE, -1 );
00193   base_raster_params.nBands( 1 );
00194   
00195   for(unsigned int outrasterindex = 0; outrasterindex < output_rasters.size(); 
00196     ++outrasterindex )
00197   {
00198     TeRasterParams outRasterParams = output_rasters[outrasterindex]->params();
00199     outRasterParams.nBands( 1 );
00200     outRasterParams.boundingBoxLinesColumns(
00201       base_raster_params.boundingBox().x1(),
00202       base_raster_params.boundingBox().y1(),
00203       base_raster_params.boundingBox().x2(),
00204       base_raster_params.boundingBox().y2(),
00205       base_raster_params.nlines_,
00206       base_raster_params.ncols_,
00207       TeBox::TeUPPERLEFT );
00208     outRasterParams.projection( base_raster_params.projection() );
00209     
00210     TEAGN_TRUE_OR_THROW( 
00211       output_rasters[outrasterindex]->init( outRasterParams ), 
00212         "Output raster init error");
00213   }
00214 
00215 // Check compute error raster parameter and outout error rasters if it's necessary
00216   int computeErrorRasters;
00217   TEAGN_TRUE_OR_RETURN(params.GetParameter("compute_error_rasters", computeErrorRasters), "Missing parameter: compute_error_asters");
00218   TePDITypes::TePDIRasterVectorType output_error_rasters;
00219   if (computeErrorRasters)
00220   {
00221     TEAGN_TRUE_OR_RETURN(params.GetParameter("output_error_rasters", 
00222       output_error_rasters), "Missing parameter: output_error_rasters");
00223       
00224     for(unsigned int outrasterindex = 0; outrasterindex < 
00225       output_error_rasters.size(); ++outrasterindex )
00226     {
00227       TeRasterParams outRasterParams = 
00228         output_error_rasters[outrasterindex]->params();
00229       outRasterParams.nBands( 1 );
00230       outRasterParams.boundingBoxLinesColumns(
00231         base_raster_params.boundingBox().x1(),
00232         base_raster_params.boundingBox().y1(),
00233         base_raster_params.boundingBox().x2(),
00234         base_raster_params.boundingBox().y2(),
00235         base_raster_params.nlines_,
00236         base_raster_params.ncols_,
00237         TeBox::TeUPPERLEFT );
00238       outRasterParams.projection( base_raster_params.projection() );    
00239       
00240       TEAGN_TRUE_OR_THROW( 
00241         output_error_rasters[outrasterindex]->init( outRasterParams ), 
00242           "Output raster init error");      
00243     }
00244   }
00245 
00246 // Check compute average error
00247   int computeAverageError;
00248   TEAGN_TRUE_OR_RETURN(params.GetParameter("compute_average_error", computeAverageError), "Missing parameter: compute_average_error_");
00249   double averageError;
00250   if (computeAverageError)
00251     TEAGN_TRUE_OR_RETURN(params.GetParameter("average_error", averageError), "Missing parameter: average_error");
00252 
00253 // Check normalize
00254   int normalize;
00255   TEAGN_TRUE_OR_RETURN(params.GetParameter("normalize", normalize), "Missing parameter: normalize");
00256 
00257 // Getting number of lines and columns from the first image
00258   int rastersLines = base_raster_params.nlines_;
00259   int rastersColumns = base_raster_params.ncols_;
00260 
00261 // Indexes variables
00262   unsigned int  i,
00263       j,
00264       k,
00265       m;
00266 
00267 // Buildind the SpectralBandsComponents Matrix base on input componentsList and spectralBandList
00268   TeMatrix SpectralBandsComponents;
00269   SpectralBandsComponents.Init(spectralBandsNumber, componentsNumber, 0.0);
00270   for(i = 0; i < spectralBandsNumber; i++)
00271     for (j = 0; j < componentsNumber; j++)
00272       SpectralBandsComponents(i, j) = componentList.getPixel(j, i);
00273 //Printing
00274 //cout << "SpectralBandsComponents" << endl;
00275 //SpectralBandsComponents.Print();
00276 
00277 //----- Part I : mathematical processing independend on image data -----//
00278 
00279 // SpectralBandsComponentsTransposed stores SpectralBandsComponents and other things after
00280    TeMatrix SpectralBandsComponentsTransposed;
00281 // Initializing SpectralBandsComponentsTransposed Matrix
00282   TEAGN_TRUE_OR_RETURN(SpectralBandsComponentsTransposed.Init(componentsNumber, spectralBandsNumber, 0.0), "Error initializing SpectralBandsComponentsTransposed Matrix");
00283 // Initializing SpectralBandsComponentsTransposed Matrix = Transpose of SpectralBandsComponents
00284    TEAGN_TRUE_OR_RETURN(SpectralBandsComponents.Transpose(SpectralBandsComponentsTransposed), "Error transposing SpectralBandsComponents to SpectralBandsComponentsTransposed");
00285 
00286 //Printing
00287 //cout << "SpectralBandsComponentsTransposed - After transposing" << endl;
00288 //SpectralBandsComponentsTransposed.Print();
00289  
00290 // Compute componentsMean vector as the mean coefficient value per band and subtract the componentsMeanAfter from the coefficients matrix
00291 // Creating two double vectors to store de means of the spectralBands of each component
00292    std::vector<double> componentsMean(spectralBandsNumber, 0.0),
00293      componentsMeanAfter(spectralBandsNumber, 0.0);
00294   for (j = 0; j < spectralBandsNumber; j++)
00295   {
00296 // Compute original mean (componentsMean)
00297     componentsMean[j] = 0;
00298     for(i = 0; i < componentsNumber; i++)
00299       componentsMean[j] = componentsMean[j] + SpectralBandsComponentsTransposed(i,j);
00300     componentsMean[j] = componentsMean[j] / (double)componentsNumber;
00301 
00302 // Subtract mean from SpectralBandsComponents and compute new matrix mean (componentsMeanAfter)
00303     componentsMeanAfter[j] = 0;
00304     for(i = 0; i < componentsNumber; i++)
00305     {
00306       SpectralBandsComponentsTransposed(i,j) = SpectralBandsComponentsTransposed(i,j) - componentsMean[j];
00307       componentsMeanAfter[j] = componentsMeanAfter[j] + SpectralBandsComponentsTransposed(i,j);
00308     }
00309     componentsMeanAfter[j] = componentsMeanAfter[j]/ (double)componentsNumber;
00310   }
00311 
00312 //Printing
00313 //cout << "SpectralBandsComponentsTransposed - After less mean" << endl;
00314 //SpectralBandsComponentsTransposed.Print();
00315 
00316 // Compute covarianceVector vector
00317   std::vector<double> covarianceVector(spectralBandsNumber*spectralBandsNumber, 0.0);
00318   for(k = 0; k < spectralBandsNumber*spectralBandsNumber; k++)
00319     covarianceVector[k] = 0;
00320    k = 0 ;
00321    for(j = 0; j < spectralBandsNumber; j++)
00322    {
00323      for(m = 0; m < j + 1; m++)
00324      {
00325        for(i = 0; i < componentsNumber; i++)
00326          covarianceVector[k] = covarianceVector[k] + (SpectralBandsComponentsTransposed(i, j) - componentsMeanAfter[j]) * (SpectralBandsComponentsTransposed(i, m) - componentsMeanAfter[m]);
00327        covarianceVector[k] = covarianceVector[k]/(double)componentsNumber ;
00328        k++;
00329      }
00330    }
00331 // Printing
00332 //  for(k = 0; k < spectralBandsNumber*spectralBandsNumber; k++)
00333 //  {
00334 //    cout << covarianceVector[k] << " ";
00335 //  }
00336 
00337    TeMatrix covarianceMatrix;
00338   TEAGN_TRUE_OR_RETURN(covarianceMatrix.Init(spectralBandsNumber, spectralBandsNumber, 0.0), "Error initializing covarianceMatrix");
00339 
00340    k = 0;
00341    for (i = 0; i< spectralBandsNumber; i++)
00342      for (j = 0; j <= i; j++)
00343        covarianceMatrix(i, j) = covarianceVector[k++];
00344 // Printing
00345 //cout << "covarianceMatrix" << endl;
00346 //covarianceMatrix.Print();
00347 
00348 // Compute eigenvectors : results aux
00349    TeMatrix auxMatrix;
00350    TEAGN_TRUE_OR_RETURN(covarianceMatrix.EigenVectors(auxMatrix), "Error in eigenvectors calcule of auxMatrix")
00351 
00352 // Printing
00353 //cout << "auxMatrix - eigenvectors of covarianceMatrix" << endl;
00354 //auxMatrix.Print();
00355 
00356 // Keep only significant eigenvectors (componentsNumber - 1): results eigenreducted
00357    TeMatrix eigenreducted;
00358    TEAGN_TRUE_OR_RETURN(eigenreducted.Init(spectralBandsNumber, componentsNumberLessOne, 0.0), "Error initializing eigenreducted matrix")
00359    for (j = 0; j <  spectralBandsNumber; j++)
00360      for (i = 0; i <  componentsNumberLessOne; i++)
00361        eigenreducted(j, i) = auxMatrix(j, i);
00362 
00363 //Printing
00364 //cout << "eigenreducted" << endl;
00365 //eigenreducted.Print();
00366 
00367 // Clear auxMatrix for future use
00368    auxMatrix.Clear(); 
00369 
00370 // Rotate SpectralBandsComponentsTransposed to PCA space;  result SpectralBandsComponentsPCA
00371   TeMatrix SpectralBandsComponentsPCA;
00372   TEAGN_TRUE_OR_RETURN(SpectralBandsComponentsPCA.Init(SpectralBandsComponentsTransposed.Nrow(), eigenreducted.Ncol()), "Error initializing SpectralBandsComponentsPCA");
00373  
00374   SpectralBandsComponentsPCA = SpectralBandsComponentsTransposed * eigenreducted;
00375 
00376 // Printing
00377 //cout << "SpectralBandsComponentsPCA - Rotate SpectralBandsComponentsTransposed to PCA space" << endl;
00378 //SpectralBandsComponentsPCA.Print();
00379 
00380 // Clear SpectralBandsComponentsTransposed: it will not be used bellow
00381   SpectralBandsComponentsTransposed.Clear();
00382  
00383 // Initialize one more column to SpectralBandsComponentsPCA to incorporate sum restriction to equations; results auxMatrix
00384   TEAGN_TRUE_OR_RETURN(auxMatrix.Init(SpectralBandsComponentsPCA.Nrow(), SpectralBandsComponentsPCA.Ncol() + 1), "Error initializing auxMatrix");
00385  
00386   for (j = 0; j < ((unsigned int)SpectralBandsComponentsPCA.Nrow()); j++)
00387   {
00388     for (i = 0; i <  ((unsigned int)SpectralBandsComponentsPCA.Ncol() ); i++)
00389       auxMatrix(j, i) = SpectralBandsComponentsPCA(j, i);
00390     auxMatrix (j, SpectralBandsComponentsPCA.Ncol()) = 1.0;
00391   }
00392 // Printing
00393 //cout << "Initialize one more column to SpectralBandsComponentsPCA to incorporate sum restriction to equation" << endl;
00394 //auxMatrix.Print();
00395 
00396 // Clear SpectralBandsComponentsPCA for future use
00397   SpectralBandsComponentsPCA.Clear(); 
00398  
00399 // Transpose auxMatrix; results SpectralBandsComponentsPCA
00400   TEAGN_TRUE_OR_RETURN(auxMatrix.Transpose(SpectralBandsComponentsPCA), "Error transposing auxMatrix to SpectralBandsComponentsPCA");
00401 
00402 // Printing
00403 //cout << "Transpose matrix SpectralBandsComponentsPCA" << endl;
00404 //SpectralBandsComponentsPCA.Print();
00405 
00406 // Clear auxMatrix for future use
00407   auxMatrix.Clear();
00408  
00409 // Invert matrix SpectralBandsComponentsPCA; results SpectralBandsComponentsPCA
00410   std::vector<int> lines(componentsNumber, 0);
00411 
00412    TEAGN_TRUE_OR_RETURN(SGaussElimination(SpectralBandsComponentsPCA, lines, componentsNumber), "Error in gauss elimination");
00413 
00414 // Printing
00415 //cout << "Invert matrix SpectralBandsComponentsPCA" << endl;
00416 //SpectralBandsComponentsPCA.Print();
00417 
00418 //----- Part II : mathematical processing dependend on image data -----//
00419  
00420 // Initialize matrixes that will help to prepare vector Y
00421   TEAGN_TRUE_OR_RETURN(auxMatrix.Init(1, spectralBandsNumber, 0.0), "Error initializing auxMatrix");
00422  
00423   TeMatrix ymat;
00424   TEAGN_TRUE_OR_RETURN(ymat.Init(componentsNumberLessOne, componentsNumberLessOne, 0.0), "Error initializing ymat");
00425  
00426 // Initialize proportion vector X and image dependent values for the linear equations Y  
00427   std::vector<double>  x(componentsNumber, 0.0),
00428     y(componentsNumber, 0.0);
00429   for (i = 0; i < componentsNumber; i++)
00430   {
00431     x[i] = 0.0;
00432     y[i] = 0.0;
00433   }
00434 
00435 // Initialize current line and column    
00436   std::vector<int> colin(spectralBandsNumber, 0);
00437   int  colout,
00438 // Auxiliates the transformation of proportions to [0, 255]
00439     prop;
00440 
00441 // It's should be class variables
00442   std::vector<int> linesIn(spectralBandsNumber, 0),
00443     colsIn(spectralBandsNumber, 0);
00444 
00445 // It's should be class variables
00446   TeMatrix  rasterLinesIn,
00447                         rasterLinesOut;
00448   rasterLinesIn.Init(spectralBandsNumber, rastersColumns, 0.0);
00449   rasterLinesOut.Init(componentsNumber, rastersColumns, 0.0);
00450   std::vector<double> spectralBandsError(spectralBandsNumber, 0.0);
00451 
00452 // Initialization of variables declared above
00453   for (i = 0; i < spectralBandsNumber; i++)
00454   {
00455     colin[i] = 0;
00456     linesIn[i] = 0;
00457     colsIn[i] = 0;
00458     spectralBandsError[i] = 0.0;
00459   }
00460 
00461 // Start computing proportions for each line lines
00462   TePDIPIManager progress( "Computing MixModel proportions", rastersLines,
00463     progress_interface_enabled_ );
00464 
00465   for (int linout = 0; linout < rastersLines;  linout++)
00466   {
00467     // Read input line for each band
00468     for (i = 0; i < spectralBandsNumber; i++)
00469     {
00470       for (j = 0; j < ( (unsigned int)rastersColumns ); j++)
00471       {
00472         double p;
00473         input_rasters[i]->getElement(j, linesIn[i], p, bands[ i ] );
00474         rasterLinesIn(i, j) = p;
00475       }
00476       // Update next line to be read for band i
00477       linesIn[i]++;
00478 
00479       // Reinitialize first column for band i
00480       colin[i] = colsIn[i];
00481     }
00482 
00483     // Compute proportions for each column
00484            for (colout = 0; colout < rastersColumns; colout++)
00485     {
00486       // Prepare y
00487       for (i = 0; i < spectralBandsNumber; i++)
00488         auxMatrix(0,i) = (double) (rasterLinesIn(i, colin[i]))/255. - componentsMean[i];
00489  
00490       ymat = auxMatrix * eigenreducted;
00491     
00492       for (i = 0; i < componentsNumber - 1; i++)
00493         y[i] = ymat(0,i);
00494       
00495       // Compute proportions
00496       SFowardBackSubstitution(SpectralBandsComponentsPCA, y, componentsNumber, lines, componentsNumber, x, componentsNumber);
00497  
00498       // Store proportion in buffers  
00499       for (i = 0; i < componentsNumber; i++)
00500       {
00501         prop = (short) (x[i]*100 + 100);
00502         rasterLinesOut(i, colout) = (unsigned char)prop;
00503       }
00504  
00505 //----- It's should be a function (ComputeErrors.begin) -----//
00506 
00507       double   aux, error;
00508       // Verifify if it is necessary to compute the error
00509       if (computeErrorRasters || computeAverageError)
00510       {
00511         for (i = 0; i < spectralBandsNumber; i++)
00512         {
00513           // Compute digital value from the proportions
00514           aux = 0.0;
00515           for (j = 0; j < componentsNumber; j++)
00516             aux += x[j] * SpectralBandsComponents(i,j);
00517       
00518           // Compute error as module of the difference between the original value and aux
00519           error = (long)(rasterLinesIn(i, colin[i]))/255.0 - aux;
00520           if (error < 0)
00521             error = -1 * error;
00522           if (computeErrorRasters)
00523             rasterLinesIn(i, colout) = error * 255.0;
00524           if (computeAverageError)
00525             spectralBandsError[i] += error*255.;
00526         }
00527       }
00528 
00529 //----- It's should be a function (ComputeErrors.end) -----//
00530       // Update current column number
00531       for (i = 0; i < spectralBandsNumber; i++)
00532         colin[i]++;
00533  
00534      } // End of column processing
00535  
00536     // Write processed line to disk
00537     for (i = 0; i < componentsNumber; i++)
00538       for (j = 0; j < ((unsigned int)rastersColumns); j++)
00539         output_rasters[i]->setElement(j, linout, rasterLinesOut(i, j));
00540 
00541 
00542 //----- It's should be a function (StoreErrorRasters.begin) -----//
00543     // Store output error rasters
00544     if (computeErrorRasters)
00545     {
00546       // Write the output error images lines
00547       for (i = 0; i < componentsNumber; i++)
00548         for (j = 0; j < ((unsigned int)rastersColumns); j++)
00549                   output_error_rasters[i]->setElement(j, linout, rasterLinesIn(i, j));
00550     }
00551 //----- It's should be a function (StoreErrorRasters.end) -----//
00552 
00553     progress.Increment();
00554   } // End of line processing
00555   
00556   progress.Toggle( false );
00557 
00558 //----- It's should be a function (ComputeAverageError.begin) -----//
00559 // Verifify if it is necessary to compute the error
00560   averageError = 0.0;
00561   if (computeAverageError)
00562   {
00563     // Compute total number of pixels in the output image
00564     int numpix = rastersLines*rastersColumns;
00565     for (i = 0; i < spectralBandsNumber; i++)
00566     {
00567       // Compute avarege band error taking accumulated band error 
00568       spectralBandsError[i] = spectralBandsError[i]/numpix;
00569       // Accumulate avarege error
00570       averageError += spectralBandsError[i];
00571     }
00572     // Compute total error taking the accumulated average error
00573     if (!(spectralBandsNumber == 0))
00574     {
00575       averageError = averageError/spectralBandsNumber;
00576     }
00577 // Printing
00578 //    cout << endl << averageError << endl;
00579   }
00580 // Printing
00581 //  for(k = 0; k < spectralBandsNumber; k++)
00582 //  {
00583 //    cout << spectralBandsError[k] << " ";
00584 //  }
00585 //----- It's should be a function (ComputeAverageError.end) -----//
00586 
00587   return true;
00588 }

void TePDIStrategy::ToggleProgInt ( bool  enabled  )  [inherited]

Enable / Disable the progress interface.

Parameters:
enabled Flag to enable ( true ) or disable ( false ).

Definition at line 31 of file TePDIStrategy.cpp.

References TePDIStrategy::progress_interface_enabled_.

00032 {
00033   progress_interface_enabled_ = enabled;
00034 }


Friends And Related Function Documentation

friend class TePDIPrincoMixModelSF [friend]

Definition at line 63 of file TePDIPrincoMixModelStrategy.hpp.


Field Documentation

bool TePDIStrategy::progress_interface_enabled_ [mutable, protected, inherited]

Progress interface enabled/disable flag

Definition at line 98 of file TePDIStrategy.hpp.

Referenced by Implementation(), TePDIStrategy::TePDIStrategy(), and TePDIStrategy::ToggleProgInt().


The documentation for this class was generated from the following files:
Generated on Sun Jul 29 04:08:15 2012 for TerraLib - Development Source by  doxygen 1.5.3