// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Filters__Mori__h__ #define __fpa__Filters__Mori__h__ #include #include #include #include #include #include namespace fpa { namespace Filters { /** */ template< class _TTraits > class Mori : public fpa::Filters::Algorithm< _TTraits > { public: typedef _TTraits TTraits; fpaTraitsMacro( typename, TTraits ); typedef fpa::Filters::Algorithm< TTraits > Superclass; typedef Mori Self; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef std::deque< TNode > TQueue; typedef std::set< TInputValue > TThresholds; typedef fpa::Common::PeakDetector TPeakDetector; typedef TPeakDetector::TPeak TPeak; typedef fpa::Functors::RegionGrow::BinaryThreshold< TInputValue > TPredicate; protected: itkConceptMacro( Check_TOutputValue, ( itk::Concept::IsUnsignedInteger< TOutputValue > ) ); public: itkTypeMacro( fpa::Filters::Image::Mori, fpa::Filters::Algorithm ); itkGetConstMacro( InsideValue, TOutputValue ); itkSetMacro( InsideValue, TOutputValue ); itkGetConstMacro( MinimumThreshold, TInputValue ); itkSetMacro( MinimumThreshold, TInputValue ); public: TOutputValue GetOutsideValue( ) const; void SetOutsideValue( const TOutputValue& v ); unsigned long GetSignalKernelSize( ) const; void SetSignalKernelSize( unsigned long k ); double GetSignalThreshold( ) const; void SetSignalThreshold( double t ); double GetSignalInfluence( ) const; void SetSignalInfluence( double i ); void ClearThresholds( ); void AddThreshold( const TInputValue& thr ); void SetThresholds( const TInputValue& lower, const TInputValue& upper, const TInputValue& delta ); const TThresholds& GetThresholds( ) const; unsigned long GetNumberOfEvaluatedThresholds( ) const; TInputValue GetOptimumThreshold( ) const; void GetSignalValues( unsigned long i, double& x, double& y, TPeak& p ) const; protected: Mori( ); virtual ~Mori( ); virtual void _BeforeGenerateData( ); virtual void _Reinitialize( ); virtual void _UpdateOutputValue( TNode& n ) override; virtual void _QueueClear( ) override; virtual TNode _QueuePop( ) override; virtual void _QueuePush( const TNode& n ) override; virtual unsigned long _QueueSize( ) const override; virtual void _ComputeOutputValue( TNode& n ) override; private: // Purposely not implemented. Mori( const Self& other ); Self& operator=( const Self& other ); protected: typename TPredicate::Pointer m_Predicate; TOutputValue m_InsideValue; TInputValue m_MinimumThreshold; TThresholds m_Thresholds; typename TThresholds::const_iterator m_CurrThr; TQueue m_Queues[ 2 ]; unsigned int m_CurrQueue; double m_CurrCount; TPeakDetector m_PeakDetector; }; } // ecapseman } // ecapseman #ifndef ITK_MANUAL_INSTANTIATION # include #endif // ITK_MANUAL_INSTANTIATION #endif // __fpa__Filters__Mori__h__ // eof - $RCSfile$