File: ComplexMomentPathExample.cxx

package info (click to toggle)
otb 5.8.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 38,496 kB
  • ctags: 40,282
  • sloc: cpp: 306,573; ansic: 3,575; python: 450; sh: 214; perl: 74; java: 72; makefile: 70
file content (134 lines) | stat: -rw-r--r-- 3,822 bytes parent folder | download
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;
}