#ifndef __fpa__Image__SkeletonFilter__h__
#define __fpa__Image__SkeletonFilter__h__
-#include <fpa/Image/Dijkstra.h>
-
#include <map>
+
+#include <itkProcessObject.h>
#include <itkSignedMaurerDistanceMapImageFilter.h>
-#include <fpa/Base/Skeleton.h>
+
+#include <fpa/Image/Dijkstra.h>
+#include <fpa/Image/Skeleton.h>
namespace fpa
{
{
/**
*/
- template< class _TImage, class _TScalar = double >
+ template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > >
class SkeletonFilter
- : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > >
+ : public itk::ProcessObject
{
public:
- // Smart pointers
- typedef _TImage TImage;
- typedef _TScalar TScalar;
- typedef itk::Image< TScalar, TImage::ImageDimension > TScalarImage;
- typedef SkeletonFilter Self;
- typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
+ typedef SkeletonFilter Self;
+ typedef itk::ProcessObject Superclass;
+ typedef itk::SmartPointer< Self > Pointer;
typedef itk::SmartPointer< const Self > ConstPointer;
- typedef typename Superclass::TMST TMST;
- typedef typename Superclass::TVertex TVertex;
- typedef typename Superclass::TOutputValue TOutputValue;
+ typedef _TInputImage TInputImage;
+ typedef _TDistanceMap TDistanceMap;
+ itkStaticConstMacro(
+ Dimension,
+ unsigned int,
+ TInputImage::ImageDimension
+ );
- typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap;
- typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks;
- typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton;
+ 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, TVertex, std::greater< TScalar > > _TSkeletonQueue;
- typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies;
-
+ 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:
itkNewMacro( Self );
itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
itkGetConstMacro( SeedFromMaximumDistance, bool );
itkSetMacro( SeedFromMaximumDistance, bool );
+ itkGetConstObjectMacro( DistanceMap, TDistanceMap );
+ itkGetObjectMacro( DistanceMap, TDistanceMap );
+
+ itkGetConstMacro( Seed, TIndex );
+ itkSetMacro( Seed, TIndex );
+
public:
- virtual void SetInput( const TScalarImage* image ) override;
- void SetInput( const TImage* image );
- TImage* GetInput( );
- const TImage* GetInput( ) const;
+ virtual itk::ModifiedTimeType GetMTime( ) const override;
- TSkeleton* GetSkeleton( );
- TMarks* GetMarks( );
+ void SetInput( TInputImage* input );
+ TInputImage* GetInput( );
+ const TInputImage* GetInput( ) const;
+
+ TSkeleton* GetOutput( );
+ const TSkeleton* GetOutput( ) const;
protected:
SkeletonFilter( );
virtual ~SkeletonFilter( );
virtual void GenerateData( ) override;
- virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override;
- void _EndPoints( std::vector< TVertex >& end_points, _TAdjacencies& A );
- void _Skeleton( const std::vector< TVertex >& end_points, _TAdjacencies& A );
- void _MarkSphere( const TVertex& idx );
+ template< class _TMarksPointer >
+ void _MarkSphere(
+ _TMarksPointer& marks,
+ const TOutputImage* dmap,
+ const TIndex& center
+ );
+
+ void _EndPoints(
+ std::vector< TIndex >& end_points,
+ const TOutputImage* dmap,
+ const _TMST* mst,
+ const _TSkeletonQueue& queue
+ );
private:
+ // Purposely not implemented.
SkeletonFilter( const Self& other );
Self& operator=( const Self& other );
protected:
- bool m_SeedFromMaximumDistance;
typename TDistanceMap::Pointer m_DistanceMap;
- _TSkeletonQueue m_SkeletonQueue;
- unsigned long m_SkeletonIdx;
- unsigned long m_MarksIdx;
+ bool m_SeedFromMaximumDistance;
+ TIndex m_Seed;
};
} // ecapseman