18 #ifndef itkScanlineFilterCommon_h
19 #define itkScanlineFilterCommon_h
41 template <
typename TInputImage,
typename TOutputImage>
66 if (smartPtr ==
nullptr)
68 smartPtr =
new Self(
nullptr);
98 #ifdef ITK_USE_CONCEPT_CHECKING
149 itkAssertOrThrowMacro(requestedRegion.GetIndex(dim) <= index[dim],
"Index must be within the requested region!");
150 linearIndex += (index[dim] - requestedRegion.GetIndex(dim)) * stride;
151 stride *= requestedRegion.GetSize(dim);
161 typename LineMapType::iterator MapBegin, MapEnd, LineIt;
166 for (LineIt = MapBegin; LineIt != MapEnd; ++LineIt)
169 for (cIt = LineIt->begin(); cIt != LineIt->end(); ++cIt)
192 std::lock_guard<std::mutex> mutexHolder(
m_Mutex);
217 for (
size_t i = 1; i < N; i++)
219 const auto label = static_cast<size_t>(
m_UnionFind[i]);
222 if (consecutiveLabel == backgroundValue)
252 return (diffSum <= 1);
270 bool sameLine = sameLineOffset;
293 mIt = Neighbour.begin();
295 for (cIt = current.begin(); cIt != current.end(); ++cIt)
304 mIt = Neighbour.begin();
307 for (nIt = mIt; nIt != Neighbour.end(); ++nIt)
309 if (!labelCompare || cIt->label != nIt->label)
337 if ((ss1 >= cStart) && (ee2 <= cLast))
344 else if ((ss1 <= cStart) && (ee2 >= cLast))
351 else if ((ss1 <= cLast) && (ee2 >= cLast))
358 else if ((ss1 <= cStart) && (ee2 >= cStart))
368 callback(cIt, nIt, oStart, oLast);
369 if (sameLineOffset && oStart == cStart && oLast == cLast)
376 if (!sameLineOffset && ee1 >= cLast)
403 typename PretendImageType::Pointer fakeImage;
404 fakeImage = PretendImageType::New();
410 PretendSizeType PretendSize;
412 for (
SizeValueType i = 0; i < PretendSize.GetSizeDimension(); i++)
414 PretendSize[i] = OutSize[i + 1];
417 LineRegion.
SetSize(PretendSize);
418 fakeImage->SetRegions(LineRegion);
419 PretendSizeType kernelRadius;
420 kernelRadius.Fill(1);
421 LineNeighborhoodType lnit(kernelRadius, fakeImage, LineRegion);
423 if (wholeNeighborhood)
432 typename LineNeighborhoodType::IndexListType ActiveIndexes;
433 ActiveIndexes = lnit.GetActiveIndexList();
435 typename LineNeighborhoodType::IndexListType::const_iterator LI;
437 PretendIndexType idx = LineRegion.GetIndex();
440 for (LI = ActiveIndexes.begin(); LI != ActiveIndexes.end(); ++LI)
442 m_LineOffsets.push_back(fakeImage->ComputeOffset(idx + lnit.GetOffset(*LI)) - offset);
445 if (wholeNeighborhood)
462 const SizeValueType xsizeForThread = outputRegionForThread.GetSize()[0];
463 const SizeValueType numberOfLines = outputRegionForThread.GetNumberOfPixels() / xsizeForThread;
466 const SizeValueType lastLine = firstLine + numberOfLines - 1;
482 itkAssertInDebugAndIgnoreInReleaseMacro(lastLine >= wud.
lastLine);
493 if (neighIdx >= 0 && neighIdx < linecount && !
m_LineMap[neighIdx].empty())