otbResetMarginFilter.h 5.03 KB
Newer Older
1
/*
Luc Hermitte's avatar
Luc Hermitte committed
2
 * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES)
3
4
5
 *
 * This file is part of Orfeo Toolbox
 *
Luc Hermitte's avatar
Luc Hermitte committed
6
 *     https://www.orfeo-toolbox.org/
7
 *
Luc Hermitte's avatar
Luc Hermitte committed
8
 * Licensed under the Apache License, Version 2.0 (the "License");
9
10
11
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
Luc Hermitte's avatar
Luc Hermitte committed
12
 *     http://www.apache.org/licenses/LICENSE-2.0
13
14
15
16
17
18
19
20
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

21
22
#ifndef otbResetMarginFilter_h
#define otbResetMarginFilter_h
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

#include "itkImageToImageFilter.h"

namespace otb
{
/**
 * Region clamping filter.
 * This filter is a kind of ROI pass filter. Data within the ROI is kept with
 * its original value. Data outside ROI is forced to 0.
 *
 * Also, this filter propagate the exact ROI upstream in the pipeline. This
 * way, if it's piped after another filter, the upstream filter isn't executed
 * on the data outside the ROI.
 *
 * \tparam TImage  Image type.
 * \sa `otb::ExtractROI<>`
 * \author Luc Hermitte (CS Group)
 * \copyright CNES
 */
template <typename TImage>
43
class ResetMarginFilter : public itk::ImageToImageFilter<TImage, TImage>
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
public:

  /**\name Convenient typedefs for simplifying declarations */
  //@{
  using InputImageType  = TImage;
  using OutputImageType = TImage;
  //@}

  /**\name Extract dimension from input and output images */
  //@{
  itkStaticConstMacro(InputImageDimension, unsigned int, InputImageType::ImageDimension);
  itkStaticConstMacro(OutputImageDimension, unsigned int, OutputImageType::ImageDimension);
  //@}
  /**\name Standard class typedefs */
  //@{
60
  using Self            = ResetMarginFilter;
61
62
63
64
65
66
67
68
69
  using Superclass      = itk::ImageToImageFilter<InputImageType, OutputImageType>;
  using Pointer         = itk::SmartPointer<Self>;
  using ConstPointer    = itk::SmartPointer<const Self>;
  //@}

  /** Method for creation through the object factory. */
  itkNewMacro(Self);

  /** Run-time type information (and related methods). */
70
  itkTypeMacro(ResetMarginFilter, unused);
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

  /**\name Image typedef support */
  //@{
  using InputPixelType        = typename InputImageType::PixelType;
  using OutputPixelType       = typename OutputImageType::PixelType;
  using InputRealType         = typename itk::NumericTraits<InputPixelType>::RealType;
  using InputImageRegionType  = typename InputImageType::RegionType;
  using OutputImageRegionType = typename OutputImageType::RegionType;
  using InputIndexType        = typename InputImageType::IndexType;
  using InputSizeType         = typename InputImageType::SizeType;
  using OutputIndexType       = typename OutputImageType::IndexType;
  using OutputSizeType        = typename OutputImageType::SizeType;

  static_assert(InputImageDimension == OutputImageDimension, "Images have the same number of components");
   //@}

  /** Column threshold setter. */
  void SetThresholdX(long threshold) noexcept
  { m_thresholdX = threshold; }
  /** Column threshold getter. */
  long GetThresholdX() const noexcept
  { return m_thresholdX;}

  /** Top line threshold setter. */
  void SetThresholdYtop(long threshold) noexcept
  { m_thresholdYtop = threshold; }
  /** Top line threshold getter. */
  long GetThresholdYtop() const noexcept
  { return m_thresholdYtop;}

  /** Bottom line threshold setter. */
  void SetThresholdYbot(long threshold) noexcept
  { m_thresholdYbot = threshold; }
  /** Bottom line threshold getter. */
  long GetThresholdYbot() const noexcept
  { return m_thresholdYbot;}

protected:
  /// Hidden constructor
110
  ResetMarginFilter() = default;
111
112
113
114

  InputImageType      * GetInputImage()       { return const_cast<InputImageType*>(this->GetInput()); }
  InputImageType const* GetInputImage() const { return this->GetInput(); }

115
  /** otbResetMarginFilter doesn't need an input requested region as large as the
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
   * output requested region.
   * \sa ImageToImageFilter::GenerateInputRequestedRegion()
   */
  void CallCopyOutputRegionToInputRegion(
      InputImageRegionType       & destRegion,
      OutputImageRegionType const& srcRegion) override
  {
    destRegion = OutputRegionToInputRegion(srcRegion);
  }

  /**
   * Functional implementation of `CallCopyOutputRegionToInputRegion()`.
   */
  InputImageRegionType OutputRegionToInputRegion(
      OutputImageRegionType const& srcRegion);

  /**
   * Main computation function called by each thread.
   * \param[in] outputRegionForThread  Specified output region to compute
   * \param[in] threadId               Id of the computing threads
   */
  void ThreadedGenerateData(
      OutputImageRegionType const& outputRegionForThread,
      itk::ThreadIdType            threadId) override;

private:
  long m_thresholdX    = 0;
  long m_thresholdYtop = 0;
  long m_thresholdYbot = 0;
};

} // otb namespace

#ifndef OTB_MANUAL_INSTANTIATION
150
#include "otbResetMarginFilter.hxx"
151
152
#endif

153
#endif  // otbResetMarginFilter_h