#define __CPEXTENSIONS__ALGORITHMS__IMAGEFUNCTIONFILTER__H__
#include <itkImageToImageFilter.h>
-#include <itkImageScanlineConstIterator.h>
-#include <itkImageScanlineIterator.h>
-#include <itkProgressReporter.h>
namespace cpExtensions
{
{
/**
*/
- template< class I, class O, class F >
+ template< class _TInput, class _TOutput, class _TFunction >
class ImageFunctionFilter
- : public itk::ImageToImageFilter< I, O >
+ : public itk::ImageToImageFilter< _TInput, _TOutput >
{
public:
- typedef ImageFunctionFilter Self;
- typedef itk::ImageToImageFilter< I, O > Superclass;
- typedef itk::SmartPointer< Self > Pointer;
- typedef itk::SmartPointer< const Self > ConstPointer;
+ typedef ImageFunctionFilter Self;
+ typedef itk::ImageToImageFilter< _TInput, _TOutput > Superclass;
+ typedef itk::SmartPointer< Self > Pointer;
+ typedef itk::SmartPointer< const Self > ConstPointer;
- typedef I TInputImage;
- typedef O TOutputImage;
- typedef F TFunction;
+ typedef _TInput TInput;
+ typedef _TOutput TOutput;
+ typedef _TFunction TFunction;
- typedef typename O::RegionType TRegion;
+ typedef typename TOutput::RegionType TRegion;
public:
itkNewMacro( Self );
itkTypeMacro( ImageFunctionFilter, itkImageToImageFilter );
- itkGetObjectMacro( Function, F );
- itkSetObjectMacro( Function, F );
+ itkGetObjectMacro( Function, TFunction );
+ itkSetObjectMacro( Function, TFunction );
protected:
- ImageFunctionFilter( )
- : Superclass( )
- {
- }
- virtual ~ImageFunctionFilter( )
- {
- }
+ ImageFunctionFilter( );
+ virtual ~ImageFunctionFilter( );
+ virtual void BeforeThreadedGenerateData( ) ITK_OVERRIDE;
virtual void ThreadedGenerateData(
const TRegion& region,
itk::ThreadIdType threadId
- )
- {
- const typename TRegion::SizeType& regionSize = region.GetSize( );
- if( regionSize[ 0 ] == 0 )
- return;
- const I* in = this->GetInput( );
- O* out = this->GetOutput( 0 );
-
- const size_t nLines = region.GetNumberOfPixels( ) / regionSize[ 0 ];
- itk::ProgressReporter progress( this, threadId, nLines );
-
- // Define the iterators
- itk::ImageScanlineConstIterator< I > inIt( in, region );
- itk::ImageScanlineIterator< O > outIt( out, region );
-
- inIt.GoToBegin( );
- outIt.GoToBegin( );
- while( !inIt.IsAtEnd( ) )
- {
- while( !inIt.IsAtEndOfLine( ) )
- {
- outIt.Set( this->m_Function->EvaluateAtIndex( inIt.GetIndex( ) ) );
- ++inIt;
- ++outIt;
-
- } // elihw
- inIt.NextLine( );
- outIt.NextLine( );
- progress.CompletedPixel( );
-
- } // elihw
- }
+ ) ITK_OVERRIDE;
private:
// Purposely not implemented.
void operator=( const Self& );
protected:
- typename F::Pointer m_Function;
+ typename TFunction::Pointer m_Function;
};
} // ecapseman
} // ecapseman
#ifndef ITK_MANUAL_INSTANTIATION
-// TODO: #include <cpExtensions/Algorithms/ImageFunctionFilter.hxx>
+#include <cpExtensions/Algorithms/ImageFunctionFilter.hxx>
#endif // ITK_MANUAL_INSTANTIATION
#endif // __CPEXTENSIONS__ALGORITHMS__IMAGEFUNCTIONFILTER__H__
--- /dev/null
+// -------------------------------------------------------------------------
+// @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
+// -------------------------------------------------------------------------
+
+#ifndef __CPEXTENSIONS__ALGORITHMS__IMAGEFUNCTIONFILTER__HXX__
+#define __CPEXTENSIONS__ALGORITHMS__IMAGEFUNCTIONFILTER__HXX__
+
+#include <itkMacro.h>
+#include <itkImageRegionConstIteratorWithIndex.h>
+#include <itkImageRegionIteratorWithIndex.h>
+#include <itkProgressReporter.h>
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TOutput, class _TFilter >
+cpExtensions::Algorithms::ImageFunctionFilter< _TInput, _TOutput, _TFilter >::
+ImageFunctionFilter( )
+ : Superclass( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TOutput, class _TFilter >
+cpExtensions::Algorithms::ImageFunctionFilter< _TInput, _TOutput, _TFilter >::
+~ImageFunctionFilter( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TOutput, class _TFilter >
+void cpExtensions::Algorithms::ImageFunctionFilter< _TInput, _TOutput, _TFilter >::
+BeforeThreadedGenerateData( )
+{
+ if( this->m_Function.IsNull( ) )
+ itkExceptionMacro( << "Please set a valid itk::ImageFunction" );
+ this->m_Function->SetInputImage( this->GetInput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TOutput, class _TFilter >
+void cpExtensions::Algorithms::ImageFunctionFilter< _TInput, _TOutput, _TFilter >::
+ThreadedGenerateData( const TRegion& region, itk::ThreadIdType threadId )
+{
+ const typename TRegion::SizeType& regionSize = region.GetSize( );
+ if( regionSize[ 0 ] == 0 )
+ return;
+ const _TInput* in = this->GetInput( );
+ _TOutput* out = this->GetOutput( 0 );
+
+ itk::ProgressReporter pr( this, threadId, region.GetNumberOfPixels( ) );
+
+ // Define the iterators
+ itk::ImageRegionConstIteratorWithIndex< TInput > iIt( in, region );
+ itk::ImageRegionIteratorWithIndex< TOutput > oIt( out, region );
+
+ iIt.GoToBegin( );
+ oIt.GoToBegin( );
+ for( ; !iIt.IsAtEnd( ) && !oIt.IsAtEnd( ); ++iIt, ++oIt )
+ {
+ oIt.Set( this->m_Function->EvaluateAtIndex( iIt.GetIndex( ) ) );
+ pr.CompletedPixel( );
+
+ } // rof
+}
+
+#endif // __CPEXTENSIONS__ALGORITHMS__IMAGEFUNCTIONFILTER__HXX__
+
+// eof - $RCSfile$