+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
#ifndef __fpa__Image__SkeletonFilter__h__
#define __fpa__Image__SkeletonFilter__h__
#include <map>
-#include <vector>
+
+#include <itkProcessObject.h>
+#include <itkSignedMaurerDistanceMapImageFilter.h>
+
#include <fpa/Image/Dijkstra.h>
-#include <cpExtensions/DataStructures/Skeleton.h>
-#include <itkSimpleDataObjectDecorator.h>
+#include <fpa/Image/Skeleton.h>
namespace fpa
{
{
/**
*/
- template< class _TImage >
+ template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > >
class SkeletonFilter
- : public Dijkstra< _TImage, _TImage >
+ : public itk::ProcessObject
{
public:
typedef SkeletonFilter Self;
- typedef Dijkstra< _TImage, _TImage > Superclass;
+ typedef itk::ProcessObject Superclass;
typedef itk::SmartPointer< Self > Pointer;
typedef itk::SmartPointer< const Self > ConstPointer;
- typedef _TImage TImage;
+ typedef _TInputImage TInputImage;
+ typedef _TDistanceMap TDistanceMap;
itkStaticConstMacro(
- Dimension, unsigned int, TImage::ImageDimension
+ Dimension,
+ unsigned int,
+ TInputImage::ImageDimension
);
- typedef typename Superclass::TMST TMST;
- typedef typename TImage::IndexType TIndex;
- typedef itk::Image< unsigned char, Self::Dimension > TMarks;
- typedef cpExtensions::DataStructures::Skeleton< Self::Dimension > 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 typename Superclass::_TQueueNode _TQueueNode;
- typedef std::multimap< double, TIndex, std::greater< double > > _TSkeletonQueue;
- typedef std::map< TIndex, TIndex, typename TIndex::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( 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, itk::Object );
+ itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
+
+ itkBooleanMacro( SeedFromMaximumDistance );
+ itkGetConstMacro( SeedFromMaximumDistance, bool );
+ itkSetMacro( SeedFromMaximumDistance, bool );
+
+ itkGetConstObjectMacro( DistanceMap, TDistanceMap );
+ itkGetObjectMacro( DistanceMap, TDistanceMap );
+
+ itkGetConstMacro( Seed, TIndex );
+ itkSetMacro( Seed, TIndex );
public:
- TSkeleton* GetSkeleton( );
- TMarks* GetMarks( );
+ virtual itk::ModifiedTimeType GetMTime( ) const override;
+
+ void SetInput( TInputImage* input );
+ TInputImage* GetInput( );
+ const TInputImage* GetInput( ) const;
+
+ TSkeleton* GetOutput( );
+ const TSkeleton* GetOutput( ) const;
protected:
SkeletonFilter( );
virtual ~SkeletonFilter( );
- virtual void _BeforeGenerateData( ) override;
- virtual void _UpdateResult( const _TQueueNode& n ) override;
- virtual void _AfterGenerateData( ) override;
+ virtual void GenerateData( ) override;
- void _EndPoints( std::vector< TIndex >& end_points, _TAdjacencies& A );
- void _Skeleton( const std::vector< TIndex >& end_points, _TAdjacencies& A );
- void _MarkSphere( const TIndex& 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 defined
+ // Purposely not implemented.
SkeletonFilter( const Self& other );
Self& operator=( const Self& other );
protected:
- _TSkeletonQueue m_SkeletonQueue;
-
- unsigned long m_SkeletonIdx;
- unsigned long m_MarksIdx;
+ typename TDistanceMap::Pointer m_DistanceMap;
+ bool m_SeedFromMaximumDistance;
+ TIndex m_Seed;
};
} // ecapseman