+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
#ifndef __fpa__Image__SkeletonFilter__h__
#define __fpa__Image__SkeletonFilter__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>
-*/
+#include <map>
+#include <itkSignedMaurerDistanceMapImageFilter.h>
+#include <fpa/Base/Skeleton.h>
namespace fpa
{
{
/**
*/
- template< class _TImage >
+ template< class _TImage, class _TScalar = double >
class SkeletonFilter
- : public Dijkstra< _TImage, _TImage >
+ : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > >
{
public:
- typedef SkeletonFilter Self;
- typedef Dijkstra< _TImage, _TImage > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
+ // 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 itk::SmartPointer< const Self > ConstPointer;
- typedef _TImage TImage;
- itkStaticConstMacro(
- Dimension, unsigned int, TImage::ImageDimension
- );
+ typedef typename Superclass::TMST TMST;
+ typedef typename Superclass::TVertex TVertex;
+ typedef typename Superclass::TOutputValue TOutputValue;
- typedef typename Superclass::TMST TMST;
- typedef typename TImage::IndexType TIndex;
-
- typedef
- 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;
+ typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap;
+ typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks;
+ typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton;
protected:
- typedef typename Superclass::_TQueueNode _TQueueNode;
- typedef
- std::multimap< double, TIndex, std::greater< double > >
- _TSkeletonQueue;
-
+ typedef std::multimap< TScalar, TVertex, std::greater< TScalar > > _TSkeletonQueue;
+ typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies;
+
public:
itkNewMacro( Self );
- itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object );
+ itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
+
+ itkBooleanMacro( SeedFromMaximumDistance );
+ itkGetConstMacro( SeedFromMaximumDistance, bool );
+ itkSetMacro( SeedFromMaximumDistance, bool );
public:
- TIndices* GetEndPoints( );
- TIndices* GetBifurcations( );
+ virtual void SetInput( const TScalarImage* image ) override;
+ void SetInput( const TImage* image );
+ TImage* GetInput( );
+ const TImage* GetInput( ) const;
+
TSkeleton* GetSkeleton( );
TMarks* GetMarks( );
SkeletonFilter( );
virtual ~SkeletonFilter( );
- 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
- );
- */
+ 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 );
private:
- // Purposely not defined
SkeletonFilter( const Self& other );
Self& operator=( const Self& other );
protected:
+ bool m_SeedFromMaximumDistance;
+ typename TDistanceMap::Pointer m_DistanceMap;
_TSkeletonQueue m_SkeletonQueue;
-
- unsigned long m_EndPointsIdx;
- unsigned long m_BifurcationsIdx;
unsigned long m_SkeletonIdx;
unsigned long m_MarksIdx;
};