CorrelChDet.cxx 5.88 KB
 Sébastien Dinot committed Mar 08, 2017 1 /*  Julien Michel committed Jan 14, 2019 2  * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES)  Sébastien Dinot committed Mar 08, 2017 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */  Jordi Inglada committed Jun 09, 2006 20 21 22  #include "otbImageFileReader.h"  23 #include "otbImageFileWriter.h"  Thomas Feuvrier committed Jun 15, 2006 24 #include "otbImage.h"  Jordi Inglada committed Jun 09, 2006 25 26 27 #include "itkShiftScaleImageFilter.h" #include "otbCommandProgressUpdate.h"  Victor Poughon committed Feb 20, 2019 28 29 30 31 /* Example usage: ./CorrelChDet Input/ERSBefore.png Input/ERSAfter.png Output/CorrChDet.tif 15 */  Jordi Inglada committed Jun 30, 2006 32 33  // This example illustrates the class  Jordi Inglada committed Jul 03, 2006 34 // \doxygen{otb}{CorrelationChangeDetector} for detecting changes  Jordi Inglada committed Jun 30, 2006 35 36 37 38 39 40 41 42 43 // between pairs of images. This filter computes the correlation coefficient in // the neighborhood of each pixel of the pair of images to be compared. This // example will use the images shown in // figure ~\ref{fig:CORRCHDETINIM}. These correspond to two ERS acquisitions before and during a flood. // \begin{figure} // \center // \includegraphics[width=0.35\textwidth]{ERSBefore.eps} // \includegraphics[width=0.35\textwidth]{ERSAfter.eps} // \itkcaption[ERS Images for Change Detection]{Images used for the  Emmanuel Christophe committed Dec 06, 2008 44 // change detection. Left: Before the flood. Right: during the flood.}  Jordi Inglada committed Jun 30, 2006 45 46 47 48 49 50 51 // \label{fig:CORRCHDETINIM} // \end{figure} // // We start by including the corresponding header file. #include "otbCorrelationChangeDetector.h"  OTB Bot committed Apr 01, 2010 52 int main(int argc, char* argv[])  Jordi Inglada committed Jun 09, 2006 53 54 {  OTB Bot committed Apr 01, 2010 55  if (argc < 5)  Victor Poughon committed Feb 20, 2019 56  {  Jordi Inglada committed Jun 09, 2006 57  std::cerr << "Usage: " << std::endl;  OTB Bot committed Apr 01, 2010 58 59  std::cerr << argv[0] << " inputImageFile1 inputImageFile2 " << "outputImageFile radius" << std::endl;  Jordi Inglada committed Jun 09, 2006 60  return -1;  Victor Poughon committed Feb 20, 2019 61  }  Jordi Inglada committed Jun 09, 2006 62 63 64 65  // Define the dimension of the images const unsigned int Dimension = 2;  Jordi Inglada committed Jun 30, 2006 66 67 68  // We start by declaring the types for the two input images, the // change image and the image to be stored in a file for visualization.  OTB Bot committed Apr 01, 2010 69 70 71 72 73 74  typedef float InternalPixelType; typedef unsigned char OutputPixelType; typedef otb::Image InputImageType1; typedef otb::Image InputImageType2; typedef otb::Image ChangeImageType; typedef otb::Image OutputImageType;  Emmanuel Christophe committed Dec 06, 2008 75   Jordi Inglada committed Jun 30, 2006 76 77 78 79  // We can now declare the types for the readers. 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  80  // \doxygen{otb}{ImageFileWriter} class.  Jordi Inglada committed Jun 30, 2006 81   Victor Poughon committed Feb 20, 2019 82 83  typedef otb::ImageFileReader ReaderType1; typedef otb::ImageFileReader ReaderType2;  84  typedef otb::ImageFileWriter WriterType;  Emmanuel Christophe committed Dec 06, 2008 85   Jordi Inglada committed Jun 30, 2006 86 87 88 89 90 91  // The change detector will give a response which is normalized // between 0 and 1. Before // saving the image to a file in, for instance, PNG format, we will // rescale the results of the change detection in order to use all // the output pixel type range of values.  Victor Poughon committed Feb 20, 2019 92  typedef itk::ShiftScaleImageFilter RescalerType;  Emmanuel Christophe committed Dec 06, 2008 93   Jordi Inglada committed Jul 03, 2006 94  // The \doxygen{otb}{CorrelationChangeDetector} is templated over  Jordi Inglada committed Jun 30, 2006 95 96  // the types of the two input images and the type of the generated change // image.  Victor Poughon committed Feb 20, 2019 97 98 99  typedef otb::CorrelationChangeDetector FilterType;  Jordi Inglada committed Jun 30, 2006 100  // The different elements of the pipeline can now be instantiated.  Victor Poughon committed Feb 20, 2019 101 102 103 104 105 106 107 108 109  ReaderType1::Pointer reader1 = ReaderType1::New(); ReaderType2::Pointer reader2 = ReaderType2::New(); WriterType::Pointer writer = WriterType::New(); FilterType::Pointer filter = FilterType::New(); RescalerType::Pointer rescaler = RescalerType::New(); const char* inputFilename1 = argv[1]; const char* inputFilename2 = argv[2]; const char* outputFilename = argv[3];  Emmanuel Christophe committed Jun 11, 2007 110  // We set the parameters of the different elements of the pipeline.  Jordi Inglada committed Jun 30, 2006 111   OTB Bot committed Apr 01, 2010 112 113 114  reader1->SetFileName(inputFilename1); reader2->SetFileName(inputFilename2); writer->SetFileName(outputFilename);  Emmanuel Christophe committed Dec 06, 2008 115   OTB Bot committed Apr 01, 2010 116 117  float scale = itk::NumericTraits::max(); rescaler->SetScale(scale);  Emmanuel Christophe committed Dec 06, 2008 118   Emmanuel Christophe committed Jun 11, 2007 119  // The only parameter for this change detector is the radius of  Jordi Inglada committed Jun 30, 2006 120 121  // the window used for computing the correlation coefficient.  OTB Bot committed Apr 01, 2010 122  filter->SetRadius(atoi(argv[4]));  Emmanuel Christophe committed Dec 06, 2008 123   Jordi Inglada committed Jun 30, 2006 124  // We build the pipeline by plugging all the elements together.  Jordi Inglada committed Jun 09, 2006 125   OTB Bot committed Apr 01, 2010 126 127 128 129  filter->SetInput1(reader1->GetOutput()); filter->SetInput2(reader2->GetOutput()); rescaler->SetInput(filter->GetOutput()); writer->SetInput(rescaler->GetOutput());  Jordi Inglada committed Jun 30, 2006 130 131 132 133 134 135 136  // Since the processing time of large images can be long, it is // interesting to monitor the evolution of the computation. In // order to do so, the change detectors can use the // command/observer design pattern. This is easily done by // attaching an observer to the filter.  Jordi Inglada committed Jun 09, 2006 137 138 139 140 141  typedef otb::CommandProgressUpdate CommandType; CommandType::Pointer observer = CommandType::New(); filter->AddObserver(itk::ProgressEvent(), observer);  Emmanuel Christophe committed Dec 06, 2008 142  try  Victor Poughon committed Feb 20, 2019 143  {  Emmanuel Christophe committed Dec 06, 2008 144  writer->Update();  Victor Poughon committed Feb 20, 2019 145  }  OTB Bot committed Apr 01, 2010 146  catch (itk::ExceptionObject& err)  Victor Poughon committed Feb 20, 2019 147  {  Emmanuel Christophe committed Dec 06, 2008 148 149  std::cout << "ExceptionObject caught !" << std::endl; std::cout << err << std::endl;  Jordi Inglada committed Jun 09, 2006 150  return -1;  Victor Poughon committed Feb 20, 2019 151 152 153 154 155 156 157 158 159 160 161  } // Figure \ref{fig:RESCORRCHDET} shows the result of the change // detection by local correlation. // \begin{figure} // \center // \includegraphics[width=0.35\textwidth]{CorrChDet.eps} // \itkcaption[Correlation Change Detection Results]{Result of the // correlation change detector} // \label{fig:RESCORRCHDET} // \end{figure}  Emmanuel Christophe committed Dec 06, 2008 162   Emmanuel Christophe committed Nov 17, 2008 163  return EXIT_SUCCESS;  Jordi Inglada committed Jun 09, 2006 164 }