[ITK-users] 1D Complex To Complex FFT of a 2D Image

DVigneault davis.vigneault at gmail.com
Mon May 5 15:33:43 EDT 2014


All--

I would like to compute a 1D complex to complex FFT on each line of a 2D
image.  I'm working from  Luis's response to a similar question
<http://www.itk.org/pipermail/insight-users/2007-May/022250.html>  ,  this
basic example from the FFTW manual
<http://www.fftw.org/fftw3_doc/Complex-One_002dDimensional-DFTs.html#Complex-One_002dDimensional-DFTs> 
, and the FFTWComplexToComplexImageFilter.hxx source code.  However, when I
try to assign the plan, I get a segmentation fault.

So, my questions are:

1.  Is there an existing filter or method for doing this in ITK that I've
missed?
2.  If there is not a filter, is there a better way of approaching the
problem than I've laid out in the code below?
3.  If not, can anyone see why the code is seg faulting?

Thank you all very much in advance!

###########
## The Code ##
###########

// Headers
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include <fftw3.h>
#include
"/Users/Davis/Developer/ITK/dv-headers/dvVisualizeComplexSpectrumImageFilter.h"

// Image definitions
const unsigned int             Dimension = 2;
typedef unsigned short         OutputPixelType;
typedef std::complex< double > ComplexPixelType;
typedef itk::Image< ComplexPixelType, Dimension > ComplexImageType;
typedef itk::Image< OutputPixelType, Dimension >  OutputImageType;

// Input and output
typedef itk::ImageFileWriter< OutputImageType > WriterType;
typedef itk::ImageFileReader< ComplexImageType > InputReaderType;

typedef itk::VisualizeComplexSpectrumImageFilter< ComplexImageType,
OutputImageType > VisualizeSpectrumType;

int main( int argc, char * argv[] )
{
	
	if( argc != 2 )
    {
        std::cerr << "Usage: " << argv[0] << " path/to/input.png" <<
std::endl;
        std::cerr << "Example: ../data/input/tagged_image.png" << std::endl;
        return EXIT_FAILURE;
    }
	
	const char * inputFileName = argv[1];
	unsigned int FFTDimension = 0;
	unsigned int NonFFTDimension = 1;
	
	// Read in the input image
    InputReaderType::Pointer inputReader = InputReaderType::New();
    inputReader->SetFileName( inputFileName );
    inputReader->Update();
    
    ComplexImageType::Pointer input = ComplexImageType::New();
    input = inputReader->GetOutput();
    input->Update();

    // Create an empty image to paste the output in
    ComplexImageType::Pointer output = ComplexImageType::New();
	output->CopyInformation( input );
	output->Allocate();
	output->FillBuffer( std::complex<double> (0, 0) );
	output->Update();
	
	// Create a region that is ONE ROW of the image
	// You will modify the index to loop through the image
	ComplexImageType::SizeType size;
	size.Fill( 1 );
	size[FFTDimension] =
input->GetLargestPossibleRegion().GetSize()[FFTDimension];
	
	ComplexImageType::IndexType index;
	index.Fill( 0 );
	
	ComplexImageType::RegionType region;
	region.SetSize( size );
	// Note that the index is not set until the loop
	
	unsigned short i = 0;
	fftw_complex *in, *out;
	fftw_plan p;
	
	while( i <= size[NonFFTDimension] - 1) {
	
		index[NonFFTDimension] = i;
		region.SetIndex( index );
		
		input->SetRequestedRegion( region );
		input->SetBufferedRegion( input->GetRequestedRegion() );
		
		output->SetRequestedRegion( region );
		output->SetBufferedRegion( input->GetRequestedRegion() );
		
		in = reinterpret_cast<fftw_complex *>(input->GetBufferPointer());
		out = reinterpret_cast<fftw_complex *>(output->GetBufferPointer());
		
		std::cout << size[FFTDimension] << std::endl; // 160
		std::cout << in << std::endl; // 0x103aef000
		std::cout << out << std::endl; // 0x7f8af48f2d20
		std::cout << FFTW_FORWARD << std::endl; // -1
		std::cout << FFTW_ESTIMATE << std::endl; // 64
		
		p = fftw_plan_dft_1d(size[FFTDimension], in, out, FFTW_FORWARD,
FFTW_ESTIMATE); // Segmentation Fault: 11
		// When I run this with gdb, I get:
		// Program received signal EXC_BAD_ACCESS, Could not access memory.
		// Reason: 13 at address: 0x0000000000000000
		// 0x00000001009f4f8e in n1_8 ()
        
        fftw_execute(p); // Doesn't run because of the segfault
		
		i = i + 1;
	
	}
    
    //////////////
    // Write it //
    //////////////
    
    VisualizeSpectrumType::Pointer vis = VisualizeSpectrumType::New();
    vis->SetInput( output );
    vis->Update();
    
    WriterType::Pointer writer = WriterType::New();
    writer->SetInput( vis->GetOutput() );
    writer->SetFileName( "../data/output/out.png" );
    writer->Update();
 
  return EXIT_SUCCESS;
  
}



--
View this message in context: http://itk-insight-users.2283740.n2.nabble.com/1D-Complex-To-Complex-FFT-of-a-2D-Image-tp7585494.html
Sent from the ITK Insight Users mailing list archive at Nabble.com.


More information about the Insight-users mailing list