18 #ifndef itkShapeKeepNObjectsLabelMapFilter_h
19 #define itkShapeKeepNObjectsLabelMapFilter_h
44 template <
typename TImage>
67 static constexpr
unsigned int ImageDimension = TImage::ImageDimension;
75 #ifdef ITK_USE_CONCEPT_CHECKING
91 itkSetMacro(ReverseOrdering,
bool);
92 itkGetConstReferenceMacro(ReverseOrdering,
bool);
93 itkBooleanMacro(ReverseOrdering);
114 this->SetAttribute(LabelObjectType::GetAttributeFromName(s));
122 GenerateData()
override;
124 template <
typename TAttributeAccessor>
129 this->AllocateOutputs();
132 ImageType * output2 = this->GetOutput(1);
136 output2->SetBackgroundValue(output->GetBackgroundValue());
138 using LabelObjectPointer =
typename LabelObjectType::Pointer;
139 using VectorType = std::vector<LabelObjectPointer>;
145 labelObjects.reserve(output->GetNumberOfLabelObjects());
146 typename ImageType::Iterator it(output);
147 while (!it.IsAtEnd())
149 labelObjects.push_back(it.GetLabelObject());
150 progress.CompletedPixel();
155 if (m_NumberOfObjects < output->GetNumberOfLabelObjects())
157 auto end = labelObjects.begin() + m_NumberOfObjects;
158 if (m_ReverseOrdering)
161 std::nth_element(labelObjects.begin(), end, labelObjects.end(), comparator);
166 std::nth_element(labelObjects.begin(), end, labelObjects.end(), comparator);
168 progress.CompletedPixel();
171 for (
typename VectorType::const_iterator it2 = end; it2 != labelObjects.end(); it2++)
173 output2->AddLabelObject(*it2);
174 output->RemoveLabelObject(*it2);
175 progress.CompletedPixel();
181 PrintSelf(std::ostream & os,
Indent indent)
const override;
190 #ifndef ITK_MANUAL_INSTANTIATION
191 # include "itkShapeKeepNObjectsLabelMapFilter.hxx"