OTB  9.0.0
Orfeo Toolbox
otbDSFusionOfClassifiersImageFilter.hxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2022 Centre National d'Etudes Spatiales (CNES)
3  *
4  * This file is part of Orfeo Toolbox
5  *
6  * https://www.orfeo-toolbox.org/
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #ifndef otbDSFusionOfClassifiersImageFilter_hxx
22 #define otbDSFusionOfClassifiersImageFilter_hxx
23 
25 #include "itkImageRegionIterator.h"
26 #include "itkProgressReporter.h"
27 
28 #include "itkMetaDataObject.h"
29 #include "otbMetaDataKey.h"
30 
31 #include "otbNoDataHelper.h"
32 
33 namespace otb
34 {
38 template <class TInputImage, class TOutputImage, class TMaskImage>
40 {
41  this->SetNumberOfIndexedInputs(2);
42  this->SetNumberOfRequiredInputs(1);
44 
45  this->m_Universe.clear();
46  this->m_LabelForNoDataPixels = itk::NumericTraits<LabelType>::ZeroValue();
47  this->m_LabelForUndecidedPixels = itk::NumericTraits<LabelType>::ZeroValue();
48 }
49 
50 /* ************************************************************************************************************** */
51 template <class TInputImage, class TOutputImage, class TMaskImage>
53 {
54  this->itk::ProcessObject::SetNthInput(1, const_cast<MaskImageType*>(mask));
55 }
56 
57 template <class TInputImage, class TOutputImage, class TMaskImage>
60 {
61  if (this->GetNumberOfInputs() < 2)
62  {
63  return nullptr;
64  }
65  return static_cast<const MaskImageType*>(this->itk::ProcessObject::GetInput(1));
66 }
67 
68 /* ************************************************************************************************************** */
69 template <class TInputImage, class TOutputImage, class TMaskImage>
71  const VectorOfMapOfMassesOfBeliefType* ptrVectorOfMapOfMassesOfBelief)
72 {
73  this->m_VectorOfMapMOBs = *ptrVectorOfMapOfMassesOfBelief;
74 }
75 
76 template <class TInputImage, class TOutputImage, class TMaskImage>
79 {
80  if (this->GetNumberOfInputs() < 2)
81  {
82  return 0;
83  }
84  return &this->m_VectorOfMapMOBs;
85 }
86 /* ************************************************************************************************************** */
87 
88 template <class TInputImage, class TOutputImage, class TMaskImage>
90 {
91  Superclass::GenerateOutputInformation();
92 
93  // Set the NoData value
94  std::vector<bool> noDataValueAvailable;
95  noDataValueAvailable.push_back(true);
96  std::vector<double> noDataValue;
97  noDataValue.push_back(m_LabelForNoDataPixels);
98 
99  WriteNoDataFlags(noDataValueAvailable, noDataValue, this->GetOutput()->GetImageMetadata());
100 }
101 /* ************************************************************************************************************** */
102 
103 template <class TInputImage, class TOutputImage, class TMaskImage>
105 {
106  // **********************************************
107  // PREPROCESSING
108  // **********************************************
109 
110  m_NumberOfClassifiers = m_VectorOfMapMOBs.size();
111 
112  // *****************************************************************************************************
113  // For each classifier: Definition of the UNIVERSE
114  // *****************************************************************************************************
115  m_VectorOfUniverseMOBs.clear();
116  m_Universe.clear();
117 
118  for (unsigned int itClk = 0; itClk < m_NumberOfClassifiers; ++itClk)
119  {
120  // Map of masses of belief of the itClk^th classifier
121  LabelMassMapType mapMOBsClk = m_VectorOfMapMOBs[itClk];
122 
123  // mobUniverseClk is set to ZERO in order to assure the correct estimation of the Belief Functions of the
124  // complementary sets bel({Ai_}) in the optimized DS combination
125  MassType mobUniverseClk = 0.;
126  // Vector containing the Mass of Belief of the UNIVERSE for each classifier
127  m_VectorOfUniverseMOBs.push_back(mobUniverseClk);
128 
129  // Each label present in the itClk^th classifier is pushed in the UNIVERSE if NOT present in it yet
130  // thus, this->m_Universe = std::map<Label, Number of classifiers containing the label Label> is calculated
131  typename LabelMassMapType::iterator itMapMOBClk;
132  for (itMapMOBClk = mapMOBsClk.begin(); itMapMOBClk != mapMOBsClk.end(); ++itMapMOBClk)
133  {
134  LabelType classLabel = itMapMOBClk->first;
135 
136  // If the current classLabel has already been pushed in the UNIVERSE
137  if (m_Universe.count(classLabel) > 0)
138  {
139  m_Universe[classLabel]++;
140  }
141  else
142  {
143  m_Universe[classLabel] = 1;
144  }
145  }
146  }
147 
148  m_NumberOfClassesInUniverse = m_Universe.size();
149 }
150 
151 
152 template <class TInputImage, class TOutputImage, class TMaskImage>
155 {
156  LabelType outFusedLabelOut = itk::NumericTraits<LabelType>::ZeroValue();
157 
158  /* ************************************************************************************************ */
159  /* ******************************* DS FUSION STEP #1: RECURSIVE METHOD **************************** */
160  /* ************************************************************************************************ */
161 
162  LabelType classLabelk;
163  MassType mLabelSetClk, mLabelSetClk_, mUniverseClk;
164  MassType mLabelSetClkprev, mLabelSetClkprev_, mUniverseClkprev;
165  MassType KClk, mLabelSetClkNew, mLabelSetClkNew_, mUniverseClkNew;
166 
167  LabelMassMapType mapJointMassesStepI, mapJointMassesStepI_, mapJointMassesUniverseStepI;
168  LabelMassMapType mapOfLabelsWithMassOne, mapOfLabelsWithMassZero;
169 
170  // Extracting the masses m(Ai), m(Ai_) and m(OMEGA) for each of the K (= m_NumberOfClassifiers) classifiers
171  // and grouping them according to the {Ai} singletons
172  // (ex: mg(A), mg(B), mg(C),..., with mg(Ai) the joint mass of the masses of classifiers with result Ai for
173  // the pixel vectorPixelValue)
174  for (unsigned int itClk = 0; itClk < m_NumberOfClassifiers; ++itClk)
175  {
176  // Value of the itClk^th classifier {Ai} in the vectorPixelValue
177  classLabelk = vectorPixelValue[itClk]; // label {Ai}
178 
179  if (classLabelk != m_LabelForNoDataPixels)
180  {
181  // Extracting the masses of belief of the three focal elements {Ai}, {Ai_} and OMEGA = {Ai U Ai_} = UNIVERSE
182  // of the k^th classifier itClk
183  mUniverseClk = m_VectorOfUniverseMOBs[itClk]; // MOB_Clk(OMEGA)
184  mLabelSetClk = m_VectorOfMapMOBs[itClk][classLabelk]; // MOB_Clk({Ai})
185  mLabelSetClk_ = 1 - mLabelSetClk - mUniverseClk; // MOB_Clk({Ai_})
186 
187  /*std::cout << "vectorPixelValue[" << itClk << "] = " << classLabelk;
188  std::cout << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk;
189  std::cout << std::endl; */
190 
191 
192  if ((mLabelSetClk > 0) && (mLabelSetClk < 1.0))
193  {
194  if (mapJointMassesStepI.count(classLabelk) == 0)
195  {
196  // If the label {Ai} is NOT present in vectorPixelValue yet: initializations of the three DS combined MOBs
197  mLabelSetClkNew = mLabelSetClk;
198  mLabelSetClkNew_ = mLabelSetClk_;
199  mUniverseClkNew = mUniverseClk;
200  }
201  else
202  {
203  // If the label {Ai} is already present in vectorPixelValue: recursive DS combination of the three MOBs
204  mLabelSetClkprev = mapJointMassesStepI[classLabelk];
205  mLabelSetClkprev_ = mapJointMassesStepI_[classLabelk];
206  mUniverseClkprev = mapJointMassesUniverseStepI[classLabelk];
207 
208  KClk = 1.0 / (1 - mLabelSetClkprev * mLabelSetClk_ - mLabelSetClkprev_ * mLabelSetClk);
209  mLabelSetClkNew = KClk * (mLabelSetClkprev * (mLabelSetClk + mUniverseClk) + mUniverseClkprev * mLabelSetClk);
210  mLabelSetClkNew_ = KClk * (mLabelSetClkprev_ * (mLabelSetClk_ + mUniverseClk) + mUniverseClkprev * mLabelSetClk_);
211  mUniverseClkNew = KClk * mUniverseClkprev * mUniverseClk;
212  }
213 
214  mapJointMassesStepI[classLabelk] = mLabelSetClkNew;
215  mapJointMassesStepI_[classLabelk] = mLabelSetClkNew_;
216  mapJointMassesUniverseStepI[classLabelk] = mUniverseClkNew;
217  } // END if ((mLabelSetClk > 0) && (mLabelSetClk < 1.0))
218  else
219  {
220  if (mLabelSetClk == 1.0)
221  {
222  mapOfLabelsWithMassOne[classLabelk] = mLabelSetClk;
223  }
224  else
225  {
226  if (mLabelSetClk == 0)
227  {
228  mapOfLabelsWithMassZero[classLabelk] = 1.0;
229  }
230  }
231  } // END if ((mLabelSetClk == 0) || (mLabelSetClk == 1.0))
232 
233  } // END if (classLabelk != m_LabelForNoDataPixels)
234  }
235 
236  /* ************************************************************************************************ */
237  /* ************************************************************************************************ */
238  // If ALL the classifiers give the same result, then there is no need to process the DS combination
239  typename LabelMassMapType::iterator itMapMOBClk;
240  if (mapJointMassesStepI.size() == 1)
241  {
242  itMapMOBClk = mapJointMassesStepI.begin();
243  classLabelk = itMapMOBClk->first;
244  return classLabelk;
245  }
246 
247  /* ************************************************************************************************ */
248  /* ************************************************************************************************ */
249  // If at least one classifier returns a label with a mass of belief equal to 1.0, then 2 cases
250  // should be considered:
251  //
252  // -If this label is unique, then this label is considered as the truth, and the output pixel is set
253  // to this label value
254  //
255  // -If this label is NOT unique, then the corresponding classifiers are in conflict and the output
256  // pixel is set to the m_LabelForUndecidedPixels value
257 
258  if (mapOfLabelsWithMassOne.size() > 0)
259  {
260  if (mapOfLabelsWithMassOne.size() == 1)
261  {
262  itMapMOBClk = mapOfLabelsWithMassOne.begin();
263  classLabelk = itMapMOBClk->first;
264  return classLabelk;
265  }
266  else
267  {
268  return m_LabelForUndecidedPixels;
269  }
270  }
271 
272  /* ************************************************************************************************ */
273  /* ************************************************************************************************ */
274  // If ALL the K (= m_NumberOfClassifiers) classifiers of the pixel vectorPixelValue have
275  // masses of belief equal to 0, then the output pixel is set to the m_LabelForUndecidedPixels value
276  if (mapOfLabelsWithMassZero.size() == m_NumberOfClassifiers)
277  {
278  return m_LabelForUndecidedPixels;
279  }
280 
281  /* ************************************************************************************************ */
282  /* ************************************************************************************************ */
283  // If ALL the K (= m_NumberOfClassifiers) classifiers of the pixel vectorPixelValue are
284  // equal to m_LabelForNoDataPixels, then the output pixel is set to the m_LabelForNoDataPixels value
285  if (mapJointMassesStepI.size() == 0)
286  {
287  return m_LabelForNoDataPixels;
288  }
289  /* ************************************************************************************************ */
290  /* ************************************************************************************************ */
291 
292  // std::cout << "*******************************************************************************" << std::endl;
293  // std::cout << std::endl;
294 
295  /* ************************************************************************************************ */
296  /* ******************************* DS FUSION STEP #2: OPTIMIZED METHOD **************************** */
297  /* ************************************************************************************************ */
298 
299  // Calculation of the four constants A, B, C and K
300  MassType A = 0, B = 1, C = 1, K;
301  K = 0; // suppress warning. not sure about default value ??
302  for (itMapMOBClk = mapJointMassesStepI.begin(); itMapMOBClk != mapJointMassesStepI.end(); ++itMapMOBClk)
303  {
304  classLabelk = itMapMOBClk->first;
305 
306  mLabelSetClk = mapJointMassesStepI[classLabelk];
307  mLabelSetClk_ = mapJointMassesStepI_[classLabelk];
308  mUniverseClk = mapJointMassesUniverseStepI[classLabelk];
309 
310  A += (mLabelSetClk / (1 - mLabelSetClk));
311  B *= (1 - mLabelSetClk);
312  C *= mLabelSetClk_;
313 
314  /*std::cout << "****************************************" << std::endl;
315  std::cout << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk << std::endl;
316  std::cout << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_ << std::endl;
317  std::cout << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk << std::endl; */
318  }
319 
320  unsigned int nbClkGroupsStepI = mapJointMassesStepI.size();
321  if (nbClkGroupsStepI == m_NumberOfClassesInUniverse)
322  {
323  K = 1.0 / ((1 + A) * B - C);
324  }
325  else
326  {
327  if (nbClkGroupsStepI < m_NumberOfClassesInUniverse)
328  {
329  K = 1.0 / ((1 + A) * B);
330  }
331  }
332 
333  /*
334  std::cout << "****************************************************************************" << std::endl;
335  std::cout << "****************************************************************************" << std::endl;
336  std::cout << "m_NumberOfClassesInUniverse = " << m_NumberOfClassesInUniverse << std::endl;
337  std::cout << "m_NumberOfClassifiers = " << m_NumberOfClassifiers << std::endl;
338  std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl;
339  std::cout << "****************************************************************************" << std::endl;
340  std::cout << "****************************************************************************" << std::endl; */
341 
342  // Calculation of the Belief functions Bel({Ai}) and Bel({Ai_}) of the singletons {Ai} and {Ai_}
343  LabelMassMapType mapBelStepII, mapBelStepII_;
344  MassType belLabelSetClk, belLabelSetClk_, addBelLabelSetClk = 0.;
345  for (itMapMOBClk = mapJointMassesStepI.begin(); itMapMOBClk != mapJointMassesStepI.end(); ++itMapMOBClk)
346  {
347  classLabelk = itMapMOBClk->first;
348 
349  // Joint Masses of Belief AFTER STEP I (one MOB per singleton class {Ai} in the UNIVERSE)
350  mLabelSetClk = mapJointMassesStepI[classLabelk]; // Joint_MOB_Step_I({Ai})
351  mLabelSetClk_ = mapJointMassesStepI_[classLabelk]; // Joint_MOB_Step_I({Ai_})
352  mUniverseClk = mapJointMassesUniverseStepI[classLabelk]; // Joint_MOB_Step_I(OMEGA)
353 
354  // Bel({Ai})
355  if ((nbClkGroupsStepI == m_NumberOfClassesInUniverse) || ((nbClkGroupsStepI == (m_NumberOfClassesInUniverse - 1)) && (K == m_NumberOfClassesInUniverse)))
356  {
357  belLabelSetClk = K * ((mLabelSetClk / (1 - mLabelSetClk)) * B + (mUniverseClk * C / mLabelSetClk_));
358  }
359  else
360  {
361  belLabelSetClk = K * (mLabelSetClk / (1 - mLabelSetClk)) * B;
362  }
363 
364  // Bel({Ai_})
365  belLabelSetClk_ = 1 - belLabelSetClk;
366  /*if (nbClkGroupsStepI == m_NumberOfClassesInUniverse)
367  {
368  belLabelSetClk_ = K * ((A - ((mLabelSetClk - mLabelSetClk_) / (1 - mLabelSetClk))) * B - C);
369  }
370  else
371  {
372  if ((nbClkGroupsStepI < m_NumberOfClassesInUniverse) && (K <= nbClkGroupsStepI))
373  {
374  belLabelSetClk_ = K * (A - ((mLabelSetClk - mLabelSetClk_) / (1 - mLabelSetClk))) * B;
375  }
376  else
377  {
378  belLabelSetClk_ = K * (A - (mLabelSetClk / (1 - mLabelSetClk))) * B;
379  }
380  }*/
381 
382  mapBelStepII[classLabelk] = belLabelSetClk;
383  mapBelStepII_[classLabelk] = belLabelSetClk_;
384  addBelLabelSetClk += belLabelSetClk;
385  } // END Calculation of the Belief functions Bel({Ai}) and Bel({Ai_}) of the singletons {Ai} and {Ai_}
386 
387 
388  // ADJUSTMENT in order to handle the residual MOB = (1 - addBelLabelSetClk) of the other singleton classes {Ai}
389  // of the UNIVERSE which are NOT present in vectorPixelValue.
390  // /!\ N.B.: This adjustment is correct ONLY if ALL the K (= m_NumberOfClassifiers) classifiers have mUniverseClk = 0
391  typename ClassifierHistogramType::iterator itUniverse;
392  for (itUniverse = m_Universe.begin(); itUniverse != m_Universe.end(); ++itUniverse)
393  {
394  classLabelk = itUniverse->first;
395 
396  // For the other singleton classes {Ai} of the UNIVERSE which are NOT present in vectorPixelValue,
397  // Bel({Ai_}) = SUM(m_stepII({Aj})) = SUM(Bel({Aj})) here; with {Aj} ALL the labels present in vectorPixelValue
398  if (mapBelStepII[classLabelk] == 0)
399  {
400  mapBelStepII_[classLabelk] = addBelLabelSetClk;
401  }
402  /*
403  else
404  {
405  // Adjustment: Bel({Ai_}) = m_stepII({Ai_}) + 1 - SUM(m_stepII({Aj})) here;
406  // with {Aj} ALL the labels present in vectorPixelValue
407  mapBelStepII_[classLabelk] += (1 - addBelLabelSetClk);
408  }
409  */
410 
411  /*std::cout << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk] << std::endl;
412  std::cout << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk] << std::endl;
413  std::cout << std::endl; */
414  }
415 
416  // std::cout << "****************************************************************************" << std::endl;
417 
418 
419  /* ***************************************************************************************** */
420  /* ************************************ DECISION PROCESS *********************************** */
421  /* ***************************************************************************************** */
422 
423  // The decision for the DS Fusion is made with the MAXIMAL Belief function:
424  // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj}))
425 
426  MassType fusedDSBelLabelSetClk = 0.; // Here the MAX of Bel({Aj}
427  for (itUniverse = m_Universe.begin(); itUniverse != m_Universe.end(); ++itUniverse)
428  {
429  classLabelk = itUniverse->first;
430 
431  if (itUniverse == m_Universe.begin())
432  {
433  outFusedLabelOut = classLabelk;
434  fusedDSBelLabelSetClk = mapBelStepII[classLabelk];
435  }
436  else
437  {
438  if (mapBelStepII[classLabelk] >= fusedDSBelLabelSetClk)
439  {
440  outFusedLabelOut = classLabelk;
441  fusedDSBelLabelSetClk = mapBelStepII[classLabelk];
442  }
443  }
444  }
445 
446  // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is this->m_LabelForUndecidedPixels
447  for (itUniverse = m_Universe.begin(); itUniverse != m_Universe.end(); ++itUniverse)
448  {
449  classLabelk = itUniverse->first;
450  if ((mapBelStepII[classLabelk] == fusedDSBelLabelSetClk) && (classLabelk != outFusedLabelOut))
451  {
452  outFusedLabelOut = m_LabelForUndecidedPixels;
453  break;
454  }
455  }
456 
457  /*std::cout << "****************************************************************************" << std::endl;
458  std::cout << "outFusedLabelOut = " << outFusedLabelOut << std::endl;
459  std::cout << "Bel(" << outFusedLabelOut << ") = " << fusedDSBelLabelSetClk << std::endl; */
460 
461  return outFusedLabelOut;
462 }
463 
464 
465 template <class TInputImage, class TOutputImage, class TMaskImage>
466 void DSFusionOfClassifiersImageFilter<TInputImage, TOutputImage, TMaskImage>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
467  itk::ThreadIdType threadId)
468 {
469  // Get the input pointers
470  InputImageConstPointerType inputPtr = this->GetInput();
471  MaskImageConstPointerType inputMaskPtr = this->GetInputMask();
472  OutputImagePointerType outputPtr = this->GetOutput();
473 
474  // Progress reporting
475  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
476 
477  // Define iterators
478  typedef itk::ImageRegionConstIterator<InputImageType> InputIteratorType;
479  typedef itk::ImageRegionConstIterator<MaskImageType> MaskIteratorType;
480  typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
481 
482  InputIteratorType inIt(inputPtr, outputRegionForThread);
483  OutputIteratorType outIt(outputPtr, outputRegionForThread);
484 
485  // Eventually iterate on masks
486  MaskIteratorType maskIt;
487  if (inputMaskPtr)
488  {
489  maskIt = MaskIteratorType(inputMaskPtr, outputRegionForThread);
490  maskIt.GoToBegin();
491  }
492 
493  bool validPoint = true;
494 
495  // Walk the part of the image
496  for (inIt.GoToBegin(), outIt.GoToBegin(); !inIt.IsAtEnd() && !outIt.IsAtEnd(); ++inIt, ++outIt)
497  {
498  // Check pixel validity
499  if (inputMaskPtr)
500  {
501  validPoint = maskIt.Get() > 0;
502  ++maskIt;
503  }
504  // If point is valid
505  if (validPoint)
506  {
507  // Over ALL the i components inIt.Get()[i] of the input vector pixel (with i between 0 and m_NumberOfClassifiers)
508  outIt.Set(this->OptimizedDSMassCombination(inIt.Get()));
509  }
510  else
511  {
512  // else, outIt is set to the m_LabelForNoDataPixels value
513  outIt.Set(m_LabelForNoDataPixels);
514  }
515  progress.CompletedPixel();
516  }
517 }
otb::DSFusionOfClassifiersImageFilter::VectorOfMapOfMassesOfBeliefType
std::vector< LabelMassMapType > VectorOfMapOfMassesOfBeliefType
Definition: otbDSFusionOfClassifiersImageFilter.h:105
otb::DSFusionOfClassifiersImageFilter::GetInputMask
const MaskImageType * GetInputMask(void)
otb::DSFusionOfClassifiersImageFilter::LabelType
OutputImageType::PixelType LabelType
Definition: otbDSFusionOfClassifiersImageFilter.h:100
otb::WriteNoDataFlags
void OTBMetadata_EXPORT WriteNoDataFlags(const std::vector< bool > &flags, const std::vector< double > &values, ImageMetadata &imd)
otb::DSFusionOfClassifiersImageFilter::SetInputMapsOfMassesOfBelief
void SetInputMapsOfMassesOfBelief(const VectorOfMapOfMassesOfBeliefType *ptrVectorOfMapOfMassesOfBelief)
otb
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.
Definition: otbJoinContainer.h:32
otbDSFusionOfClassifiersImageFilter.h
otb::DSFusionOfClassifiersImageFilter::BeforeThreadedGenerateData
void BeforeThreadedGenerateData() override
otb::DSFusionOfClassifiersImageFilter::GenerateOutputInformation
void GenerateOutputInformation() override
otb::DSFusionOfClassifiersImageFilter::OptimizedDSMassCombination
const LabelType OptimizedDSMassCombination(PixelType vectorPixelValue)
otbNoDataHelper.h
otb::DSFusionOfClassifiersImageFilter::DSFusionOfClassifiersImageFilter
DSFusionOfClassifiersImageFilter()
otbMetaDataKey.h
otb::DSFusionOfClassifiersImageFilter::ThreadedGenerateData
void ThreadedGenerateData(const OutputImageRegionType &outputRegionForThread, itk::ThreadIdType threadId) override
otb::DSFusionOfClassifiersImageFilter::SetInputMask
void SetInputMask(const MaskImageType *mask)
otb::DSFusionOfClassifiersImageFilter::GetInputMapsOfMassesOfBelief
const VectorOfMapOfMassesOfBeliefType * GetInputMapsOfMassesOfBelief(void)
otb::DSFusionOfClassifiersImageFilter::MaskImageType
TMaskImage MaskImageType
Definition: otbDSFusionOfClassifiersImageFilter.h:92