template<typename TInputImage, typename TFeatureImage, typename TOutputImage, typename TFiniteDifferenceFunction = FiniteDifferenceFunction<TOutputImage>, typename TIdCell = unsigned int>
class itk::MultiphaseFiniteDifferenceImageFilter< TInputImage, TFeatureImage, TOutputImage, TFiniteDifferenceFunction, TIdCell >
- The Finite Difference Solver Hierarchy
This is an alternate version of the ITK finite difference solver (FDS) framework, supporting the solution of multiple functions, simultaneously. The FDS framework is a set of classes for creating filters to solve partial differential equations on images using an iterative, finite difference update scheme.
- The high-level algorithm implemented by the framework can be described by the following pseudocode.
WHILE NOT convergence:
FOR ALL pixels i
FOR ALL functions f
min_time_step = min(min_time_step, calculate_change(f, i))
FOR ALL functions f
update(f, i, time_step)
- The following equation describes update \(n+1\) at pixel \(i\) on discrete image \( u \) :
- \(u_{\mathbf{i}}^{n+1}=u^n_{\mathbf{i}}+\Delta u^n_{\mathbf{i}}\Delta t\)
- Component objects
- The FDS hierarchy is comprised of two component object types, variations of which are designed to be plugged together to create filters for different applications. At the process level are the "solver" objects, which are subclasses of MultiphaseFiniteDifferenceImageFilter. Solver objects are filters that take image inputs and produce image outputs. Solver objects require a "finite difference function" object to perform the calculation at each image pixel during iteration. These specialized function objects are subclasses of FiniteDifferenceFunction. FiniteDifferenceFunctions take a neighborhood of pixels as input (in the form of an itk::NeighborhoodIterator) and produce a scalar valued result.
- Filters for different applications are created by defining a function object to handle the numerical calculations and choosing (or creating) a solver object that reflects the requirements and constraints of the application. For example, anisotropic diffusion filters are created by plugging anisotropic diffusion functions into the DenseFiniteDifferenceImageFilter2. The separation between function object and solver object allows us to create, for example, sparse-field, dense-field, and narrow-band implementations of a level-set surface evolution filter can all be constructed by plugging the same function object into three different, specialized solvers.
- Creating new filters in this hierarchy
- The procedure for creating a filter within the FDS hierarchy is to identify all the virtual methods that need to be defined for your particular application. In the simplest case, a filter needs only to instantiate a specific function object and define some halting criteria. For more complicated applications, you may need to define a specialized type of iteration scheme or updating procedure in a higher-level solver object.
- Some simple examples are the specific subclasses of AnisotropicDiffusionImageFilter. The leaves of the anisotropic diffusion filter tree only define the function object they use for their particular flavor of diffusion. See CurvatureAnisotropicDiffusionImageFilter and GradientAnisotropicDiffusionImageFilter for details.
- FiniteDifferenceImageFilter2
- This class defines the generic solver API at the top level of the FDS framework. FiniteDifferenceImageFilter2 is an abstract class that implements the generic, high-level algorithm (described above).
- Inputs and Outputs
- This filter is an Image to Image filter. Depending on the specific subclass implementation, finite difference image filters may process a variety of image types. The input to the filter is the initial value of \( u \) and the output of the filter is the solution to the p.d.e.
- How to use this class
- GenerateData() relies on several virtual methods that must be defined by a subclass. Specifically: AllocateUpdateBuffer ApplyUpdate CalculateChange and Halt. To create a finite difference solver, implement a subclass to define these methods.
- Note that there is no fixed container type for the buffer used to hold the update \( \Delta \). The container might be another image, or simply a list of values. AllocateUpdateBuffer is responsible for creating the \( \Delta \) container. CalculateChange populates this buffer and ApplyUpdate adds the buffer values to the output image (solution). The boolean Halt() (or ThreadedHalt) method returns a true value to stop iteration.
Based on the paper:
"An active contour model without edges"
T. Chan and L. Vese.
In Scale-Space Theories in Computer Vision, pages 141-151, 1999.
- Author
- Mosaliganti K., Smith B., Gelas A., Gouaillard A., Megason S.
This code was taken from the Insight Journal paper:
"Cell Tracking using Coupled Active Surfaces for Nuclei and Membranes"
https://www.insight-journal.org/browse/publication/642
That is based on the papers:
"Level Set Segmentation: Active Contours without edge"
https://www.insight-journal.org/browse/publication/322
and
"Level set segmentation using coupled active surfaces"
https://www.insight-journal.org/browse/publication/323
- See also
- DenseFiniteDifferenceImageFilter2
Definition at line 162 of file itkMultiphaseFiniteDifferenceImageFilter.h.
|
virtual const unsigned int & | GetElapsedIterations () const |
|
InputImagePointer | GetLevelSet (const IdCellType &i) |
|
const char * | GetNameOfClass () const override |
|
virtual void | SetElapsedIterations (unsigned int _arg) |
|
void | SetFunctionCount (const IdCellType &n) |
|
void | SetKdTree (KdTreeType *kdtree) |
|
void | SetLevelSet (const IdCellType &i, const InputImageType *levelSet) |
|
void | SetLookup (VectorIdCellType lookup) |
|
|
virtual const FiniteDifferenceFunctionPointer | GetDifferenceFunction (const IdCellType &functionIndex) const |
|
|
virtual void | SetDifferenceFunction (const IdCellType &functionIndex, FiniteDifferenceFunctionPointer function) |
|
|
virtual void | SetNumberOfIterations (unsigned int _arg) |
|
virtual const unsigned int & | GetNumberOfIterations () const |
|
|
virtual void | SetUseImageSpacing (bool _arg) |
|
virtual void | UseImageSpacingOn () |
|
virtual const bool & | GetUseImageSpacing () const |
|
|
virtual void | SetMaximumRMSError (double _arg) |
|
virtual const double & | GetMaximumRMSError () const |
|
|
virtual void | SetRMSChange (double _arg) |
|
virtual const double & | GetRMSChange () const |
|
|
virtual void | SetInitializedState (bool _arg) |
|
virtual const bool & | GetInitializedState () const |
|
virtual void | InitializedStateOn () |
|
|
virtual void | SetManualReinitialization (bool _arg) |
|
virtual const bool & | GetManualReinitialization () const |
|
virtual void | ManualReinitializationOn () |
|
virtual bool | CanRunInPlace () const |
|
const char * | GetNameOfClass () const override |
|
virtual void | SetInPlace (bool _arg) |
|
virtual bool | GetInPlace () const |
|
virtual void | InPlaceOn () |
|
const InputImageType * | GetInput () const |
|
const InputImageType * | GetInput (unsigned int idx) const |
|
const char * | GetNameOfClass () const override |
|
void | PopBackInput () override |
|
void | PopFrontInput () override |
|
virtual void | PushBackInput (const InputImageType *input) |
|
virtual void | PushFrontInput (const InputImageType *input) |
|
virtual void | SetInput (const DataObjectIdentifierType &key, DataObject *input) |
|
virtual void | SetInput (const InputImageType *input) |
|
virtual void | SetInput (unsigned int, const TFeatureImage *image) |
|
virtual void | SetCoordinateTolerance (double _arg) |
|
virtual double | GetCoordinateTolerance () const |
|
virtual void | SetDirectionTolerance (double _arg) |
|
virtual double | GetDirectionTolerance () const |
|
const char * | GetNameOfClass () const override |
|
OutputImageType * | GetOutput (unsigned int idx) |
|
OutputImageType * | GetOutput () |
|
const OutputImageType * | GetOutput () const |
|
virtual void | GraftOutput (DataObject *graft) |
|
virtual void | GraftOutput (const DataObjectIdentifierType &key, DataObject *graft) |
|
virtual void | GraftNthOutput (unsigned int idx, DataObject *graft) |
|
ProcessObject::DataObjectPointer | MakeOutput (ProcessObject::DataObjectPointerArraySizeType idx) override |
|
ProcessObject::DataObjectPointer | MakeOutput (const ProcessObject::DataObjectIdentifierType &) override |
|
virtual void | AbortGenerateDataOn () |
|
virtual void | EnlargeOutputRequestedRegion (DataObject *) |
|
virtual const bool & | GetAbortGenerateData () const |
|
DataObjectPointerArray | GetIndexedInputs () |
|
DataObjectPointerArray | GetIndexedOutputs () |
|
NameArray | GetInputNames () const |
|
DataObjectPointerArray | GetInputs () |
|
MultiThreaderType * | GetMultiThreader () const |
|
const char * | GetNameOfClass () const override |
|
DataObjectPointerArraySizeType | GetNumberOfIndexedInputs () const |
|
DataObjectPointerArraySizeType | GetNumberOfIndexedOutputs () const |
|
DataObjectPointerArraySizeType | GetNumberOfInputs () const |
|
DataObjectPointerArraySizeType | GetNumberOfOutputs () const |
|
virtual DataObjectPointerArraySizeType | GetNumberOfValidRequiredInputs () const |
|
NameArray | GetOutputNames () const |
|
DataObjectPointerArray | GetOutputs () |
|
virtual float | GetProgress () const |
|
NameArray | GetRequiredInputNames () const |
|
bool | HasInput (const DataObjectIdentifierType &key) const |
|
bool | HasOutput (const DataObjectIdentifierType &key) const |
|
void | IncrementProgress (float increment) |
|
virtual DataObjectPointer | MakeOutput (const DataObjectIdentifierType &) |
|
virtual DataObjectPointer | MakeOutput (DataObjectPointerArraySizeType idx) |
|
virtual void | PrepareOutputs () |
|
virtual void | PropagateRequestedRegion (DataObject *output) |
|
virtual void | ResetPipeline () |
|
virtual void | SetAbortGenerateData (bool _arg) |
|
void | SetMultiThreader (MultiThreaderType *threader) |
|
virtual void | Update () |
|
virtual void | UpdateLargestPossibleRegion () |
|
virtual void | UpdateOutputData (DataObject *output) |
|
virtual void | UpdateOutputInformation () |
|
void | UpdateProgress (float progress) |
|
virtual void | SetReleaseDataFlag (bool val) |
|
virtual bool | GetReleaseDataFlag () const |
|
void | ReleaseDataFlagOn () |
|
void | ReleaseDataFlagOff () |
|
virtual void | SetReleaseDataBeforeUpdateFlag (bool _arg) |
|
virtual const bool & | GetReleaseDataBeforeUpdateFlag () const |
|
virtual void | ReleaseDataBeforeUpdateFlagOn () |
|
virtual void | SetNumberOfWorkUnits (ThreadIdType _arg) |
|
virtual const ThreadIdType & | GetNumberOfWorkUnits () const |
|
unsigned long | AddObserver (const EventObject &event, Command *) |
|
unsigned long | AddObserver (const EventObject &event, Command *) const |
|
unsigned long | AddObserver (const EventObject &event, std::function< void(const EventObject &)> function) const |
|
LightObject::Pointer | CreateAnother () const override |
|
virtual void | DebugOff () const |
|
virtual void | DebugOn () const |
|
Command * | GetCommand (unsigned long tag) |
|
bool | GetDebug () const |
|
MetaDataDictionary & | GetMetaDataDictionary () |
|
const MetaDataDictionary & | GetMetaDataDictionary () const |
|
virtual ModifiedTimeType | GetMTime () const |
|
const char * | GetNameOfClass () const override |
|
virtual const TimeStamp & | GetTimeStamp () const |
|
bool | HasObserver (const EventObject &event) const |
|
void | InvokeEvent (const EventObject &) |
|
void | InvokeEvent (const EventObject &) const |
|
virtual void | Modified () const |
|
void | Register () const override |
|
void | RemoveAllObservers () |
|
void | RemoveObserver (unsigned long tag) |
|
void | SetDebug (bool debugFlag) const |
|
void | SetReferenceCount (int) override |
|
void | UnRegister () const noexcept override |
|
void | SetMetaDataDictionary (const MetaDataDictionary &rhs) |
|
void | SetMetaDataDictionary (MetaDataDictionary &&rrhs) |
|
virtual void | SetObjectName (std::string _arg) |
|
virtual const std::string & | GetObjectName () const |
|
Pointer | Clone () const |
|
virtual Pointer | CreateAnother () const |
|
virtual void | Delete () |
|
virtual const char * | GetNameOfClass () const |
|
virtual int | GetReferenceCount () const |
|
void | Print (std::ostream &os, Indent indent=0) const |
|
virtual void | Register () const |
|
virtual void | SetReferenceCount (int) |
|
virtual void | UnRegister () const noexcept |
|
|
virtual void | AllocateUpdateBuffer ()=0 |
|
virtual void | ApplyUpdate (TimeStepType dt)=0 |
|
virtual TimeStepType | CalculateChange ()=0 |
|
virtual void | CopyInputToOutput ()=0 |
|
void | GenerateData () override |
|
void | GenerateInputRequestedRegion () override |
|
virtual bool | Halt () |
|
virtual void | Initialize () |
|
| MultiphaseFiniteDifferenceImageFilter () |
|
virtual void | PostProcessOutput () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
TimeStepType | ResolveTimeStep (const TimeStepVectorType &timeStepList, const std::vector< uint8_t > &valid) |
|
virtual bool | ThreadedHalt (void *) |
|
| ~MultiphaseFiniteDifferenceImageFilter () override=default |
|
|
virtual void | InitializeIteration () |
|
virtual bool | GetRunningInPlace () const |
|
| InPlaceImageFilter ()=default |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
void | ReleaseInputs () override |
|
| ~InPlaceImageFilter () override=default |
|
void | AllocateOutputs () override |
|
virtual void | CallCopyInputRegionToOutputRegion (OutputImageRegionType &destRegion, const InputImageRegionType &srcRegion) |
|
virtual void | CallCopyOutputRegionToInputRegion (InputImageRegionType &destRegion, const OutputImageRegionType &srcRegion) |
|
void | GenerateInputRequestedRegion () override |
|
| ImageToImageFilter () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
void | VerifyInputInformation () ITKv5_CONST override |
|
| ~ImageToImageFilter () override=default |
|
virtual void | PushBackInput (const DataObject *input) |
|
virtual void | PushFrontInput (const DataObject *input) |
|
virtual void | AfterThreadedGenerateData () |
|
virtual void | AllocateOutputs () |
|
virtual void | BeforeThreadedGenerateData () |
|
void | ClassicMultiThread (ThreadFunctionType callbackFunction) |
|
void | GenerateData () override |
|
virtual const ImageRegionSplitterBase * | GetImageRegionSplitter () const |
|
| ImageSource () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
virtual unsigned int | SplitRequestedRegion (unsigned int i, unsigned int pieces, OutputImageRegionType &splitRegion) |
|
| ~ImageSource () override=default |
|
virtual void | ThreadedGenerateData (const OutputImageRegionType ®ion, ThreadIdType threadId) |
|
virtual void | DynamicThreadedGenerateData (const OutputImageRegionType &outputRegionForThread) |
|
virtual bool | GetDynamicMultiThreading () const |
|
virtual void | SetDynamicMultiThreading (bool _arg) |
|
virtual void | DynamicMultiThreadingOn () |
|
virtual void | AddInput (DataObject *input) |
|
void | AddOptionalInputName (const DataObjectIdentifierType &) |
|
void | AddOptionalInputName (const DataObjectIdentifierType &, DataObjectPointerArraySizeType idx) |
|
virtual void | AddOutput (DataObject *output) |
|
bool | AddRequiredInputName (const DataObjectIdentifierType &) |
|
bool | AddRequiredInputName (const DataObjectIdentifierType &, DataObjectPointerArraySizeType idx) |
|
virtual void | CacheInputReleaseDataFlags () |
|
virtual void | GenerateData () |
|
virtual void | GenerateInputRequestedRegion () |
|
virtual void | GenerateOutputInformation () |
|
virtual void | GenerateOutputRequestedRegion (DataObject *output) |
|
DataObject * | GetInput (const DataObjectIdentifierType &key) |
|
const DataObject * | GetInput (const DataObjectIdentifierType &key) const |
|
virtual const DataObjectPointerArraySizeType & | GetNumberOfRequiredInputs () const |
|
virtual const DataObjectPointerArraySizeType & | GetNumberOfRequiredOutputs () const |
|
bool | IsIndexedInputName (const DataObjectIdentifierType &) const |
|
bool | IsIndexedOutputName (const DataObjectIdentifierType &) const |
|
bool | IsRequiredInputName (const DataObjectIdentifierType &) const |
|
DataObjectPointerArraySizeType | MakeIndexFromInputName (const DataObjectIdentifierType &name) const |
|
DataObjectPointerArraySizeType | MakeIndexFromOutputName (const DataObjectIdentifierType &name) const |
|
DataObjectIdentifierType | MakeNameFromInputIndex (DataObjectPointerArraySizeType idx) const |
|
DataObjectIdentifierType | MakeNameFromOutputIndex (DataObjectPointerArraySizeType idx) const |
|
virtual void | PopBackInput () |
|
virtual void | PopFrontInput () |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
| ProcessObject () |
|
virtual void | PropagateResetPipeline () |
|
virtual void | PushBackInput (const DataObject *input) |
|
virtual void | PushFrontInput (const DataObject *input) |
|
virtual void | ReleaseInputs () |
|
virtual void | RemoveInput (const DataObjectIdentifierType &key) |
|
virtual void | RemoveInput (DataObjectPointerArraySizeType) |
|
virtual void | RemoveOutput (const DataObjectIdentifierType &key) |
|
virtual void | RemoveOutput (DataObjectPointerArraySizeType idx) |
|
bool | RemoveRequiredInputName (const DataObjectIdentifierType &) |
|
virtual void | RestoreInputReleaseDataFlags () |
|
virtual void | SetInput (const DataObjectIdentifierType &key, DataObject *input) |
|
virtual void | SetNthInput (DataObjectPointerArraySizeType idx, DataObject *input) |
|
virtual void | SetNthOutput (DataObjectPointerArraySizeType idx, DataObject *output) |
|
void | SetNumberOfIndexedInputs (DataObjectPointerArraySizeType num) |
|
void | SetNumberOfIndexedOutputs (DataObjectPointerArraySizeType num) |
|
virtual void | SetNumberOfRequiredInputs (DataObjectPointerArraySizeType) |
|
virtual void | SetNumberOfRequiredOutputs (DataObjectPointerArraySizeType _arg) |
|
virtual void | SetOutput (const DataObjectIdentifierType &name, DataObject *output) |
|
virtual void | SetPrimaryInput (DataObject *object) |
|
virtual void | SetPrimaryOutput (DataObject *object) |
|
void | SetRequiredInputNames (const NameArray &) |
|
virtual void | VerifyInputInformation () ITKv5_CONST |
|
virtual void | VerifyPreconditions () ITKv5_CONST |
|
| ~ProcessObject () override |
|
DataObject * | GetInput (DataObjectPointerArraySizeType idx) |
|
const DataObject * | GetInput (DataObjectPointerArraySizeType idx) const |
|
DataObject * | GetPrimaryInput () |
|
const DataObject * | GetPrimaryInput () const |
|
virtual void | SetPrimaryInputName (const DataObjectIdentifierType &key) |
|
virtual const char * | GetPrimaryInputName () const |
|
DataObject * | GetOutput (const DataObjectIdentifierType &key) |
|
const DataObject * | GetOutput (const DataObjectIdentifierType &key) const |
|
virtual void | SetPrimaryOutputName (const DataObjectIdentifierType &key) |
|
virtual const char * | GetPrimaryOutputName () const |
|
DataObject * | GetOutput (DataObjectPointerArraySizeType i) |
|
const DataObject * | GetOutput (DataObjectPointerArraySizeType i) const |
|
DataObject * | GetPrimaryOutput () |
|
const DataObject * | GetPrimaryOutput () const |
|
virtual bool | GetThreaderUpdateProgress () const |
|
virtual void | ThreaderUpdateProgressOn () |
|
virtual void | SetThreaderUpdateProgress (bool arg) |
|
| Object () |
|
bool | PrintObservers (std::ostream &os, Indent indent) const |
|
void | PrintSelf (std::ostream &os, Indent indent) const override |
|
virtual void | SetTimeStamp (const TimeStamp &timeStamp) |
|
| ~Object () override |
|
virtual LightObject::Pointer | InternalClone () const |
|
| LightObject () |
|
virtual void | PrintHeader (std::ostream &os, Indent indent) const |
|
virtual void | PrintSelf (std::ostream &os, Indent indent) const |
|
virtual void | PrintTrailer (std::ostream &os, Indent indent) const |
|
virtual | ~LightObject () |
|
template<typename TInputImage , typename TFeatureImage , typename TOutputImage , typename TFiniteDifferenceFunction = FiniteDifferenceFunction<TOutputImage>, typename TIdCell = unsigned int>
This method is optionally defined by a subclass and is called immediately prior to each iterative CalculateChange-ApplyUpdate cycle. It can be used to set global variables needed for the next iteration (ie. average gradient magnitude of the image in anisotropic diffusion functions), or otherwise prepare for the next iteration.
Reimplemented in itk::MultiphaseSparseFiniteDifferenceImageFilter< TInputImage, TFeatureImage, TOutputImage, TFunction, TIdCell >, itk::MultiphaseSparseFiniteDifferenceImageFilter< TInputImage, TFeatureImage, TOutputImage, ScalarChanAndVeseLevelSetFunction< TInputImage, TFeatureImage >, unsigned int >, itk::ScalarChanAndVeseDenseLevelSetImageFilter< TInputImage, TFeatureImage, TOutputImage, TFunction, TSharedData >, and itk::ScalarChanAndVeseSparseLevelSetImageFilter< TInputImage, TFeatureImage, TOutputImage, TFunction, TSharedData, TIdCell >.
Definition at line 506 of file itkMultiphaseFiniteDifferenceImageFilter.h.