Skip to content
Snippets Groups Projects
Commit e809f104 authored by Victor Poughon's avatar Victor Poughon
Browse files

DOC: review example MultivariateAlterationDetector

parent 5aa70b94
No related branches found
No related tags found
No related merge requests found
Data/Output/mad-input2.png

131 B

Data/Output/mad-output.png

132 B

......@@ -19,12 +19,6 @@
*/
#include "otbVectorImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"
#include "otbPrintableImageFilter.h"
/* Example usage:
./MultivariateAlterationDetector Input/Spot5-Gloucester-before.tif \
Input/Spot5-Gloucester-after.tif \
......@@ -34,33 +28,10 @@
Output/mad-output.png
*/
// This example illustrates the class
// \doxygen{otb}{MultivariateAlterationChangeDetectorImageFilter},
// which implements the Multivariate Alteration Change Detector
// algorithm \cite{nielsen2007regularized}. This algorihtm allows
// performing change detection from a pair multi-band images, including
// images with different number of bands or modalities. Its output is
// a a multi-band image of change maps, each one being unccorrelated
// with the remaining. The number of bands of the output image is the
// minimum number of bands between the two input images.
//
// The algorithm works as follows. It tries to find two linear
// combinations of bands (one for each input images) which maximize
// correlation, and subtract these two linear combinitation, leading
// to the first change map. Then, it looks for a second set of linear
// combinations which are orthogonal to the first ones, a which
// maximize correlation, and use it as the second change map. This
// process is iterated until no more orthogonal linear combinations
// can be found.
//
// This algorithms has numerous advantages, such as radiometry scaling
// and shifting invariance and absence of parameters, but it can not
// be used on a pair of single band images (in this case the output is
// simply the difference between the two images).
//
// We start by including the corresponding header file.
#include "otbVectorImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"
#include "otbPrintableImageFilter.h"
#include "otbMultivariateAlterationDetectorImageFilter.h"
int main(int argc, char* argv[])
......@@ -79,36 +50,31 @@ int main(int argc, char* argv[])
// We then define the types for the input images and for the
// change image.
using InputPixelType = unsigned short;
using OutputPixelType = float;
using InputImageType = otb::VectorImage<InputPixelType, Dimension>;
using OutputImageType = otb::VectorImage<OutputPixelType, Dimension>;
// 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}{ImageFileWriter} class.
// 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
// ImageFileWriter class.
using ReaderType = otb::ImageFileReader<InputImageType>;
using WriterType = otb::ImageFileWriter<OutputImageType>;
// 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>;
// The \doxygen{otb}{MultivariateAlterationDetectorImageFilter} is templated over
// the type of the input images and the type of the generated change
// image.
// The MultivariateAlterationDetectorImageFilter is templated over
// the type of the input images and the type of the generated change
// image.
using MADFilterType = otb::MultivariateAlterationDetectorImageFilter<InputImageType, OutputImageType>;
// The different elements of the pipeline can now be instantiated.
// The different elements of the pipeline can now be instantiated.
ReaderType::Pointer reader1 = ReaderType::New();
ReaderType::Pointer reader2 = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
......@@ -120,30 +86,19 @@ int main(int argc, char* argv[])
const char* in1pretty = argv[4];
const char* in2pretty = argv[5];
const char* outpretty = argv[6];
// We set the parameters of the different elements of the pipeline.
// We set the parameters of the different elements of the pipeline.
reader1->SetFileName(inputFilename1);
reader2->SetFileName(inputFilename2);
writer->SetFileName(outputFilename);
// We build the pipeline by plugging all the elements together.
// We build the pipeline by plugging all the elements together.
madFilter->SetInput1(reader1->GetOutput());
madFilter->SetInput2(reader2->GetOutput());
writer->SetInput(madFilter->GetOutput());
try
{
// And then we can trigger the pipeline update, as usual.
writer->Update();
}
catch (itk::ExceptionObject& err)
{
std::cout << "ExceptionObject caught !" << std::endl;
std::cout << err << std::endl;
return -1;
}
// And then we can trigger the pipeline update, as usual.
writer->Update();
// Here we generate the figures
InputPrintFilterType::Pointer input1PrintFilter = InputPrintFilterType::New();
......@@ -177,18 +132,4 @@ int main(int argc, char* argv[])
input1VisuWriter->Update();
input2VisuWriter->Update();
outputVisuWriter->Update();
// Figure \ref{fig:MADCHDET} shows the
// results of Multivariate Alteration Detector applied to a pair of
// SPOT5 images before and after a flooding event.
// \begin{figure}
// \center \includegraphics[width=0.32\textwidth]{mad-input1.eps}
// \includegraphics[width=0.32\textwidth]{mad-input2.eps}
// \includegraphics[width=0.32\textwidth]{mad-output.eps}
// \itkcaption[Multivariate Alteration Detection
// Results]{Result of the Multivariate Alteration Detector results on
// SPOT5 data before and after flooding.} \label{fig:MADCHDET}
// \end{figure}
return EXIT_SUCCESS;
}
This example illustrates the class
:doxygen:`MultivariateAlterationDetectorImageFilter`,
which implements the Multivariate Alteration Change Detector
algorithm. This algorihtm allows
performing change detection from a pair multi-band images, including
images with different number of bands or modalities. Its output is
a multi-band image of change maps, each one being unccorrelated
with the remaining. The number of bands of the output image is the
minimum number of bands between the two input images.
The algorithm works as follows. It tries to find two linear
combinations of bands (one for each input images) which maximize
correlation, and subtract these two linear combinitation, leading
to the first change map. Then, it looks for a second set of linear
combinations which are orthogonal to the first ones, a which
maximize correlation, and use it as the second change map. This
process is iterated until no more orthogonal linear combinations
can be found.
This algorithms has numerous advantages, such as radiometry scaling
and shifting invariance and absence of parameters, but it can not
be used on a pair of single band images (in this case the output is
simply the difference between the two images).
.. |image1| image:: /Output/mad-input2.png
.. |image2| image:: /Output/mad-output.png
.. _Figure1:
+--------------------------+-------------------------+
| |image1| | |image2| |
+--------------------------+-------------------------+
Result of the Multivariate Alteration Detector results on SPOT5 data before and after flooding.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment