File: otbImageToNoDataMaskFilter.h

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 (164 lines) | stat: -rw-r--r-- 4,985 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*=========================================================================

  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.

=========================================================================*/
#ifndef otbImageToNoDataMaskFilter_h
#define otbImageToNoDataMaskFilter_h

#include "itkUnaryFunctorImageFilter.h"
#include "itkMetaDataObject.h"
#include "otbMetaDataKey.h"
#include "otbNoDataHelper.h"

namespace otb
{
namespace Functor
{
/** \class NoDataFunctor
 *  \brief Functor used by ImageToNoDataMaskFilter
 *
 *  See ImageToNoDataMaskFilter for complete documentation. 
 *  \ingroup OTBImageManipulation
 */
template <typename TInputPixel, typename TOutputPixel> 
class NoDataFunctor
{
public:
  NoDataFunctor():
    m_Flags(),
    m_Values(),
    m_OutsideValue(0),
    m_InsideValue(1),
    m_NaNIsNoData(false)
  {}
  virtual ~NoDataFunctor(){}

  inline TOutputPixel operator()(const TInputPixel& in) const
  {
    return otb::IsNoData(in,m_Flags,m_Values,m_NaNIsNoData)?m_OutsideValue:m_InsideValue;
  }

  std::vector<bool>   m_Flags;
  std::vector<double> m_Values;
  TOutputPixel        m_OutsideValue;
  TOutputPixel        m_InsideValue;
  bool                m_NaNIsNoData;
};

} // End namespace Functor


/** \class ImageToNoDataMaskFilter 
 *  \brief Builds a no-data mask image from no-data flags and values
 *  
 *  This filter reads the no-data flags (a boolean vector indicating
 *  for each band if a no-data value exists) and values (the actual
 *  value to be used as no-data for each band) from
 *  MetaDataDictionary, and builds a binary mask indicating presence
 *  or absence of no-data for each pixel.
 * 
 *  If NaNIsNoData is true, NaN pixels will also be considered as
 *  no-data pixels.
 * 
 * \ingroup Streamed
 * \ingroup MultiThreaded
 * \ingroup OTBImageManipulation
 */
template <typename TInputImage, typename TOutputImage>
class ImageToNoDataMaskFilter
  : public itk::UnaryFunctorImageFilter<TInputImage,
                                        TOutputImage,
                                        Functor::NoDataFunctor<typename TInputImage::PixelType,
                                                               typename TOutputImage::PixelType> >
{
public:
  typedef Functor::NoDataFunctor<typename TInputImage::PixelType,typename TOutputImage::PixelType> FunctorType;

  typedef ImageToNoDataMaskFilter                           Self;
  typedef itk::UnaryFunctorImageFilter<TInputImage,
                                        TOutputImage,
                                       FunctorType>         Superclass;
  typedef itk::SmartPointer<Self>                           Pointer;
  typedef itk::SmartPointer<const Self>                     ConstPointer;

  /** Type macro */
  itkNewMacro(Self);

  /** Creation through object factory macro */
  itkTypeMacro(SpectralAngleDistanceImageFilter, itk::ImageToImageFilter);

  /**
   * Set inside value of output mask. This value will be used to
   * indicate absence of no-data for the pixel in the output mask
   */ 
  void SetInsideValue(const typename TOutputImage::PixelType & value)
  {
    this->GetFunctor().m_InsideValue = value;
  }
  /**
   * Set outside value of output mask. This value will be used to
   * indicate presence of no-data for the pixel in the output mask
   */ 
  void SetOutsideValue(const typename TOutputImage::PixelType & value)
  {
    this->GetFunctor().m_OutsideValue = value;
  }
  /**
   * Set the NaN is no data flags
   * \param nanIsNoData If true, NaN values will be considered as
   * no-data as well (default is false)
   */
  void SetNaNIsNoData(bool nanIsNoData)
  {
    this->GetFunctor().m_NaNIsNoData=nanIsNoData;
  }

protected:
  ImageToNoDataMaskFilter()
  {}

  ~ImageToNoDataMaskFilter() ITK_OVERRIDE
  {}

  void BeforeThreadedGenerateData() ITK_OVERRIDE
  {
    std::vector<bool> noDataValueAvailable;
    std::vector<double> noDataValues;

    ReadNoDataFlags(this->GetInput()->GetMetaDataDictionary(),noDataValueAvailable,noDataValues);

    // don't pass empty containers to the functor
    if (noDataValueAvailable.empty() || noDataValues.empty())
      {
      const TInputImage* input = this->GetInput();
      noDataValueAvailable.assign(input->GetNumberOfComponentsPerPixel(),false);
      noDataValues.assign(input->GetNumberOfComponentsPerPixel(),0.0);
      }
    
    this->GetFunctor().m_Flags = noDataValueAvailable;
    this->GetFunctor().m_Values = noDataValues;
  }

private:
  ImageToNoDataMaskFilter(const Self&); // purposely not implemented
  void operator =(const Self&); // purposely not implemented
}; 

} // End namespace otb



#endif