ITK  4.12.0
Insight Segmentation and Registration Toolkit
WikiExamples/SpectralAnalysis/CrossCorrelationInFourierDomain.cxx
#include "itkImage.h"
#if ITK_VERSION_MAJOR < 4
#include "itkVnlFFTRealToComplexConjugateImageFilter.h"
#include "itkVnlFFTComplexConjugateToRealImageFilter.h"
#else
#endif
#if ITK_VERSION_MAJOR < 4
#include "itkRealAndImaginaryToComplexImageFilter.h"
#else
#endif
int main(int argc, char*argv[])
{
const unsigned int Dimension = 2;
typedef float PixelType;
typedef itk::Image< PixelType, Dimension > FloatImageType;
typedef itk::Image< unsigned char, Dimension > UnsignedCharImageType;
if( argc < 3 )
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " FixedImage MovingImage"<< std::endl;;
return EXIT_FAILURE;
}
std::string fixedImageFilename = argv[1];
std::string movingImageFilename = argv[2];
// Read the input images
typedef itk::ImageFileReader< FloatImageType > ImageReaderType;
fixedImageReader->SetFileName( fixedImageFilename );
fixedImageReader->Update();
movingImageReader->SetFileName( movingImageFilename );
movingImageReader->Update();
// Shift the input images
fixedFFTShiftFilter->SetInput(fixedImageReader->GetOutput());
fixedFFTShiftFilter->Update();
movingFFTShiftFilter->SetInput(movingImageReader->GetOutput());
movingFFTShiftFilter->Update();
// Compute the FFT of the input
#if ITK_VERSION_MAJOR < 4
typedef itk::VnlFFTRealToComplexConjugateImageFilter< FloatImageType > FFTFilterType;
#else
#endif
fixedFFTFilter->SetInput( fixedFFTShiftFilter->GetOutput() );
fixedFFTFilter->Update();
movingFFTFilter->SetInput( movingFFTShiftFilter->GetOutput() );
typedef FFTFilterType::OutputImageType SpectralImageType;
// Take the conjugate of the fftFilterMoving
// Extract the real part
realFilter->SetInput(movingFFTFilter->GetOutput());
// Extract the imaginary part
imaginaryFilter->SetInput(movingFFTFilter->GetOutput());
// Flip the sign of the imaginary and combine with the real part again
#if ITK_VERSION_MAJOR < 4
#else
#endif
#if ITK_VERSION_MAJOR < 4
flipSignFilter->SetConstant(-1);
#else
flipSignFilter->SetConstant2(-1);
#endif
flipSignFilter->SetInput(imaginaryFilter->GetOutput());
#if ITK_VERSION_MAJOR < 4
typedef itk::RealAndImaginaryToComplexImageFilter<FloatImageType> RealImageToComplexFilterType;
#else
typedef itk::ComposeImageFilter<FloatImageType, SpectralImageType> RealImageToComplexFilterType;
#endif
conjugateFilter->SetInput1(realFilter->GetOutput());
conjugateFilter->SetInput2(flipSignFilter->GetOutput());
// The conjugate product of the spectrum
typedef itk::MultiplyImageFilter< SpectralImageType,
SpectralImageType,
SpectralImageType > MultiplyFilterType;
multiplyFilter->SetInput1( fixedFFTFilter->GetOutput() );
multiplyFilter->SetInput2( conjugateFilter->GetOutput() );
// IFFT
#if ITK_VERSION_MAJOR < 4
typedef itk::VnlFFTComplexConjugateToRealImageFilter< SpectralImageType > IFFTFilterType;
#else
#endif
fftInverseFilter->SetInput( multiplyFilter->GetOutput() );
// Write the spectrum
rescaler->SetInput( fftInverseFilter->GetOutput() );
rescaler->SetOutputMinimum(0);
rescaler->SetOutputMaximum(255);
rescaler->Update();
writer->SetFileName( "CrossCorr.png" );
writer->SetInput( rescaler->GetOutput() );
writer->Update();
ImageCalculatorFilterType;
ImageCalculatorFilterType::Pointer imageCalculatorFilter
imageCalculatorFilter->SetImage(rescaler->GetOutput());
imageCalculatorFilter->Compute();
UnsignedCharImageType::IndexType maximumLocation = imageCalculatorFilter->GetIndexOfMaximum();
std::cout << maximumLocation << std::endl; // should be (17,15)
/*
if ypeak < size(I,1)/2 ypeak = -(ypeak-1);
else ypeak = size(I,1) - (ypeak-1);
end
if xpeak < size(I,2)/2 xpeak = -(xpeak-1);
else xpeak = size(I,2) - (xpeak-1);
end
*/
return EXIT_SUCCESS;
}