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::TMST TMST;
36 typedef typename Superclass::TVertex TVertex;
37 typedef typename Superclass::TOutputValue TOutputValue;
39 typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap;
40 typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks;
41 typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton;
44 typedef std::multimap< TScalar, TVertex, std::greater< TScalar > > _TSkeletonQueue;
45 typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies;
49 itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
51 itkBooleanMacro( SeedFromMaximumDistance );
52 itkGetConstMacro( SeedFromMaximumDistance, bool );
53 itkSetMacro( SeedFromMaximumDistance, bool );
56 virtual void SetInput( const TScalarImage* image ) override;
57 void SetInput( const TImage* image );
59 const TImage* GetInput( ) const;
61 TSkeleton* GetSkeleton( );
66 virtual ~SkeletonFilter( );
68 virtual void GenerateData( ) override;
69 virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override;
71 void _EndPoints( std::vector< TVertex >& end_points, _TAdjacencies& A );
72 void _Skeleton( const std::vector< TVertex >& end_points, _TAdjacencies& A );
73 void _MarkSphere( const TVertex& idx );
76 SkeletonFilter( const Self& other );
77 Self& operator=( const Self& other );
80 bool m_SeedFromMaximumDistance;
81 typename TDistanceMap::Pointer m_DistanceMap;
82 _TSkeletonQueue m_SkeletonQueue;
83 unsigned long m_SkeletonIdx;
84 unsigned long m_MarksIdx;
91 #ifndef ITK_MANUAL_INSTANTIATION
92 # include <fpa/Image/SkeletonFilter.hxx>
93 #endif // ITK_MANUAL_INSTANTIATION
95 #endif // __fpa__Image__SkeletonFilter__h__