MaximumAutocorrelationFactor.cxxΒΆ
Example usage:
./MaximumAutocorrelationFactor Input/wv2_cannes_8bands.tif Output/MAFOutput.tif Output/maf-input.png Output/maf-output.png
Example source code (MaximumAutocorrelationFactor.cxx):
#include "otbVectorImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"
#include "otbPrintableImageFilter.h"
// This example illustrates the class
// \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
// the criterion to maximize is the spatial auto-correlation rather than the
// variance.
//
// Auto-correlation is the correlation between the component and a
// unitary shifted version of the component.
//
// Please note that the inverse transform is not implemented yet.
//
// We start by including the corresponding header file.
#include "otbMaximumAutocorrelationFactorImageFilter.h"
int main(int itkNotUsed(argc), char* argv[])
{
char* infname = argv[1];
char* outfname = argv[2];
char* inpretty = argv[3];
char* outpretty = argv[4];
// We then define the types for the input image and the
// output image.
using InputImageType = otb::VectorImage<unsigned short, 2>;
using OutputImageType = otb::VectorImage<double, 2>;
// We can now declare the types for the reader. Since the images
// can be very 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}{ImageFileWriter} class.
using ReaderType = otb::ImageFileReader<InputImageType>;
using WriterType = otb::ImageFileWriter<OutputImageType>;
// The \doxygen{otb}{MultivariateAlterationDetectorImageFilter} is templated over
// the type of the input images and the type of the generated change
// image.
using FilterType = otb::MaximumAutocorrelationFactorImageFilter<InputImageType, OutputImageType>;
// The different elements of the pipeline can now be instantiated.
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
FilterType::Pointer filter = FilterType::New();
// We set the parameters of the different elements of the pipeline.
reader->SetFileName(infname);
writer->SetFileName(outfname);
// We build the pipeline by plugging all the elements together.
filter->SetInput(reader->GetOutput());
writer->SetInput(filter->GetOutput());
// And then we can trigger the pipeline update, as usual.
writer->Update();
// This is for rendering in software guide
using InputPrintFilterType = otb::PrintableImageFilter<InputImageType, InputImageType>;
using OutputPrintFilterType = otb::PrintableImageFilter<OutputImageType, OutputImageType>;
using VisuImageType = InputPrintFilterType::OutputImageType;
using VisuWriterType = otb::ImageFileWriter<VisuImageType>;
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();
// Figure \ref{fig:MAFFIG} shows the
// results of Maximum Autocorrelation Factor applied to an 8 bands
// Worldview2 image.
// \begin{figure}
// \center \includegraphics[width=0.32\textwidth]{maf-input.eps}
// \includegraphics[width=0.32\textwidth]{maf-output.eps}
// \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}
// \end{figure}
return EXIT_SUCCESS;
}