You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.8 KiB
140 lines
4.8 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkImageEuclideanDistance.h,v $
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
// .NAME vtkImageEuclideanDistance - computes 3D Euclidean DT
|
||
|
// .SECTION Description
|
||
|
// vtkImageEuclideanDistance implements the Euclidean DT using
|
||
|
// Saito's algorithm. The distance map produced contains the square of the
|
||
|
// Euclidean distance values.
|
||
|
//
|
||
|
// The algorithm has a o(n^(D+1)) complexity over nxnx...xn images in D
|
||
|
// dimensions. It is very efficient on relatively small images. Cuisenaire's
|
||
|
// algorithms should be used instead if n >> 500. These are not implemented
|
||
|
// yet.
|
||
|
//
|
||
|
// For the special case of images where the slice-size is a multiple of
|
||
|
// 2^N with a large N (typically for 256x256 slices), Saito's algorithm
|
||
|
// encounters a lot of cache conflicts during the 3rd iteration which can
|
||
|
// slow it very significantly. In that case, one should use
|
||
|
// ::SetAlgorithmToSaitoCached() instead for better performance.
|
||
|
//
|
||
|
// References:
|
||
|
//
|
||
|
// T. Saito and J.I. Toriwaki. New algorithms for Euclidean distance
|
||
|
// transformations of an n-dimensional digitised picture with applications.
|
||
|
// Pattern Recognition, 27(11). pp. 1551--1565, 1994.
|
||
|
//
|
||
|
// O. Cuisenaire. Distance Transformation: fast algorithms and applications
|
||
|
// to medical image processing. PhD Thesis, Universite catholique de Louvain,
|
||
|
// October 1999. http://ltswww.epfl.ch/~cuisenai/papers/oc_thesis.pdf
|
||
|
|
||
|
|
||
|
#ifndef __vtkImageEuclideanDistance_h
|
||
|
#define __vtkImageEuclideanDistance_h
|
||
|
|
||
|
#include "vtkImageDecomposeFilter.h"
|
||
|
|
||
|
#define VTK_EDT_SAITO_CACHED 0
|
||
|
#define VTK_EDT_SAITO 1
|
||
|
|
||
|
class VTK_IMAGING_EXPORT vtkImageEuclideanDistance : public vtkImageDecomposeFilter
|
||
|
{
|
||
|
public:
|
||
|
static vtkImageEuclideanDistance *New();
|
||
|
vtkTypeRevisionMacro(vtkImageEuclideanDistance,vtkImageDecomposeFilter);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent);
|
||
|
|
||
|
// Description:
|
||
|
// Used internally for streaming and threads.
|
||
|
// Splits output update extent into num pieces.
|
||
|
// This method needs to be called num times. Results must not overlap for
|
||
|
// consistent starting extent. Subclass can override this method.
|
||
|
// This method returns the number of peices resulting from a
|
||
|
// successful split. This can be from 1 to "total".
|
||
|
// If 1 is returned, the extent cannot be split.
|
||
|
int SplitExtent(int splitExt[6], int startExt[6],
|
||
|
int num, int total);
|
||
|
|
||
|
// Description:
|
||
|
// Used to set all non-zero voxels to MaximumDistance before starting
|
||
|
// the distance transformation. Setting Initialize off keeps the current
|
||
|
// value in the input image as starting point. This allows to superimpose
|
||
|
// several distance maps.
|
||
|
vtkSetMacro(Initialize, int);
|
||
|
vtkGetMacro(Initialize, int);
|
||
|
vtkBooleanMacro(Initialize, int);
|
||
|
|
||
|
// Description:
|
||
|
// Used to define whether Spacing should be used in the computation of the
|
||
|
// distances
|
||
|
vtkSetMacro(ConsiderAnisotropy, int);
|
||
|
vtkGetMacro(ConsiderAnisotropy, int);
|
||
|
vtkBooleanMacro(ConsiderAnisotropy, int);
|
||
|
|
||
|
// Description:
|
||
|
// Any distance bigger than this->MaximumDistance will not ne computed but
|
||
|
// set to this->MaximumDistance instead.
|
||
|
vtkSetMacro(MaximumDistance, double);
|
||
|
vtkGetMacro(MaximumDistance, double);
|
||
|
|
||
|
// Description:
|
||
|
// Selects a Euclidean DT algorithm.
|
||
|
// 1. Saito
|
||
|
// 2. Saito-cached
|
||
|
// More algorithms will be added later on.
|
||
|
vtkSetMacro(Algorithm, int);
|
||
|
vtkGetMacro(Algorithm, int);
|
||
|
void SetAlgorithmToSaito ()
|
||
|
{ this->SetAlgorithm(VTK_EDT_SAITO); }
|
||
|
void SetAlgorithmToSaitoCached ()
|
||
|
{ this->SetAlgorithm(VTK_EDT_SAITO_CACHED); }
|
||
|
|
||
|
virtual int IterativeRequestData(vtkInformation*,
|
||
|
vtkInformationVector**,
|
||
|
vtkInformationVector*);
|
||
|
|
||
|
protected:
|
||
|
vtkImageEuclideanDistance();
|
||
|
~vtkImageEuclideanDistance() {}
|
||
|
|
||
|
double MaximumDistance;
|
||
|
int Initialize;
|
||
|
int ConsiderAnisotropy;
|
||
|
int Algorithm;
|
||
|
|
||
|
// Replaces "EnlargeOutputUpdateExtent"
|
||
|
virtual void AllocateOutputScalars(vtkImageData *outData);
|
||
|
|
||
|
virtual int IterativeRequestInformation(vtkInformation* in,
|
||
|
vtkInformation* out);
|
||
|
virtual int IterativeRequestUpdateExtent(vtkInformation* in,
|
||
|
vtkInformation* out);
|
||
|
|
||
|
private:
|
||
|
vtkImageEuclideanDistance(const vtkImageEuclideanDistance&); // Not implemented.
|
||
|
void operator=(const vtkImageEuclideanDistance&); // Not implemented.
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|