1:先进行FFT变换,再将图像进行逆变换,并对比两者的结果。
#include <tiffio.h> #include "fftw3.h" #include <stdio.h> #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkWrapPadImageFilter.h" #include "itkForwardFFTImageFilter.h" #include "itkCastImageFilter.h" #include "itkRescaleIntensityImageFilter.h" #include "itkComplexToModulusImageFilter.h" #include "itkIntensityWindowingImageFilter.h" #include "itkFFTShiftImageFilter.h" #pragma comment(lib, "libfftw3-3.lib") #pragma comment(lib, "libfftw3f-3.lib") #pragma comment(lib, "libfftw3l-3.lib") #define N 8 typedef itk:: Image<float , 2> FloatImageType; typedef itk ::Image< unsigned char , 2> UnsignedCharImageType; typedef float MatrixType; void CopyMatrix(FloatImageType:: Pointer image , MatrixType **mask); void CopyImage(FloatImageType:: Pointer image , fftw_complex *mask); void CopyRealImage (FloatImageType:: Pointer image , float ** mask);//仅仅拷贝实部 void MyCastFloatToUnsichar(FloatImageType::Pointer image, UnsignedCharImageType::Pointer imageNew );//将float转为unsigned char型 int main() { //读取图像 FloatImageType::Pointer image; const char * inputFileName = "F:\\DIPcode\\SIMC\\imagesrc\\2.jpg" ; //argv[1]; const char * outputFileName = "F:\\DIPcode\\SIMC\\2_new.tif" ; //argv[2]; typedef itk ::ImageFileReader< FloatImageType> ReaderType ; ReaderType::Pointer reader = ReaderType::New (); reader->SetFileName (inputFileName); reader->Update (); image = reader ->GetOutput(); //遍历图像像素,赋值到一个矩阵 MatrixType **pixelColors = new MatrixType*[512](); for (int i=0;i<512;i++) { pixelColors[i] = new MatrixType[512]; //为每个指针都分配8个char元素空间。 } CopyMatrix(image , pixelColors); int width =512; int height=512; fftw_plan planR; fftw_complex *inR, *outR, *resultR; //Allocate arrays. inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); resultR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); //Fill in arrays with the pixelcolors. for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { //int currentIndex = ((y * width) + (x)) * 3; int currentIndex = (y * width) + x; inR[y * width + x][0] = (double)pixelColors[y][x]; inR[y * width + x][1] = 0.0; } } //Forward plans. planR = fftw_plan_dft_2d(width, width, inR, outR, FFTW_FORWARD, FFTW_MEASURE); //Forward FFT. fftw_execute(planR); //Backward plans. fftw_plan planRR = fftw_plan_dft_2d(width, width, outR, resultR, FFTW_BACKWARD, FFTW_MEASURE); //Backward fft fftw_execute(planRR); //// Have to scale the output values to get back to the original. int size=height*width; for(int i = 0; i < size; i++) { resultR[i][0] = resultR[i][0] / size; resultR[i][1] = resultR[i][1] / size; } //Overwrite the pixelcolors with the result. for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { //int currentIndex = ((y * width) + (x)) * 3; pixelColors[y][x] =resultR[y * width + x][0];// //std::cout<<pixelColors[y][x]<<'\t'; } } //将图像写出来 CopyRealImage(image , pixelColors);//将pixelColors中的像素值复制到image中 //调整亮度 typedef itk ::RescaleIntensityImageFilter< FloatImageType , FloatImageType > RescaleFilterType; RescaleFilterType::Pointer imaginaryRescaleFilter = RescaleFilterType ::New(); imaginaryRescaleFilter->SetInput (image); imaginaryRescaleFilter->SetOutputMinimum (0); imaginaryRescaleFilter->SetOutputMaximum (255); imaginaryRescaleFilter->Update (); //转为8bit //类型转换,float转为8bit的。 typedef itk ::CastImageFilter< FloatImageType, UnsignedCharImageType > CastFilterType; CastFilterType::Pointer castFilter = CastFilterType::New (); castFilter->SetInput (imaginaryRescaleFilter->GetOutput()); castFilter->Update (); //将图像写出来 typedef itk ::ImageFileWriter< UnsignedCharImageType > WriterType ; WriterType::Pointer writer = WriterType::New (); writer->SetFileName ( outputFileName ); writer->SetInput (castFilter->GetOutput()); try { writer->Update (); } catch( itk ::ExceptionObject & error ) { std::cerr << "Error: " << error << std ::endl; return EXIT_FAILURE ; } delete []pixelColors; fftw_free(inR); fftw_free(outR); fftw_free(resultR); return 0; } void CopyMatrix(FloatImageType:: Pointer image , MatrixType **mask) { FloatImageType::RegionType region = image->GetLargestPossibleRegion (); FloatImageType::SizeType regionSize = region.GetSize (); for (int x=0; x<regionSize [0]; x++) for(int y=0; y<regionSize [1]; y++) { //3、定义像素索引 FloatImageType::IndexType index; index[0] = x ; index[1] = y ; mask[x][y] =(MatrixType) image->GetPixel(index);//获取该位置的像素值 } } void CopyImage(FloatImageType:: Pointer image , fftw_complex *mask) { FloatImageType::RegionType region = image->GetLargestPossibleRegion (); FloatImageType::SizeType regionSize = region.GetSize (); for (int x=0; x<regionSize [0]; x++) for(int y=0; y<regionSize [1]; y++) { double re = mask[x*regionSize[1]+y][0]; double im = mask[x*regionSize[1]+y][1]; double mag = sqrt (re*re + im*im); //3、定义像素索引 FloatImageType::IndexType index; index[0] = x ; index[1] = y ; image->SetPixel(index, mag);//获取该位置的像素值 } } //仅仅将mask中的值,赋给image中! void CopyRealImage (FloatImageType:: Pointer image , MatrixType ** mask) { FloatImageType::RegionType region = image->GetLargestPossibleRegion (); FloatImageType::SizeType regionSize = region.GetSize (); int Imgsize = regionSize[0]*regionSize[1]; for (int x=0; x<regionSize [0]; x++) for(int y=0; y<regionSize [1]; y++) { //3、定义像素索引 FloatImageType::IndexType index; index[0] = x ; index[1] = y ; image->SetPixel (index, mask[x ][y]); //获取该位置的像素值 //std::cout<<image->GetPixel(index); } } void MyCastFloatToUnsichar(FloatImageType::Pointer image, UnsignedCharImageType::Pointer imageNew )//将float转为unsigned char型 { FloatImageType::RegionType region = image->GetLargestPossibleRegion (); FloatImageType::SizeType regionSize = region.GetSize (); for (int x=0; x<regionSize [0]; x++) for(int y=0; y<regionSize [1]; y++) { //3、定义像素索引 FloatImageType::IndexType index; index[0] = x ; index[1] = y ; //std::cout<<image->GetPixel(index)<<'\t'; float temp = static_cast<unsigned char>(image->GetPixel(index)); //std::cout<<temp<<'\t'; imageNew->SetPixel (index, temp); int tt=imageNew->GetPixel(index); ////获取该位置的像素值 //std::cout<<tt<<'\t'; } }起初在不进行cast进行图像类型转换的时候,因为是float所以结果是32位的,但是直接对image进行cast,映射为unsigned char (8bit)之后,结果一片黑色,说明在进行映射过程中发生了数据截断。后来经过调整,先进行rescale亮度。再重新进行映射,则可以重建出其逆变换的结果。但是对比两者结果图还是有些不一样的。