[ITK-users] it.IsAtEnd() is true immediately after setting it.GoToBegin()

DVigneault davis.vigneault at gmail.com
Tue Apr 15 10:28:59 EDT 2014


All--

In connection with my previous  phase unwrapping question
<http://itk-users.7.n7.nabble.com/Is-there-a-phase-unwrapping-filter-in-ITK-td33731.html> 
, I'm trying to write a filter with the following structure:

--Take the vnl forward Fourier transform
--Alter the pixel values using itkImageRegionIteratorWithIndex
--Take the vnl inverse Fourier transform
--Multiply by a constant

However, in the second step, it.IsAtEnd() is true immediately after setting
it.GoToBegin(), suggesting that I've done something wrong in assigning the
output of the vnl forward FFT to the pointer that I'm trying to iterate
over.

Does anyone see where I've gone wrong?

Best,

--Davis

*** Code ***

#ifndef DV_FORWARDLAPLACIANIMAGEFILTER_H
#define DV_FORWARDLAPLACIANIMAGEFILTER_H

#include "itkImageToImageFilter.h"
#include "itkVnlForwardFFTImageFilter.h"
#include "itkVnlInverseFFTImageFilter.h"
#include "itkMultiplyImageFilter.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "vnl/vnl_math.h"

namespace itk {

template < typename TWorkImage >
class ITK_EXPORT ForwardLaplacianImageFilter :
public ImageToImageFilter< TWorkImage, TWorkImage >
{
public:

//  Standard declarations
//  Used for object creation with the object factory:

  typedef ForwardLaplacianImageFilter                  Self;
  typedef ImageToImageFilter< TWorkImage, TWorkImage > Superclass;
  typedef SmartPointer<Self>                           Pointer;
  typedef SmartPointer<const Self>                     ConstPointer;
  
  // Typedefs
	typedef TWorkImage                        WorkImageType;
	typedef std::complex< double >            ComplexPixelType;
	typedef itk::Image< ComplexPixelType, 2 > ComplexImageType;

  /** Method for creation through object factory */
  itkNewMacro(Self);

  /** Run-time type information */
  itkTypeMacro(ForwardLaplacianImageFilter, ImageToImageFilter);

  /** Display */
  void PrintSelf( std::ostream& os, Indent indent ) const;

protected:

  ForwardLaplacianImageFilter();

//  Declare the component filter types:

protected:

	typedef VnlForwardFFTImageFilter< WorkImageType, ComplexImageType >
ForwardFFTType;
	typedef VnlInverseFFTImageFilter< ComplexImageType, WorkImageType >
InverseFFTType;
	typedef MultiplyImageFilter< WorkImageType, WorkImageType, WorkImageType >
MultiplyType;
	typedef ImageRegionIteratorWithIndex< ComplexImageType > ItType;
	
    void GenerateData();

private:

  ForwardLaplacianImageFilter(Self&);   // intentionally not implemented
  void operator=(const Self&);          // intentionally not implemented

//  Component filters are declared as data members, all using the smart
//  pointer types.

	typename ForwardFFTType::Pointer m_FFT_Forward;
	typename InverseFFTType::Pointer m_FFT_Inverse;
	typename MultiplyType::Pointer   m_Multiply;

};

}

//  The constructor sets up the pipeline, which involves creating the
//  stages, connecting them together, and setting default parameters.

namespace itk
{

template < typename WorkImageType >
ForwardLaplacianImageFilter< WorkImageType >::ForwardLaplacianImageFilter()
{
	
	m_FFT_Forward = ForwardFFTType::New();
	m_FFT_Inverse = InverseFFTType::New();
	m_Multiply =    MultiplyType::New();
	
}

template < typename WorkImageType >
void
ForwardLaplacianImageFilter< WorkImageType >::GenerateData()
{

	// Description:
	// 		Take the FORWARD Fourier transform
	//		Modify the values
	// 		Take the INVERSE Fourier transform
	//		Multiply by a constant
	
	// Set the input to the filter to the forward FFT
	m_FFT_Forward->SetInput( this->GetInput() );
	
	// Assign the output of this filter to a pointer
	ComplexImageType::Pointer fourierImage = m_FFT_Forward->GetOutput();
	
	// Iterate over this image to modify the values based on the indices
	ItType fourierIt(fourierImage, fourierImage->GetLargestPossibleRegion() );
    fourierIt.GoToBegin();
    std::complex< double > a( 4, 0 );
    
    // IsAtEnd() seems to be true, even though we're at the beginning
    // Does this mean that the FFT output wasn't really assigned?
    std::cout << fourierIt.IsAtEnd() << std::endl; // Prints "1"
    
    // The while loop is not executed, as fourierIt.IsAtEnd() is true from
the start
    while ( !fourierIt.IsAtEnd() ) {
    	fourierIt.Set( a );
    	std::cout << fourierIt.Get() << std::endl; // Doesn't print
    	++fourierIt;
    }
	
	// Assign that pointer to the inverse FFT filter
	m_FFT_Inverse->SetInput( fourierImage );
	
	// Multiply by a constant
	m_Multiply->SetInput1( m_FFT_Inverse->GetOutput() );
	m_Multiply->SetConstant( 2*pow(vnl_math::pi, 2)/pow(160, 2) );
	
	// Assign the output of the multiplication filter to the output of this
filter
	m_Multiply->GraftOutput( this->GetOutput() );
	m_Multiply->Update();
	this->GraftOutput( m_Multiply->GetOutput() );
	
}

//  PrintSelf method prints parameters

template < typename WorkImageType >
void
ForwardLaplacianImageFilter< WorkImageType >::PrintSelf( std::ostream& os,
Indent indent ) const
{
  Superclass::PrintSelf(os,indent);

  os
    << indent << "No parameters."
    << std::endl;
}

} /* end namespace itk */

#endif

*** End Code ***



--
View this message in context: http://itk-users.7.n7.nabble.com/it-IsAtEnd-is-true-immediately-after-setting-it-GoToBegin-tp33751.html
Sent from the ITK - Users mailing list archive at Nabble.com.


More information about the Insight-users mailing list