ITK  6.0.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
25namespace itk
26{
43template <typename TImage>
44class ITK_TEMPLATE_EXPORT ShapeKeepNObjectsLabelMapFilter : public InPlaceLabelMapFilter<TImage>
45{
46public:
47 ITK_DISALLOW_COPY_AND_MOVE(ShapeKeepNObjectsLabelMapFilter);
48
54
56 using ImageType = TImage;
59 using PixelType = typename ImageType::PixelType;
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
116protected:
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
Base class for filters that takes an image as input and overwrites that image as the output.
Control indentation during Print() invocation.
Definition: itkIndent.h:50
Light weight base class for most itk classes.
Implements progress tracking for a filter.
Keep N objects according to their shape attributes.
~ShapeKeepNObjectsLabelMapFilter() override=default
typename LabelObjectType::AttributeType AttributeType
void PrintSelf(std::ostream &os, Indent indent) const override
void TemplatedGenerateData(const TAttributeAccessor &)
typename ImageType::LabelObjectType LabelObjectType
SmartPointer< const Self > ConstPointer
SmartPointer< Self > Pointer
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
unsigned long SizeValueType
Definition: itkIntTypes.h:86