#ifndef __fpa__Image__SkeletonFilter__h__
#define __fpa__Image__SkeletonFilter__h__
-#include <itkProcessObject.h>
-#include <itkSimpleDataObjectDecorator.h>
-#include <fpa/Image/MinimumSpanningTree.h>
+#include <fpa/Image/Dijkstra.h>
#include <cpExtensions/DataStructures/Skeleton.h>
+#include <itkSimpleDataObjectDecorator.h>
+#include <functional>
+#include <map>
#include <set>
+/* TODO
+ #include <itkProcessObject.h>
+ #include <fpa/Image/MinimumSpanningTree.h>
+*/
+
namespace fpa
{
namespace Image
{
/**
*/
- template< class _TDistanceMap, class _TCostMap >
+ template< class _TImage >
class SkeletonFilter
- : public itk::ProcessObject
+ : public Dijkstra< _TImage, _TImage >
{
public:
typedef SkeletonFilter Self;
- typedef itk::ProcessObject Superclass;
+ typedef Dijkstra< _TImage, _TImage > Superclass;
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 > )
+ typedef _TImage TImage;
+ itkStaticConstMacro(
+ Dimension, unsigned int, TImage::ImageDimension
);
-#endif
- typedef _TDistanceMap TDistanceMap;
- typedef _TCostMap TCostMap;
- typedef typename TCostMap::IndexType TIndex;
- typedef MinimumSpanningTree< TCostMap::ImageDimension > TMST;
+
+ typedef typename Superclass::TMST TMST;
+ typedef typename TImage::IndexType TIndex;
+
typedef
- cpExtensions::DataStructures::Skeleton< TCostMap::ImageDimension >
- TSkeleton;
- typedef itk::Image< unsigned char, _TCostMap::ImageDimension > TMarks;
+ itk::Functor::IndexLexicographicCompare< Self::Dimension > TIndexCmp;
+ typedef std::set< TIndex, TIndexCmp > TIndicesData;
+ typedef itk::SimpleDataObjectDecorator< TIndicesData > TIndices;
+ typedef itk::Image< unsigned char, Self::Dimension > TMarks;
+ typedef
+ cpExtensions::DataStructures::Skeleton< Self::Dimension > TSkeleton;
+ protected:
+ typedef typename Superclass::_TQueueNode _TQueueNode;
typedef
- itk::Functor::IndexLexicographicCompare< _TCostMap::ImageDimension >
- TIndexCompare;
- typedef std::set< TIndex, TIndexCompare > TIndicesData;
- typedef itk::SimpleDataObjectDecorator< TIndicesData > TIndices;
+ std::multimap< double, TIndex, std::greater< double > >
+ _TSkeletonQueue;
public:
itkNewMacro( Self );
itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object );
public:
- _TDistanceMap* GetDistanceMap( );
- const _TDistanceMap* GetDistanceMap( ) const;
- void SetDistanceMap( _TDistanceMap* dmap );
-
- _TCostMap* GetCostMap( );
- const _TCostMap* GetCostMap( ) const;
- void SetCostMap( _TCostMap* cmap );
-
- TMST* GetMinimumSpanningTree( );
- const TMST* GetMinimumSpanningTree( ) const;
- void SetMinimumSpanningTree( TMST* mst );
-
TIndices* GetEndPoints( );
- const TIndices* GetEndPoints( ) const;
-
TIndices* GetBifurcations( );
- const TIndices* GetBifurcations( ) const;
-
TSkeleton* GetSkeleton( );
- const TSkeleton* GetSkeleton( ) const;
-
TMarks* GetMarks( );
- const TMarks* GetMarks( ) const;
protected:
SkeletonFilter( );
virtual ~SkeletonFilter( );
- virtual void GenerateData( ) fpa_OVERRIDE;
-
- void _EndPoints(
- const TDistanceMap* dmap,
- const TCostMap* cmap,
- const TMST* mst,
- TIndicesData& end_points
- );
-
- void _Skeleton(
- const TDistanceMap* dmap,
- const TCostMap* cmap,
- const TMST* mst,
- const TIndicesData& end_points,
- TIndicesData& bifurcations,
- TSkeleton* skeleton
- );
+ virtual void _BeforeGenerateData( ) fpa_OVERRIDE;
+ virtual void _UpdateResult( const _TQueueNode& n ) fpa_OVERRIDE;
+ virtual void _AfterGenerateData( ) fpa_OVERRIDE;
+
+ void _EndPoints( );
+ void _Skeleton( );
+
+ /* TODO
+ virtual void GenerateData( ) fpa_OVERRIDE;
+ const TDistanceMap* dmap,
+ const TCostMap* cmap,
+ const TMST* mst,
+ TIndicesData& end_points
+ );
+ const TDistanceMap* dmap,
+ const TCostMap* cmap,
+ const TMST* mst,
+ const TIndicesData& end_points,
+ TIndicesData& bifurcations,
+ TSkeleton* skeleton
+ );
+ */
private:
// Purposely not defined
SkeletonFilter( const Self& other );
Self& operator=( const Self& other );
+
+ protected:
+ _TSkeletonQueue m_SkeletonQueue;
+
+ unsigned long m_EndPointsIdx;
+ unsigned long m_BifurcationsIdx;
+ unsigned long m_SkeletonIdx;
+ unsigned long m_MarksIdx;
};
} // ecapseman