File: MajorityVotingFusionOfClassificationMapsExample.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 (133 lines) | stat: -rw-r--r-- 4,152 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
/*=========================================================================

  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.

=========================================================================*/


// Software Guide : BeginLatex
//
// The Majority Voting fusion filter \doxygen{itk}{LabelVotingImageFilter} used is based on ITK.
// For each pixel, it chooses the more frequent class label among the input classification maps.
// In case of not unique more frequent class labels, the output pixel is set to the \emph{undecidedLabel} value.
// We start by including the appropriate header file.
//
// Software Guide : EndLatex


// Software Guide : BeginCodeSnippet
#include "itkLabelVotingImageFilter.h"
// Software Guide : EndCodeSnippet

#include "otbImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"

int main(int argc, char * argv[])
{
// Software Guide : BeginLatex
//
// We will assume unsigned short type input labeled images.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  const unsigned int     Dimension = 2;
  typedef unsigned short LabelPixelType;
// Software Guide : EndCodeSnippet


  LabelPixelType undecidedLabel = atoi(argv[argc - 2]);
  const char * outfname = argv[argc - 1];

  unsigned int nbParameters = 2;
  unsigned int nbClassificationMaps = (argc - 1 - nbParameters);


// Software Guide : BeginLatex
//
// The input labeled images to be fused are expected to be scalar images.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::Image<LabelPixelType, Dimension> LabelImageType;
// Software Guide : EndCodeSnippet


// Software Guide : BeginLatex
//
// The Majority Voting fusion filter \doxygen{itk}{LabelVotingImageFilter} based on ITK is templated
// over the input and output labeled image type.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  // Majority Voting
  typedef itk::LabelVotingImageFilter<LabelImageType, LabelImageType>
                                                             LabelVotingFilterType;
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// Both reader and writer are defined. Since the images
// to classify can be very big, we will use a streamed writer which
// will trigger the streaming ability of the fusion filter.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::ImageFileReader<LabelImageType> ReaderType;
  typedef otb::ImageFileWriter<LabelImageType> WriterType;
// Software Guide : EndCodeSnippet


// Software Guide : BeginLatex
//
// The input classification maps to be fused are pushed into
// the \doxygen{itk}{LabelVotingImageFilter}. Moreover, the
// label value for the undecided pixels (in case of not unique
// majority voting) is set too.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  ReaderType::Pointer reader;
  LabelVotingFilterType::Pointer labelVotingFilter = LabelVotingFilterType::New();
  for (unsigned int itCM = 0; itCM < nbClassificationMaps; ++itCM)
    {
    std::string fileNameClassifiedImage = argv[itCM + 1];

    reader = ReaderType::New();
    reader->SetFileName(fileNameClassifiedImage);
    reader->Update();

    labelVotingFilter->SetInput(itCM, reader->GetOutput());
    }

  labelVotingFilter->SetLabelForUndecidedPixels(undecidedLabel);
// Software Guide : EndCodeSnippet


// Software Guide : BeginLatex
//
// Once it is plugged the pipeline triggers its execution by updating
// the output of the writer.
//
// Software Guide : EndLatex

// Software Guide : BeginCodeSnippet
  WriterType::Pointer writer = WriterType::New();
  writer->SetInput(labelVotingFilter->GetOutput());
  writer->SetFileName(outfname);
  writer->Update();
// Software Guide : EndCodeSnippet
  return EXIT_SUCCESS;
}