ITK  5.1.0
Insight Toolkit
itkRecursiveSeparableImageFilter.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkRecursiveSeparableImageFilter_h
19 #define itkRecursiveSeparableImageFilter_h
20 
21 #include "itkInPlaceImageFilter.h"
22 #include "itkNumericTraits.h"
24 
25 namespace itk
26 {
50 template <typename TInputImage, typename TOutputImage = TInputImage>
51 class ITK_TEMPLATE_EXPORT RecursiveSeparableImageFilter : public InPlaceImageFilter<TInputImage, TOutputImage>
52 {
53 public:
54  ITK_DISALLOW_COPY_AND_ASSIGN(RecursiveSeparableImageFilter);
55 
61 
64 
66  using InputImagePointer = typename TInputImage::Pointer;
67  using InputImageConstPointer = typename TInputImage::ConstPointer;
68 
74  using InputPixelType = typename TInputImage::PixelType;
77 
79 
81  using InputImageType = TInputImage;
82 
84  using OutputImageType = TOutputImage;
85 
87  itkGetConstMacro(Direction, unsigned int);
88 
90  itkSetMacro(Direction, unsigned int);
91 
93  void
94  SetInputImage(const TInputImage *);
95 
97  const TInputImage *
98  GetInputImage();
99 
100 protected:
102  ~RecursiveSeparableImageFilter() override = default;
103  void
104  PrintSelf(std::ostream & os, Indent indent) const override;
105 
106  void
107  BeforeThreadedGenerateData() override;
108 
109  void
110  GenerateData() override;
111 
112  void
113  DynamicThreadedGenerateData(const OutputImageRegionType &) override;
114 
123  void
124  EnlargeOutputRequestedRegion(DataObject * output) override;
125 
130  virtual void
131  SetUp(ScalarRealType spacing) = 0;
132 
139  void
140  FilterDataArray(RealType * outs, const RealType * data, RealType * scratch, SizeValueType ln) const;
141 
142 protected:
148 
156 
162 
169 
174 
175 
176  template <typename T1, typename T2>
177  static inline void
178  MathEMAMAMAM(T1 & out,
179  const T1 & a1,
180  const T2 & b1,
181  const T1 & a2,
182  const T2 & b2,
183  const T1 & a3,
184  const T2 & b3,
185  const T1 & a4,
186  const T2 & b4)
187  {
188  out = a1 * b1 + a2 * b2 + a3 * b3 + a4 * b4;
189  }
190 
191 
192  template <typename T1, typename T2>
193  static inline void
195  const VariableLengthVector<T1> & a1,
196  const T2 & b1,
197  const VariableLengthVector<T1> & a2,
198  const T2 & b2,
199  const VariableLengthVector<T1> & a3,
200  const T2 & b3,
201  const VariableLengthVector<T1> & a4,
202  const T2 & b4)
203  {
204  const unsigned int sz = a1.GetSize();
205  if (sz != out.GetSize())
206  {
207  out.SetSize(sz);
208  }
209  for (unsigned int i = 0; i < sz; ++i)
210  {
211  out[i] = a1[i] * b1 + a2[i] * b2 + a3[i] * b3 + a4[i] * b4;
212  }
213  }
214 
215  template <typename T1, typename T2>
216  static inline void
217  MathSMAMAMAM(T1 & out,
218  const T1 & a1,
219  const T2 & b1,
220  const T1 & a2,
221  const T2 & b2,
222  const T1 & a3,
223  const T2 & b3,
224  const T1 & a4,
225  const T2 & b4)
226  {
227  out -= a1 * b1 + a2 * b2 + a3 * b3 + a4 * b4;
228  }
229 
230  template <typename T1, typename T2>
231  static inline void
233  const VariableLengthVector<T1> & a1,
234  const T2 & b1,
235  const VariableLengthVector<T1> & a2,
236  const T2 & b2,
237  const VariableLengthVector<T1> & a3,
238  const T2 & b3,
239  const VariableLengthVector<T1> & a4,
240  const T2 & b4)
241  {
242  const unsigned int sz = a1.GetSize();
243  if (sz != out.GetSize())
244  {
245  out.SetSize(sz);
246  }
247  for (unsigned int i = 0; i < sz; ++i)
248  {
249  out[i] -= a1[i] * b1 + a2[i] * b2 + a3[i] * b3 + a4[i] * b4;
250  }
251  }
252 
253 private:
256  unsigned int m_Direction{ 0 };
257 };
258 } // end namespace itk
259 
260 #ifndef ITK_MANUAL_INSTANTIATION
261 # include "itkRecursiveSeparableImageFilter.hxx"
262 #endif
263 
264 #endif
itk::RecursiveSeparableImageFilter::ScalarRealType
typename NumericTraits< InputPixelType >::ScalarRealType ScalarRealType
Definition: itkRecursiveSeparableImageFilter.h:76
itk::RecursiveSeparableImageFilter::m_BN2
ScalarRealType m_BN2
Definition: itkRecursiveSeparableImageFilter.h:166
itk::RecursiveSeparableImageFilter::m_N3
ScalarRealType m_N3
Definition: itkRecursiveSeparableImageFilter.h:147
itk::RecursiveSeparableImageFilter::m_BM2
ScalarRealType m_BM2
Definition: itkRecursiveSeparableImageFilter.h:171
itk::RecursiveSeparableImageFilter::MathEMAMAMAM
static void MathEMAMAMAM(VariableLengthVector< T1 > &out, const VariableLengthVector< T1 > &a1, const T2 &b1, const VariableLengthVector< T1 > &a2, const T2 &b2, const VariableLengthVector< T1 > &a3, const T2 &b3, const VariableLengthVector< T1 > &a4, const T2 &b4)
Definition: itkRecursiveSeparableImageFilter.h:194
itk::RecursiveSeparableImageFilter::m_N1
ScalarRealType m_N1
Definition: itkRecursiveSeparableImageFilter.h:145
itk::RecursiveSeparableImageFilter::m_BN4
ScalarRealType m_BN4
Definition: itkRecursiveSeparableImageFilter.h:168
itk::RecursiveSeparableImageFilter::m_D4
ScalarRealType m_D4
Definition: itkRecursiveSeparableImageFilter.h:155
itk::RecursiveSeparableImageFilter::m_N0
ScalarRealType m_N0
Definition: itkRecursiveSeparableImageFilter.h:144
itk::InPlaceImageFilter
Base class for filters that take an image as input and overwrite that image as the output.
Definition: itkInPlaceImageFilter.h:77
itkVariableLengthVector.h
itk::VariableLengthVector::SetSize
void SetSize(unsigned int sz, TReallocatePolicy reallocatePolicy, TKeepValuesPolicy keepValues)
itk::VariableLengthVector::GetSize
unsigned int GetSize() const
Definition: itkVariableLengthVector.h:597
itk::RecursiveSeparableImageFilter::m_M3
ScalarRealType m_M3
Definition: itkRecursiveSeparableImageFilter.h:160
itk::SmartPointer< Self >
itk::RecursiveSeparableImageFilter
Base class for recursive convolution with a kernel.
Definition: itkRecursiveSeparableImageFilter.h:51
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::RecursiveSeparableImageFilter::m_D2
ScalarRealType m_D2
Definition: itkRecursiveSeparableImageFilter.h:153
itk::RecursiveSeparableImageFilter::m_M2
ScalarRealType m_M2
Definition: itkRecursiveSeparableImageFilter.h:159
itk::ImageSource
Base class for all process objects that output image data.
Definition: itkImageSource.h:67
itk::ImageToImageFilter::InputImagePointer
typename InputImageType::Pointer InputImagePointer
Definition: itkImageToImageFilter.h:130
itk::RecursiveSeparableImageFilter::m_BM3
ScalarRealType m_BM3
Definition: itkRecursiveSeparableImageFilter.h:172
itk::GTest::TypedefsAndConstructors::Dimension2::RegionType
ImageBaseType::RegionType RegionType
Definition: itkGTestTypedefsAndConstructors.h:54
itk::ImageToImageFilter::InputImageType
TInputImage InputImageType
Definition: itkImageToImageFilter.h:129
itk::VariableLengthVector
Represents an array whose length can be defined at run-time.
Definition: itkConstantBoundaryCondition.h:28
itk::NumericTraits
Define additional traits for native types such as int or float.
Definition: itkNumericTraits.h:58
itk::RecursiveSeparableImageFilter::InputPixelType
typename TInputImage::PixelType InputPixelType
Definition: itkRecursiveSeparableImageFilter.h:74
itk::ImageSource::OutputImageRegionType
typename OutputImageType::RegionType OutputImageRegionType
Definition: itkImageSource.h:92
itk::RecursiveSeparableImageFilter::m_BN3
ScalarRealType m_BN3
Definition: itkRecursiveSeparableImageFilter.h:167
itk::RecursiveSeparableImageFilter::m_M1
ScalarRealType m_M1
Definition: itkRecursiveSeparableImageFilter.h:158
itk::RecursiveSeparableImageFilter::m_D3
ScalarRealType m_D3
Definition: itkRecursiveSeparableImageFilter.h:154
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkArray.h:26
itk::RecursiveSeparableImageFilter::MathSMAMAMAM
static void MathSMAMAMAM(VariableLengthVector< T1 > &out, const VariableLengthVector< T1 > &a1, const T2 &b1, const VariableLengthVector< T1 > &a2, const T2 &b2, const VariableLengthVector< T1 > &a3, const T2 &b3, const VariableLengthVector< T1 > &a4, const T2 &b4)
Definition: itkRecursiveSeparableImageFilter.h:232
itkInPlaceImageFilter.h
itk::ProcessObject
The base class for all process objects (source, filters, mappers) in the Insight data processing pipe...
Definition: itkProcessObject.h:138
itk::RecursiveSeparableImageFilter::m_BM1
ScalarRealType m_BM1
Definition: itkRecursiveSeparableImageFilter.h:170
itk::RecursiveSeparableImageFilter::m_BM4
ScalarRealType m_BM4
Definition: itkRecursiveSeparableImageFilter.h:173
itk::RecursiveSeparableImageFilter::m_D1
ScalarRealType m_D1
Definition: itkRecursiveSeparableImageFilter.h:152
itk::RecursiveSeparableImageFilter::MathSMAMAMAM
static void MathSMAMAMAM(T1 &out, const T1 &a1, const T2 &b1, const T1 &a2, const T2 &b2, const T1 &a3, const T2 &b3, const T1 &a4, const T2 &b4)
Definition: itkRecursiveSeparableImageFilter.h:217
itkNumericTraits.h
itk::RecursiveSeparableImageFilter::m_M4
ScalarRealType m_M4
Definition: itkRecursiveSeparableImageFilter.h:161
itk::RecursiveSeparableImageFilter::m_BN1
ScalarRealType m_BN1
Definition: itkRecursiveSeparableImageFilter.h:165
itk::RecursiveSeparableImageFilter::MathEMAMAMAM
static void MathEMAMAMAM(T1 &out, const T1 &a1, const T2 &b1, const T1 &a2, const T2 &b2, const T1 &a3, const T2 &b3, const T1 &a4, const T2 &b4)
Definition: itkRecursiveSeparableImageFilter.h:178
itk::ImageToImageFilter::InputImageConstPointer
typename InputImageType::ConstPointer InputImageConstPointer
Definition: itkImageToImageFilter.h:131
itk::SizeValueType
unsigned long SizeValueType
Definition: itkIntTypes.h:83
itk::RecursiveSeparableImageFilter::RealType
typename NumericTraits< InputPixelType >::RealType RealType
Definition: itkRecursiveSeparableImageFilter.h:75
itk::ImageSource::OutputImageType
TOutputImage OutputImageType
Definition: itkImageSource.h:90
itk::DataObject
Base class for all data objects in ITK.
Definition: itkDataObject.h:293
itk::RecursiveSeparableImageFilter::m_N2
ScalarRealType m_N2
Definition: itkRecursiveSeparableImageFilter.h:146