File: itkConnectedThresholdImageFilter.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 (206 lines) | stat: -rw-r--r-- 7,589 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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*=========================================================================
 *
 *  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 itkConnectedThresholdImageFilter_h
#define itkConnectedThresholdImageFilter_h

#include "itkImageToImageFilter.h"
#include "itkSimpleDataObjectDecorator.h"
#include "ITKRegionGrowingExport.h"

namespace itk
{
/** \class ConnectedThresholdImageFilterEnums
 * \brief Contains all the enum classes used by the ConnectedThresholdImageFilter class.
 * \ingroup RegionGrowingSegmentation
 * \ingroup ITKRegionGrowing
 */
class ConnectedThresholdImageFilterEnums
{
public:
  /**
   * \class Connectivity
   * \ingroup RegionGrowingSegmentation
   * \ingroup ITKRegionGrowing
   * Face connectivity is 4 connected in 2D, 6  connected in 3D, 2*n   in ND
   * Full connectivity is 8 connected in 2D, 26 connected in 3D, 3^n-1 in ND
   * Default is to use FaceConnectivity.
   */
  enum class Connectivity : uint8_t
  {
    FaceConnectivity,
    FullConnectivity
  };
};

// Define how to print enumeration
extern ITKRegionGrowing_EXPORT std::ostream &
                               operator<<(std::ostream & out, const ConnectedThresholdImageFilterEnums::Connectivity value);
/**
 * \class ConnectedThresholdImageFilter
 * \brief Label pixels that are connected to a seed and lie within a range of values
 *
 * ConnectedThresholdImageFilter labels pixels with ReplaceValue that are
 * connected to an initial Seed AND lie within a Lower and Upper
 * threshold range.
 *
 * \ingroup RegionGrowingSegmentation
 * \ingroup ITKRegionGrowing
 * \sphinx
 * \sphinxexample{Segmentation/RegionGrowing/ConnectedComponentsInImage,Connected Components In Image}
 * \endsphinx
 */
template <typename TInputImage, typename TOutputImage>
class ITK_TEMPLATE_EXPORT ConnectedThresholdImageFilter : public ImageToImageFilter<TInputImage, TOutputImage>
{
public:
  ITK_DISALLOW_COPY_AND_MOVE(ConnectedThresholdImageFilter);

  /** Standard class type aliases. */
  using Self = ConnectedThresholdImageFilter;
  using Superclass = ImageToImageFilter<TInputImage, TOutputImage>;
  using Pointer = SmartPointer<Self>;
  using ConstPointer = SmartPointer<const Self>;

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

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

  using InputImageType = TInputImage;
  using InputImagePointer = typename InputImageType::Pointer;
  using InputImageConstPointer = typename InputImageType::ConstPointer;
  using InputImageRegionType = typename InputImageType::RegionType;
  using InputImagePixelType = typename InputImageType::PixelType;
  using IndexType = typename InputImageType::IndexType;
  using SeedContainerType = typename std::vector<IndexType>;
  using SizeType = typename InputImageType::SizeType;

  using OutputImageType = TOutputImage;
  using OutputImagePointer = typename OutputImageType::Pointer;
  using OutputImageRegionType = typename OutputImageType::RegionType;
  using OutputImagePixelType = typename OutputImageType::PixelType;

  void
  PrintSelf(std::ostream & os, Indent indent) const override;

  /** Set seed point. */
  void
  SetSeed(const IndexType & seed);

  void
  AddSeed(const IndexType & seed);

  /** Clear the seed list. */
  void
  ClearSeeds();

  /** Method to access seed container. */
  virtual const SeedContainerType &
  GetSeeds() const;

  /** Set/Get value to replace thresholded pixels. Pixels that lie *
   *  within Lower and Upper (inclusive) will be replaced with this
   *  value. The default is 1. */
  itkSetMacro(ReplaceValue, OutputImagePixelType);
  itkGetConstMacro(ReplaceValue, OutputImagePixelType);

  /** Type of DataObjects to use for scalar inputs */
  using InputPixelObjectType = SimpleDataObjectDecorator<InputImagePixelType>;

  /** Set Upper and Lower Threshold inputs as values */
  virtual void SetUpper(InputImagePixelType);
  virtual void SetLower(InputImagePixelType);

  /** Set Threshold inputs that are connected to the pipeline */
  virtual void
  SetUpperInput(const InputPixelObjectType *);
  virtual void
  SetLowerInput(const InputPixelObjectType *);

  /** Get Upper and Lower Threshold inputs as values. */
  virtual InputImagePixelType
  GetUpper() const;
  virtual InputImagePixelType
  GetLower() const;

  /** Get Threshold inputs that are connected to the pipeline. */
  virtual InputPixelObjectType *
  GetUpperInput();
  virtual InputPixelObjectType *
  GetLowerInput();

  /** Image dimension constants. */
  static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension;
  static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension;

#ifdef ITK_USE_CONCEPT_CHECKING
  // Begin concept checking
  itkConceptMacro(OutputEqualityComparableCheck, (Concept::EqualityComparable<OutputImagePixelType>));
  itkConceptMacro(InputEqualityComparableCheck, (Concept::EqualityComparable<InputImagePixelType>));
  itkConceptMacro(InputConvertibleToOutputCheck, (Concept::Convertible<InputImagePixelType, OutputImagePixelType>));
  itkConceptMacro(SameDimensionCheck, (Concept::SameDimension<InputImageDimension, OutputImageDimension>));
  itkConceptMacro(IntConvertibleToInputCheck, (Concept::Convertible<int, InputImagePixelType>));
  itkConceptMacro(OutputOStreamWritableCheck, (Concept::OStreamWritable<OutputImagePixelType>));
  // End concept checking
#endif

  using ConnectivityEnum = ConnectedThresholdImageFilterEnums::Connectivity;
#if !defined(ITK_LEGACY_REMOVE)
  using ConnectivityEnumType = ConnectedThresholdImageFilterEnums::Connectivity;
  /**Exposes enums values for backwards compatibility*/
  static constexpr ConnectedThresholdImageFilterEnums::Connectivity FaceConnectivity =
    ConnectedThresholdImageFilterEnums::Connectivity::FaceConnectivity;
  static constexpr ConnectedThresholdImageFilterEnums::Connectivity FullConnectivity =
    ConnectedThresholdImageFilterEnums::Connectivity::FullConnectivity;
#endif

  /** Type of connectivity to use (fully connected OR 4(2D), 6(3D),
   * 2*N(ND) connectivity). */
  itkSetEnumMacro(Connectivity, ConnectedThresholdImageFilterEnums::Connectivity);
  itkGetEnumMacro(Connectivity, ConnectedThresholdImageFilterEnums::Connectivity);

protected:
  ConnectedThresholdImageFilter();
  ~ConnectedThresholdImageFilter() override = default;

  // Override since the filter needs all the data for the algorithm.
  void
  GenerateInputRequestedRegion() override;

  // Override since the filter produces the entire dataset.
  void
  EnlargeOutputRequestedRegion(DataObject * output) override;

  void
  GenerateData() override;

private:
  SeedContainerType m_Seeds{};

  OutputImagePixelType m_ReplaceValue{};

  ConnectedThresholdImageFilterEnums::Connectivity m_Connectivity{ ConnectivityEnum::FaceConnectivity };
};
} // end namespace itk

#ifndef ITK_MANUAL_INSTANTIATION
#  include "itkConnectedThresholdImageFilter.hxx"
#endif

#endif