18 #ifndef itkMultiphaseFiniteDifferenceImageFilter_h
19 #define itkMultiphaseFiniteDifferenceImageFilter_h
23 #include "vnl/vnl_vector.h"
157 template <
typename TInputImage,
158 typename TFeatureImage,
159 typename TOutputImage,
160 typename TFiniteDifferenceFunction = FiniteDifferenceFunction<TOutputImage>,
161 typename TIdCell =
unsigned int>
177 static constexpr
unsigned int ImageDimension = TOutputImage::ImageDimension;
218 using TimeStepType =
typename FiniteDifferenceFunctionType::TimeStepType;
220 using RadiusType =
typename FiniteDifferenceFunctionType::RadiusType;
236 if (functionIndex < m_FunctionCount)
238 return (this->m_DifferenceFunctions[functionIndex]);
254 if (functionIndex < m_FunctionCount)
256 this->m_DifferenceFunctions[functionIndex] =
function;
262 itkSetMacro(NumberOfIterations,
unsigned int);
263 itkGetConstReferenceMacro(NumberOfIterations,
unsigned int);
268 itkSetMacro(UseImageSpacing,
bool);
269 itkBooleanMacro(UseImageSpacing);
270 itkGetConstReferenceMacro(UseImageSpacing,
bool);
275 itkSetMacro(MaximumRMSError,
double);
276 itkGetConstReferenceMacro(MaximumRMSError,
double);
281 itkSetMacro(RMSChange,
double);
282 itkGetConstReferenceMacro(RMSChange,
double);
286 itkSetMacro(InitializedState,
bool);
287 itkGetConstReferenceMacro(InitializedState,
bool);
288 itkBooleanMacro(InitializedState);
293 itkSetMacro(ManualReinitialization,
bool);
294 itkGetConstReferenceMacro(ManualReinitialization,
bool);
295 itkBooleanMacro(ManualReinitialization);
299 itkSetMacro(ElapsedIterations,
unsigned int);
302 itkGetConstReferenceMacro(ElapsedIterations,
unsigned int);
308 m_LevelSet[i]->SetRequestedRegion(levelSet->GetRequestedRegion());
309 m_LevelSet[i]->SetBufferedRegion(levelSet->GetBufferedRegion());
310 m_LevelSet[i]->SetLargestPossibleRegion(levelSet->GetLargestPossibleRegion());
311 m_LevelSet[i]->Allocate();
312 m_LevelSet[i]->CopyInformation(levelSet);
320 while (!in.IsAtEnd())
331 if (i >= m_FunctionCount)
333 itkExceptionMacro(
"Request for level set #" << i <<
" but there are only " << m_FunctionCount);
337 return m_LevelSet[i];
344 this->m_Lookup = lookup;
350 this->m_KdTree = kdtree;
358 m_DifferenceFunctions.resize(m_FunctionCount,
nullptr);
363 for (
unsigned int i = 0; i < this->m_FunctionCount; ++i)
366 this->m_DifferenceFunctions[i]->Initialize(radius);
370 m_LevelSet.resize(m_FunctionCount,
nullptr);
373 this->m_Lookup.resize(m_FunctionCount);
378 auto it = this->m_Lookup.begin();
379 auto _end = this->m_Lookup.end();
392 this->m_KdTree =
nullptr;
393 this->m_ElapsedIterations = 0;
396 this->m_UseImageSpacing =
true;
397 this->m_ManualReinitialization =
false;
398 this->m_InitializedState =
false;
400 this->m_FunctionCount = 0;
407 std::vector<InputImagePointer> m_LevelSet{};
411 unsigned int m_ElapsedIterations{};
412 double m_MaximumRMSError{};
413 double m_RMSChange{};
414 unsigned int m_NumberOfIterations{};
417 std::vector<FiniteDifferenceFunctionPointer> m_DifferenceFunctions{};
421 bool m_UseImageSpacing{};
424 PrintSelf(std::ostream & os,
Indent indent)
const override;
428 AllocateUpdateBuffer() = 0;
434 ApplyUpdate(TimeStepType dt) = 0;
442 CalculateChange() = 0;
448 CopyInputToOutput() = 0;
454 GenerateData()
override;
468 GenerateInputRequestedRegion()
override;
508 for (
IdCellType i = 0; i < this->m_FunctionCount; ++i)
510 this->m_DifferenceFunctions[i]->InitializeIteration();
529 ResolveTimeStep(
const TimeStepVectorType & timeStepList,
const std::vector<uint8_t> & valid);
540 bool m_ManualReinitialization{};
543 bool m_InitializedState{};
547 #ifndef ITK_MANUAL_INSTANTIATION
548 # include "itkMultiphaseFiniteDifferenceImageFilter.hxx"