18 #ifndef itkShapeUniqueLabelMapFilter_h
19 #define itkShapeUniqueLabelMapFilter_h
44 template <
typename TImage>
63 using LineType =
typename LabelObjectType::LineType;
68 static constexpr
unsigned int ImageDimension = TImage::ImageDimension;
76 #ifdef ITK_USE_CONCEPT_CHECKING
92 itkGetConstMacro(ReverseOrdering,
bool);
93 itkSetMacro(ReverseOrdering,
bool);
94 itkBooleanMacro(ReverseOrdering);
106 this->SetAttribute(LabelObjectType::GetAttributeFromName(s));
115 GenerateData()
override;
117 template <
typename TAttributeAccessor>
122 this->AllocateOutputs();
125 using PriorityQueueType =
127 PriorityQueueType priorityQueue;
132 for (
typename ImageType::Iterator it(this->GetLabelMap()); !it.IsAtEnd(); ++it)
137 labelObject->Optimize();
139 typename LabelObjectType::ConstLineIterator lit(labelObject);
140 while (!lit.IsAtEnd())
147 labelObject->Clear();
153 if (priorityQueue.empty())
159 using LinesType =
typename std::deque<LineOfLabelObject>;
162 lines.push_back(priorityQueue.top());
167 while (!priorityQueue.empty())
173 bool newMainLine =
false;
175 for (
unsigned int i = 1; i < ImageDimension; i++)
177 if (idx[i] != prevIdx[i])
193 if (prevIdx[0] + prevLength >= idx[0])
202 typename TAttributeAccessor::AttributeValueType prevAttr = accessor(prev.
labelObject);
203 typename TAttributeAccessor::AttributeValueType attr = accessor(l.
labelObject);
210 keepCurrent = !m_ReverseOrdering;
214 keepCurrent = m_ReverseOrdering;
221 keepCurrent = !m_ReverseOrdering;
225 keepCurrent = m_ReverseOrdering;
236 if (prevIdx[0] + prevLength > idx[0] + length)
242 newIdx[0] = idx[0] + length;
247 prevLength = idx[0] - prevIdx[0];
250 lines.back().line.SetLength(idx[0] - prevIdx[0]);
265 if (prevIdx[0] + prevLength > idx[0] + length)
272 newIdx[0] = prevIdx[0] + prevLength;
274 l.
line.SetIndex(newIdx);
275 l.
line.SetLength(newLength);
289 prevIdx = prev.
line.GetIndex();
293 for (
size_t i = 0; i < lines.size(); ++i)
300 typename ImageType::Iterator it(this->GetLabelMap());
301 while (!it.IsAtEnd())
303 typename LabelObjectType::LabelType label = it.GetLabel();
306 if (labelObject->Empty())
311 this->GetLabelMap()->RemoveLabel(label);
321 PrintSelf(std::ostream & os,
Indent indent)
const override;
329 using LineType =
typename LabelObjectType::LineType;
333 this->labelObject = _lo;
346 for (
int i = ImageDimension - 1; i >= 0; i--)
348 if (lla.
line.GetIndex()[i] > llb.
line.GetIndex()[i])
352 else if (lla.
line.GetIndex()[i] < llb.
line.GetIndex()[i])
363 #ifndef ITK_MANUAL_INSTANTIATION
364 # include "itkShapeUniqueLabelMapFilter.hxx"