ITK  5.4.0
Insight Toolkit
itkShapeKeepNObjectsLabelMapFilter.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  * https://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 itkShapeKeepNObjectsLabelMapFilter_h
19 #define itkShapeKeepNObjectsLabelMapFilter_h
20 
23 #include "itkProgressReporter.h"
24 
25 namespace itk
26 {
43 template <typename TImage>
44 class ITK_TEMPLATE_EXPORT ShapeKeepNObjectsLabelMapFilter : public InPlaceLabelMapFilter<TImage>
45 {
46 public:
47  ITK_DISALLOW_COPY_AND_MOVE(ShapeKeepNObjectsLabelMapFilter);
48 
54 
56  using ImageType = TImage;
57  using ImagePointer = typename ImageType::Pointer;
59  using PixelType = typename ImageType::PixelType;
60  using IndexType = typename ImageType::IndexType;
61  using LabelObjectType = typename ImageType::LabelObjectType;
62 
63  using AttributeType = typename LabelObjectType::AttributeType;
64 
66  static constexpr unsigned int ImageDimension = TImage::ImageDimension;
67 
69  itkNewMacro(Self);
70 
72  itkOverrideGetNameOfClassMacro(ShapeKeepNObjectsLabelMapFilter);
73 
74 #ifdef ITK_USE_CONCEPT_CHECKING
75  // Begin concept checking
76 /* itkConceptMacro(InputEqualityComparableCheck,
77  (Concept::EqualityComparable<InputImagePixelType>));
78  itkConceptMacro(IntConvertibleToInputCheck,
79  (Concept::Convertible<int, InputImagePixelType>));
80  itkConceptMacro(InputOStreamWritableCheck,
81  (Concept::OStreamWritable<InputImagePixelType>));*/
82 // End concept checking
83 #endif
84 
90  itkSetMacro(ReverseOrdering, bool);
91  itkGetConstReferenceMacro(ReverseOrdering, bool);
92  itkBooleanMacro(ReverseOrdering);
98  itkSetMacro(NumberOfObjects, SizeValueType);
99  itkGetConstReferenceMacro(NumberOfObjects, SizeValueType);
106  itkGetConstMacro(Attribute, AttributeType);
107  itkSetMacro(Attribute, AttributeType);
110  void
111  SetAttribute(const std::string & s)
112  {
113  this->SetAttribute(LabelObjectType::GetAttributeFromName(s));
114  }
115 
116 protected:
118  ~ShapeKeepNObjectsLabelMapFilter() override = default;
119 
120  void
121  GenerateData() override;
122 
123  template <typename TAttributeAccessor>
124  void
125  TemplatedGenerateData(const TAttributeAccessor &)
126  {
127  // Allocate the output
128  this->AllocateOutputs();
129 
130  ImageType * output = this->GetOutput();
131  ImageType * output2 = this->GetOutput(1);
132 
133  // set the background value for the second output - this is not done in the
134  // superclasses
135  output2->SetBackgroundValue(output->GetBackgroundValue());
136 
137  using LabelObjectPointer = typename LabelObjectType::Pointer;
138  using VectorType = std::vector<LabelObjectPointer>;
139 
140  ProgressReporter progress(this, 0, 2 * output->GetNumberOfLabelObjects());
141 
142  // get the label objects in a vector, so they can be sorted
143  VectorType labelObjects;
144  labelObjects.reserve(output->GetNumberOfLabelObjects());
145  typename ImageType::Iterator it(output);
146  while (!it.IsAtEnd())
147  {
148  labelObjects.push_back(it.GetLabelObject());
149  progress.CompletedPixel();
150  ++it;
151  }
152 
153  // instantiate the comparator and sort the vector
154  if (m_NumberOfObjects < output->GetNumberOfLabelObjects())
155  {
156  auto end = labelObjects.begin() + m_NumberOfObjects;
157  if (m_ReverseOrdering)
158  {
160  std::nth_element(labelObjects.begin(), end, labelObjects.end(), comparator);
161  }
162  else
163  {
165  std::nth_element(labelObjects.begin(), end, labelObjects.end(), comparator);
166  }
167  progress.CompletedPixel();
168 
169  // and remove the last objects of the map
170  for (typename VectorType::const_iterator it2 = end; it2 != labelObjects.end(); ++it2)
171  {
172  output2->AddLabelObject(*it2);
173  output->RemoveLabelObject(*it2);
174  progress.CompletedPixel();
175  }
176  }
177  }
178 
179  void
180  PrintSelf(std::ostream & os, Indent indent) const override;
181 
182  bool m_ReverseOrdering{};
183 
184  SizeValueType m_NumberOfObjects{};
185  AttributeType m_Attribute{};
186 }; // end of class
187 } // end namespace itk
188 
189 #ifndef ITK_MANUAL_INSTANTIATION
190 # include "itkShapeKeepNObjectsLabelMapFilter.hxx"
191 #endif
192 
193 #endif
Pointer
SmartPointer< Self > Pointer
Definition: itkAddImageFilter.h:93
ConstPointer
SmartPointer< const Self > ConstPointer
Definition: itkAddImageFilter.h:94
itk::InPlaceLabelMapFilter
Base class for filters that takes an image as input and overwrites that image as the output.
Definition: itkInPlaceLabelMapFilter.h:83
itk::GTest::TypedefsAndConstructors::Dimension2::VectorType
ImageBaseType::SpacingType VectorType
Definition: itkGTestTypedefsAndConstructors.h:53
itkProgressReporter.h
itk::ShapeKeepNObjectsLabelMapFilter
Keep N objects according to their shape attributes.
Definition: itkShapeKeepNObjectsLabelMapFilter.h:44
itk::Functor::LabelObjectComparator
Definition: itkLabelObjectAccessors.h:65
itk::ShapeKeepNObjectsLabelMapFilter::PixelType
typename ImageType::PixelType PixelType
Definition: itkShapeKeepNObjectsLabelMapFilter.h:59
itk::SmartPointer< Self >
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itkShapeLabelObjectAccessors.h
itk::Functor::LabelObjectReverseComparator
Definition: itkLabelObjectAccessors.h:84
itk::ShapeKeepNObjectsLabelMapFilter::ImageConstPointer
typename ImageType::ConstPointer ImageConstPointer
Definition: itkShapeKeepNObjectsLabelMapFilter.h:58
itk::GTest::TypedefsAndConstructors::Dimension2::IndexType
ImageBaseType::IndexType IndexType
Definition: itkGTestTypedefsAndConstructors.h:50
itk::LightObject
Light weight base class for most itk classes.
Definition: itkLightObject.h:55
itk::ShapeKeepNObjectsLabelMapFilter::TemplatedGenerateData
void TemplatedGenerateData(const TAttributeAccessor &)
Definition: itkShapeKeepNObjectsLabelMapFilter.h:125
itk::ShapeKeepNObjectsLabelMapFilter::AttributeType
typename LabelObjectType::AttributeType AttributeType
Definition: itkShapeKeepNObjectsLabelMapFilter.h:63
itkInPlaceLabelMapFilter.h
itk::ShapeKeepNObjectsLabelMapFilter::ImageType
TImage ImageType
Definition: itkShapeKeepNObjectsLabelMapFilter.h:56
itk::ShapeKeepNObjectsLabelMapFilter::SetAttribute
void SetAttribute(const std::string &s)
Definition: itkShapeKeepNObjectsLabelMapFilter.h:111
itk::ShapeKeepNObjectsLabelMapFilter::IndexType
typename ImageType::IndexType IndexType
Definition: itkShapeKeepNObjectsLabelMapFilter.h:60
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::ShapeKeepNObjectsLabelMapFilter::ImagePointer
typename ImageType::Pointer ImagePointer
Definition: itkShapeKeepNObjectsLabelMapFilter.h:57
itk::ShapeKeepNObjectsLabelMapFilter::LabelObjectType
typename ImageType::LabelObjectType LabelObjectType
Definition: itkShapeKeepNObjectsLabelMapFilter.h:61
itk::ProgressReporter
Implements progress tracking for a filter.
Definition: itkProgressReporter.h:60
itk::SizeValueType
unsigned long SizeValueType
Definition: itkIntTypes.h:83