// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Base__Mori__h__ #define __fpa__Base__Mori__h__ #include #include #include #include #include #include namespace fpa { namespace Base { /** */ template< class _TAlgorithm > class Mori : public _TAlgorithm { public: typedef Mori Self; typedef _TAlgorithm Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef typename _TAlgorithm::TNode TNode; typedef typename _TAlgorithm::TNodes TNodes; typedef typename _TAlgorithm::TInputValue TInputValue; typedef typename _TAlgorithm::TOutputValue TOutputValue; typedef typename _TAlgorithm::TFrontId TFrontId; typedef typename _TAlgorithm::TVertex TVertex; typedef std::deque< TNode > TQueue; typedef std::set< TInputValue > TThresholds; typedef ivq::ITK::PeakDetector TPeakDetector; typedef TPeakDetector::TPeak TPeak; typedef fpa::Base::Functors::RegionGrow::BinaryThreshold< TInputValue > TPredicate; public: itkConceptMacro( Check_TOutputValue, ( itk::Concept::IsUnsignedInteger< TOutputValue > ) ); itkGetConstMacro( InsideValue, TOutputValue ); itkSetMacro( InsideValue, TOutputValue ); itkGetConstMacro( MinimumThreshold, TInputValue ); itkSetMacro( MinimumThreshold, TInputValue ); public: virtual itk::ModifiedTimeType GetMTime( ) const override; TOutputValue GetOutsideValue( ) const; void SetOutsideValue( const TOutputValue& v ); unsigned long GetSignalKernelSize( ) const; double GetSignalThreshold( ) const; double GetSignalInfluence( ) const; void SetSignalKernelSize( unsigned long k ); void SetSignalThreshold( double t ); void SetSignalInfluence( double i ); void ClearThresholds( ); void AddThreshold( const TInputValue& thr ); void SetThresholds( const TInputValue& init, const TInputValue& end, 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( ) override; virtual void _FinishOneLoop( ) override; virtual void _ComputeOutputValue( TNode& n ) override; virtual void _UpdateOutputValue( TNode& n ) override; virtual void _QueueClear( ) override; virtual TNode _QueuePop( ) override; virtual void _QueuePush( const TNode& node ) override; virtual unsigned long _QueueSize( ) const override; virtual void _PrepareSeeds( TNodes& nodes ) 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__Base__Mori__h__ // eof - $RCSfile$