1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__Image__SkeletonFilter__h__
7 #define __fpa__Image__SkeletonFilter__h__
9 #include <fpa/Image/Dijkstra.h>
12 #include <itkSignedMaurerDistanceMapImageFilter.h>
13 #include <fpa/Base/Skeleton.h>
21 template< class _TImage, class _TScalar = double >
23 : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > >
27 typedef _TImage TImage;
28 typedef _TScalar TScalar;
29 typedef itk::Image< TScalar, TImage::ImageDimension > TScalarImage;
30 typedef SkeletonFilter Self;
31 typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > Superclass;
32 typedef itk::SmartPointer< Self > Pointer;
33 typedef itk::SmartPointer< const Self > ConstPointer;
35 typedef typename Superclass::TVertex TVertex;
36 typedef typename Superclass::TOutputValue TOutputValue;
38 typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap;
39 typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks;
40 typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton;
43 typedef std::multimap< TScalar, TVertex, std::greater< TScalar > > _TSkeletonQueue;
44 typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies;
48 itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
50 itkBooleanMacro( SeedFromMaximumDistance );
51 itkGetConstMacro( SeedFromMaximumDistance, bool );
52 itkSetMacro( SeedFromMaximumDistance, bool );
55 virtual void SetInput( const TScalarImage* image ) override;
56 void SetInput( const TImage* image );
58 const TImage* GetInput( ) const;
60 TSkeleton* GetSkeleton( );
65 virtual ~SkeletonFilter( );
67 virtual void GenerateData( ) override;
68 virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override;
70 void _EndPoints( std::vector< TVertex >& end_points, _TAdjacencies& A );
71 void _Skeleton( const std::vector< TVertex >& end_points, _TAdjacencies& A );
72 void _MarkSphere( const TVertex& idx );
75 SkeletonFilter( const Self& other );
76 Self& operator=( const Self& other );
79 bool m_SeedFromMaximumDistance;
80 typename TDistanceMap::Pointer m_DistanceMap;
81 _TSkeletonQueue m_SkeletonQueue;
82 unsigned long m_SkeletonIdx;
83 unsigned long m_MarksIdx;
90 #ifndef ITK_MANUAL_INSTANTIATION
91 # include <fpa/Image/SkeletonFilter.hxx>
92 #endif // ITK_MANUAL_INSTANTIATION
94 #endif // __fpa__Image__SkeletonFilter__h__