+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
#ifndef __fpa__Image__SkeletonFilter__h__
#define __fpa__Image__SkeletonFilter__h__
+#include <map>
+
#include <itkProcessObject.h>
-#include <itkSimpleDataObjectDecorator.h>
-#include <fpa/Image/MinimumSpanningTree.h>
-#include <cpExtensions/DataStructures/Skeleton.h>
-#include <set>
+#include <itkSignedMaurerDistanceMapImageFilter.h>
+
+#include <fpa/Image/Dijkstra.h>
+#include <fpa/Image/Skeleton.h>
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
{
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