X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FSkeletonFilter.h;h=11c2a74294abbb27ea7a3f58969ff09902669888;hb=ed2108383e59a45c6fa2e9259a27256a93d8aa6a;hp=85618d79ef723af41774d6af8ed3d45b76e924b5;hpb=49c5386438703b6a4303a2fca216b6acb9e36f33;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/SkeletonFilter.h b/lib/fpa/Image/SkeletonFilter.h index 85618d7..11c2a74 100644 --- a/lib/fpa/Image/SkeletonFilter.h +++ b/lib/fpa/Image/SkeletonFilter.h @@ -1,11 +1,18 @@ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= + #ifndef __fpa__Image__SkeletonFilter__h__ #define __fpa__Image__SkeletonFilter__h__ +#include + #include -#include -#include -#include -#include +#include + +#include +#include namespace fpa { @@ -13,7 +20,7 @@ namespace fpa { /** */ - template< class _TDistanceMap, class _TCostMap > + template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > > class SkeletonFilter : public itk::ProcessObject { @@ -23,82 +30,113 @@ namespace fpa typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; -#ifdef ITK_USE_CONCEPT_CHECKING - itkConceptMacro( - SameDimension, - ( itk::Concept::SameDimension< _TDistanceMap::ImageDimension, _TCostMap::ImageDimension > ) - ); -#endif + typedef _TInputImage TInputImage; typedef _TDistanceMap TDistanceMap; - typedef _TCostMap TCostMap; - typedef typename TCostMap::IndexType TIndex; - typedef MinimumSpanningTree< TCostMap::ImageDimension > TMST; - typedef - cpExtensions::DataStructures::Skeleton< TCostMap::ImageDimension > - TSkeleton; - typedef itk::Image< unsigned char, _TCostMap::ImageDimension > TMarks; - - typedef - itk::Functor::IndexLexicographicCompare< _TCostMap::ImageDimension > - TIndexCompare; - typedef std::set< TIndex, TIndexCompare > TIndicesData; - typedef itk::SimpleDataObjectDecorator< TIndicesData > TIndices; + itkStaticConstMacro( + Dimension, + unsigned int, + TInputImage::ImageDimension + ); - public: - itkNewMacro( Self ); - itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object ); + typedef typename TDistanceMap::OutputImageType TOutputImage; + typedef typename TInputImage::IndexType TIndex; + typedef typename TOutputImage::PixelType TScalar; + + typedef fpa::Image::Skeleton< Self::Dimension > TSkeleton; + + protected: + typedef std::multimap< TScalar, TIndex > _TSkeletonQueue; + + /** + */ + class _TDijkstra + : public fpa::Image::Dijkstra< TOutputImage, TOutputImage > + { + public: + typedef _TDijkstra Self; + typedef fpa::Image::Dijkstra< TOutputImage, TOutputImage > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef typename Superclass::TNode TNode; + typedef typename Superclass::TMST TMST; + + public: + itkNewMacro( Self ); + itkTypeMacro( _TDijkstra, fpa::Image::Dijkstra ); + + itkGetConstReferenceMacro( SkeletonQueue, _TSkeletonQueue ); + + protected: + _TDijkstra( ); + virtual ~_TDijkstra( ); + + virtual void _BeforeGenerateData( ) override; + virtual void _UpdateOutputValue( const TNode& n ) override; + + private: + // Purposely not implemented + _TDijkstra( const Self& other ); + Self& operator=( const Self& other ); + + protected: + _TSkeletonQueue m_SkeletonQueue; + }; + typedef typename _TDijkstra::TMST _TMST; public: - _TDistanceMap* GetDistanceMap( ); - const _TDistanceMap* GetDistanceMap( ) const; - void SetDistanceMap( _TDistanceMap* dmap ); + itkNewMacro( Self ); + itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra ); - _TCostMap* GetCostMap( ); - const _TCostMap* GetCostMap( ) const; - void SetCostMap( _TCostMap* cmap ); + itkBooleanMacro( SeedFromMaximumDistance ); + itkGetConstMacro( SeedFromMaximumDistance, bool ); + itkSetMacro( SeedFromMaximumDistance, bool ); - TMST* GetMinimumSpanningTree( ); - const TMST* GetMinimumSpanningTree( ) const; - void SetMinimumSpanningTree( TMST* mst ); + itkGetConstObjectMacro( DistanceMap, TDistanceMap ); + itkGetObjectMacro( DistanceMap, TDistanceMap ); - TIndices* GetEndPoints( ); - const TIndices* GetEndPoints( ) const; + itkGetConstMacro( Seed, TIndex ); + itkSetMacro( Seed, TIndex ); - TIndices* GetBifurcations( ); - const TIndices* GetBifurcations( ) const; + public: + virtual itk::ModifiedTimeType GetMTime( ) const override; - TSkeleton* GetSkeleton( ); - const TSkeleton* GetSkeleton( ) const; + void SetInput( TInputImage* input ); + TInputImage* GetInput( ); + const TInputImage* GetInput( ) const; - TMarks* GetMarks( ); - const TMarks* GetMarks( ) const; + TSkeleton* GetOutput( ); + const TSkeleton* GetOutput( ) const; protected: SkeletonFilter( ); virtual ~SkeletonFilter( ); - virtual void GenerateData( ) fpa_OVERRIDE; + virtual void GenerateData( ) override; - void _EndPoints( - const TDistanceMap* dmap, - const TCostMap* cmap, - const TMST* mst, - TIndicesData& end_points + template< class _TMarksPointer > + void _MarkSphere( + _TMarksPointer& marks, + const TOutputImage* dmap, + const TIndex& center ); - void _Skeleton( - const TDistanceMap* dmap, - const TCostMap* cmap, - const TMST* mst, - const TIndicesData& end_points, - TIndicesData& bifurcations, - TSkeleton* skeleton + void _EndPoints( + std::vector< TIndex >& end_points, + const TOutputImage* dmap, + const _TMST* mst, + const _TSkeletonQueue& queue ); private: - // Purposely not defined + // Purposely not implemented. SkeletonFilter( const Self& other ); Self& operator=( const Self& other ); + + protected: + typename TDistanceMap::Pointer m_DistanceMap; + bool m_SeedFromMaximumDistance; + TIndex m_Seed; }; } // ecapseman