File: itkAdaptImageFilter.h

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (185 lines) | stat: -rw-r--r-- 5,735 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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  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.
 *
 *=========================================================================*/
#ifndef itkAdaptImageFilter_h
#define itkAdaptImageFilter_h

#include "itkUnaryFunctorImageFilter.h"

namespace itk
{
namespace Functor
{
/**
 * \class AccessorFunctor
 * \brief Convert an accessor to a functor so that it can be used in a
 * UnaryFunctorImageFilter.
 *
 * AccessorFunctor converts a data accessor to a functor object.  This
 * allows an accessor to be used as functor in a UnaryFunctorImageFilter,
 * BinaryFunctorImageFilter, TernaryFunctorImageFilter, or
 * NaryFunctionImageFilter.
 * \ingroup ITKImageIntensity
 */
template <typename TInput, typename TAccessor>
class AccessorFunctor
{
public:
  /** Standard class type aliases. */
  using Self = AccessorFunctor;
  using AccessorType = TAccessor;

  /** Constructor and destructor. */
  AccessorFunctor()
    : m_Accessor()
  {}
  ~AccessorFunctor() = default;

  /** operator().  This is the "call" method of the functor. */
  using OutputType = typename TAccessor::ExternalType;
  inline OutputType
  operator()(const TInput & A) const
  {
    return m_Accessor.Get(A);
  }

  /** Get the accessor. The accessor is returned by reference. */
  AccessorType &
  GetAccessor()
  {
    return m_Accessor;
  }

  /** Assignment operator */
  AccessorFunctor &
  operator=(const AccessorFunctor & functor)
  {
    m_Accessor = functor.m_Accessor;
    return *this;
  }

  /** Set the accessor object. This replaces the current accessor with
   * a copy of the specified accessor.  This allows the user to
   * specify an accessor that has ivars set differently that the default
   * accessor.
   */
  void
  SetAccessor(AccessorType & accessor)
  {
    m_Accessor = accessor;
  }

  /** Needed to determine if two accessors are the same. */
  bool
  operator==(const Self & other) const
  {
    return m_Accessor == other.m_Accessor;
  }

  ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Self);

private:
  AccessorType m_Accessor;
};
} // namespace Functor

/**
 * \class AdaptImageFilter
 * \brief Convert an image to another pixel type using the specified data accessor.
 *
 * AdaptImageFilter converts an image to another pixel type using a
 * data accessor.  AdaptImageFilter can perform simple cast operations
 * (i.e. short to float) or can extract a subcomponent of a pixel
 * (i.e. extract the green component of an RGB pixel.
 * AdaptImageFilter could also be used for performing simple
 * arithmetic operations at a pixel (i.e. taking the std::sqrt() or std::sin()
 * of a pixel); however, these types of operations could also be
 * accomplished using the itk::UnaryImageFilter.
 *
 * The third template parameter for this filter is a DataAccessor
 * which performs the adaption or conversion of a pixel.  The
 * DataAccessor must provide a method called Get() which takes an
 * input pixel and returns an output pixel.  The input pixel can be
 * passed by reference but the output pixel is frequently returned by
 * value. However, a data accessor that returns a subcomponent of a
 * pixel will usually return that subcomponent by reference. For
 * instance, a data accessor that returns the green component of a RGB
 * pixel will simply return a reference to the proper element of the
 * RGB vector. See itk::DataAccessor for performing simple cast
 * operations.
 *
 * \ingroup IntensityImageFilters  MultiThreaded
 * \ingroup ITKImageIntensity
 */
template <typename TInputImage, typename TOutputImage, typename TAccessor>
class AdaptImageFilter
  : public UnaryFunctorImageFilter<TInputImage,
                                   TOutputImage,
                                   Functor::AccessorFunctor<typename TInputImage::PixelType, TAccessor>>
{
public:
  ITK_DISALLOW_COPY_AND_MOVE(AdaptImageFilter);

  /** Standard class type aliases. */
  using Self = AdaptImageFilter;

  using Superclass = UnaryFunctorImageFilter<TInputImage,
                                             TOutputImage,
                                             Functor::AccessorFunctor<typename TInputImage::PixelType, TAccessor>>;

  using Pointer = SmartPointer<Self>;
  using ConstPointer = SmartPointer<const Self>;
  using typename Superclass::FunctorType;

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

  /** Typedef for the accessor type */
  using AccessorType = TAccessor;

  /** \see LightObject::GetNameOfClass() */
  itkOverrideGetNameOfClassMacro(AdaptImageFilter);

  /** Get the accessor. This is a convenience method so the user */
  AccessorType &
  GetAccessor()
  {
    return this->GetFunctor().GetAccessor();
  }

  /** Set the accessor. This is a convenience method so the user does */
  void
  SetAccessor(AccessorType & accessor)
  {
    FunctorType functor;

    functor = this->GetFunctor();
    if (accessor != functor.GetAccessor())
    {
      functor.SetAccessor(accessor);
      this->SetFunctor(functor);
      this->Modified();
    }
  }

protected:
  AdaptImageFilter() = default;
  ~AdaptImageFilter() override = default;
};
} // end namespace itk

#endif