就不磨叽了,直接上代码。
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkWrapPadImageFilter.h"
#include "itkForwardFFTImageFilter.h"
#include "itkComplexToModulusImageFilter.h"
#include "itkIntensityWindowingImageFilter.h"
#include "itkFFTShiftImageFilter.h"
int main( int argc, char* argv[] )
{
const char * inputFileName = "F:\\DIPcode\\SIMC\\imagesrc\\2.jpg";//argv[1];
const char * outputFileName = "F:\\DIPcode\\SIMC\\my.tif";//argv[2];
const unsigned int Dimension = 2;
//typedef unsigned char PixelType;
typedef float PixelType;//定义像素类型。
typedef itk::Image< PixelType, Dimension > RealImageType;
typedef itk::ImageFileReader< RealImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( inputFileName );
typedef itk::ForwardFFTImageFilter< RealImageType > ForwardFFTFilterType;
typedef ForwardFFTFilterType::OutputImageType ComplexImageType;
ForwardFFTFilterType::Pointer forwardFFTFilter = ForwardFFTFilterType::New();
forwardFFTFilter->SetInput( reader->GetOutput() );
//计算复图像的系数。
typedef itk::ComplexToModulusImageFilter< ComplexImageType, RealImageType >
ComplexToModulusFilterType;
ComplexToModulusFilterType::Pointer complexToModulusFilter
= ComplexToModulusFilterType::New();
complexToModulusFilter->SetInput( forwardFFTFilter->GetOutput() );
// Window and shift the output for visualization.
typedef unsigned char OutputPixelType;//8位
//typedef unsigned short OutputPixelType;//16位
//在指定的范围内进行线性变换,低于该区域的映射为某一常数,高于高区域的映射为某一常数
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::IntensityWindowingImageFilter< RealImageType, OutputImageType >
WindowingFilterType;
WindowingFilterType::Pointer windowingFilter
= WindowingFilterType::New();
windowingFilter->SetInput( complexToModulusFilter->GetOutput() );
windowingFilter->SetWindowMinimum( 0 );
windowingFilter->SetWindowMaximum( 20000 );
//将四角的频率成分移动中心位置
typedef itk::FFTShiftImageFilter< OutputImageType, OutputImageType > FFTShiftFilterType;
FFTShiftFilterType::Pointer fftShiftFilter = FFTShiftFilterType::New();
fftShiftFilter->SetInput( windowingFilter->GetOutput() );
typedef itk::ImageFileWriter< OutputImageType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetFileName( outputFileName );
writer->SetInput( fftShiftFilter->GetOutput() );
try
{
writer->Update();
}
catch( itk::ExceptionObject & error )
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}