MaximumAutocorrelationFactor.cxx 6.17 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*=========================================================================

  Program:   ORFEO Toolbox
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
  See OTBCopyright.txt for details.


     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#include "otbVectorImage.h"
#include "otbImageFileReader.h"
#include "otbStreamingImageFileWriter.h"
#include "otbPrintableImageFilter.h"

//  Software Guide : BeginCommandLineArgs
//    INPUTS: {wv2_cannes_8bands.tif}
//    OUTPUTS: {MAFOutput.tif}, {maf-input.png}, {maf-output.png}
//
//  Software Guide : EndCommandLineArgs

OTB Bot's avatar
STYLE  
OTB Bot committed
29
//  Software Guide : BeginLatex
30
// This example illustrates the class
31 32 33
// \doxygen{otb}{MaximumAutocorrelationFactorImageFilter}, which
// performs a Maximum Autocorrelation Factor transform \cite{nielsen2011kernel}. Like
// PCA, MAF tries to find a set of orthogonal linear transform, but
34
// the criterion to maximize is the spatial auto-correlation rather than the
35 36 37 38
// variance.
//
// Auto-correlation is the correlation between the component and a
// unitary shifted version of the component.
OTB Bot's avatar
STYLE  
OTB Bot committed
39
//
40
// Please note that the inverse transform is not implemented yet.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
//
// We start by including the corresponding header file.
//
//  Software Guide : EndLatex

//  Software Guide : BeginCodeSnippet
#include "otbMaximumAutocorrelationFactorImageFilter.h"
//  Software Guide : EndCodeSnippet

int main(int argc, char* argv[])
{
  char * infname   = argv[1];
  char * outfname  = argv[2];
  char * inpretty  = argv[3];
  char * outpretty = argv[4];
  
  //  Software Guide : BeginLatex
  //  We then define the types for the input image and the
  //  output image.
  //  Software Guide : EndLatex
  
  //  Software Guide : BeginCodeSnippet
  typedef otb::VectorImage<unsigned short, 2> InputImageType;
  typedef otb::VectorImage<double, 2>         OutputImageType;
  //  Software Guide : EndCodeSnippet


  //  Software Guide : BeginLatex
  //
  //  We can now declare the types for the reader. Since the images
  //  can be vey large, we will force the pipeline to use
  //  streaming. For this purpose, the file writer will be
  //  streamed. This is achieved by using the
  //  \doxygen{otb}{StreamingImageFileWriter} class.
  //
  //  Software Guide : EndLatex

  //  Software Guide : BeginCodeSnippet
  typedef otb::ImageFileReader<InputImageType>    ReaderType;
  typedef otb::StreamingImageFileWriter<OutputImageType> WriterType;
  //  Software Guide : EndCodeSnippet

  // SoftwareGuide : BeginLatex
  //  The \doxygen{otb}{MultivariateAlterationDetectorImageFilter} is templated over
  //  the type of the input images and the type of the generated change
  //  image.
  //
  //  Software Guide : EndLatex

  //  Software Guide : BeginCodeSnippet
  typedef otb::MaximumAutocorrelationFactorImageFilter<InputImageType,
                                          OutputImageType> FilterType;
  //  Software Guide : EndCodeSnippet


  //  Software Guide : BeginLatex
  //
  //  The different elements of the pipeline can now be instantiated.
  //
  //  Software Guide : EndLatex

  //  Software Guide : BeginCodeSnippet
  ReaderType::Pointer reader = ReaderType::New();
  WriterType::Pointer writer = WriterType::New();
  FilterType::Pointer filter = FilterType::New();
  //  Software Guide : EndCodeSnippet

  //  Software Guide : BeginLatex
  //
  //  We set the parameters of the different elements of the pipeline.
  //
  //  Software Guide : EndLatex

  //  Software Guide : BeginCodeSnippet
  reader->SetFileName(infname);
  writer->SetFileName(outfname);
  //  Software Guide : EndCodeSnippet

  //  Software Guide : BeginLatex
  //
  //  We build the pipeline by plugging all the elements together.
  //
  //  Software Guide : EndLatex

  //  Software Guide : BeginCodeSnippet
  filter->SetInput(reader->GetOutput());
  writer->SetInput(filter->GetOutput());
  //  Software Guide : EndCodeSnippet

  //  Software Guide : BeginLatex
  //
  //  And then we can trigger the pipeline update, as usual.
  //
  //  Software Guide : EndLatex
    
  //  Software Guide : BeginCodeSnippet
  writer->Update();
  //  Software Guide : EndCodeSnippet

  // This is for rendering in software guide
  typedef otb::PrintableImageFilter<InputImageType,InputImageType>   InputPrintFilterType;
  typedef otb::PrintableImageFilter<OutputImageType,OutputImageType> OutputPrintFilterType;
  typedef InputPrintFilterType::OutputImageType                      VisuImageType;
  typedef otb::StreamingImageFileWriter<VisuImageType>               VisuWriterType;

  InputPrintFilterType::Pointer inputPrintFilter = InputPrintFilterType::New();
  OutputPrintFilterType::Pointer outputPrintFilter = OutputPrintFilterType::New();
  VisuWriterType::Pointer inputVisuWriter = VisuWriterType::New();
  VisuWriterType::Pointer outputVisuWriter = VisuWriterType::New();

  inputPrintFilter->SetInput(reader->GetOutput());
  inputPrintFilter->SetChannel(5);
  inputPrintFilter->SetChannel(3);
  inputPrintFilter->SetChannel(2);
  outputPrintFilter->SetInput(filter->GetOutput());
  outputPrintFilter->SetChannel(1);
  outputPrintFilter->SetChannel(2);
  outputPrintFilter->SetChannel(3);

  inputVisuWriter->SetInput(inputPrintFilter->GetOutput());
  outputVisuWriter->SetInput(outputPrintFilter->GetOutput());

  inputVisuWriter->SetFileName(inpretty);
  outputVisuWriter->SetFileName(outpretty);

  inputVisuWriter->Update();
  outputVisuWriter->Update();

OTB Bot's avatar
STYLE  
OTB Bot committed
169
  //  Software Guide : BeginLatex
170 171
  // Figure \ref{fig:MAFFIG} shows the
  // results of Maximum Autocorrelation Factor applied to an 8 bands
OTB Bot's avatar
STYLE  
OTB Bot committed
172
  // Worldview2 image.
173
  // \begin{figure}
174 175
  // \center \includegraphics[width=0.32\textwidth]{maf-input.eps}
  // \includegraphics[width=0.32\textwidth]{maf-output.eps}
176 177 178
  // \itkcaption[Maximum Autocorrelation Factor results]{Results of the
  // Maximum Autocorrelation Factor algorithm applied to a 8 bands
  // Worldview2 image (3 first components).}  \label{fig:MAFFIG}
OTB Bot's avatar
STYLE  
OTB Bot committed
179
  // \end{figure}
180 181 182 183
  // Software Guide : EndLatex

  return EXIT_SUCCESS;
}