/vol/vipdata/irtk/contrib++/include/irtkEuclideanDistanceTransform.h

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkEuclideanDistanceTransform.h 2 2008-12-23 12:40:14Z dr $
00005   Copyright : Imperial College, Department of Computing
00006               Visual Information Processing (VIP), 2008 onwards
00007   Date      : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $
00008   Version   : $Revision: 2 $
00009   Changes   : $Author: dr $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef _IRTKEUCLIDEANDISTANCETRANSFORM_H
00014 
00015 #define _IRTKEUCLIDEANDISTANCETRANSFORM_H
00016 
00017 #define EDT_MAX_IMAGE_DIMENSION 26754
00018 #define EDT_MAX_DISTANCE_SQUARED 2147329548
00019 #define EDT_MAX_DISTANCE_SQUARED_ANISOTROPIC 2147329548
00020 
00021 #include <irtkImageToImage.h>
00022 
00023 template <class VoxelType> class irtkEuclideanDistanceTransform : public irtkImageToImage<VoxelType>
00024 {
00025 
00026 public:
00027 
00029   enum irtkDistanceTransformMode { irtkDistanceTransform2D, irtkDistanceTransform3D };
00030 
00031 protected:
00032 
00034   irtkDistanceTransformMode _distanceTransformMode;
00035 
00037   int edtVornoiEDT(long *, long);
00038 
00040   void edtComputeEDT_2D(char *, long *, long, long);
00041 
00043   void edtComputeEDT_3D(char *, long *, long, long, long);
00044 
00046   int edtVornoiEDT_anisotropic(float *, long, float);
00047 
00049   void edtComputeEDT_2D_anisotropic(float *, float *, long, long, float, float);
00050 
00052   void edtComputeEDT_3D_anisotropic(float *, float *, long, long, long, float, float,
00053                                     float);
00054 
00056   virtual const char *NameOfClass();
00057 
00059   virtual Bool RequiresBuffering();
00060 
00061 public:
00062 
00064   irtkEuclideanDistanceTransform(irtkDistanceTransformMode = irtkDistanceTransform3D);
00065 
00067   ~irtkEuclideanDistanceTransform() {};
00068 
00069   // Run distance transform
00070   virtual void Run();
00071 };
00072 
00073 template <class VoxelType> inline const char *irtkEuclideanDistanceTransform<VoxelType>::NameOfClass()
00074 {
00075   return "irtkEuclideanDistanceTransform";
00076 }
00077 
00078 template <class VoxelType> inline Bool irtkEuclideanDistanceTransform<VoxelType>::RequiresBuffering()
00079 {
00080   return False;
00081 }
00082 
00083 #endif