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 29 30 31 32 33 34 35 36 37 38 39 40 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
|
/*=========================================================================
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 "itkMacro.h"
#include "otbImage.h"
#include "otbImageFileReader.h"
// Software Guide : BeginCommandLineArgs
// 1 1
// Software Guide : EndCommandLineArgs
// Software Guide : BeginLatex
//
// The complex moments can be computed on images, but sometimes we are
// interested in computing them on shapes extracted from images by
// segmentation algorithms. These shapes can be represented by
// \doxygen{itk}{Path}s. This example illustrates the use of the
// \doxygen{otb}{ComplexMomentPathFunction} for the computation of
// complex geometric moments on ITK paths.
//
// The first step required to use this filter is to include its header file.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
#include "otbComplexMomentPathFunction.h"
// Software Guide : EndCodeSnippet
#include "itkPolyLineParametricPath.h"
int main(int argc, char * argv[])
{
if (argc != 3)
{
std::cerr << "Usage: " << argv[0];
std::cerr << " p q" << std::endl;
return EXIT_FAILURE;
}
unsigned int P((unsigned char) ::atoi(argv[1]));
unsigned int Q((unsigned char) ::atoi(argv[2]));
// Software Guide : BeginLatex
//
// The \doxygen{otb}{ComplexMomentPathFunction} is templated over the
// input path type and the output complex type value, so we start by
// defining:
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
const unsigned int Dimension = 2;
typedef itk::PolyLineParametricPath<Dimension> PathType;
typedef std::complex<double> ComplexType;
typedef otb::ComplexMomentPathFunction<PathType, ComplexType> CMType;
CMType::Pointer cmFunction = CMType::New();
// Software Guide : EndCodeSnippet
PathType::Pointer path = PathType::New();
path->Initialize();
typedef PathType::ContinuousIndexType ContinuousIndexType;
ContinuousIndexType cindex;
// Draw a square:
path->Initialize();
cindex[0] = 30;
cindex[1] = 30;
path->AddVertex(cindex);
cindex[0] = 30;
cindex[1] = 130;
path->AddVertex(cindex);
cindex[0] = 130;
cindex[1] = 130;
path->AddVertex(cindex);
cindex[0] = 130;
cindex[1] = 30;
path->AddVertex(cindex);
// Software Guide : BeginLatex
//
// Next, we set the parameters of the plug the input path into the complex moment function
// and we set its parameters.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
cmFunction->SetInputPath(path);
cmFunction->SetQ(Q);
cmFunction->SetP(P);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
// Since the paths are defined in physical coordinates, we do not
// need to set the center for the moment computation as we did
// with the \doxygen{otb}{ComplexMomentImageFunction}. The same
// applies for the size of the neighborhood around the
// center pixel for the moment computation. The moment computation
// is triggered by calling the \code{Evaluate} method.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
ComplexType Result = cmFunction->Evaluate();
std::cout << "The moment of order (" << P << "," << Q <<
") is equal to " << Result << std::endl;
// Software Guide : EndCodeSnippet
return EXIT_SUCCESS;
}
|