Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ExampleFFT2D.cpp
1 /* This file is part of the BIAS library (Basic ImageAlgorithmS).
2 
3  Copyright (C) 2003-2009 (see file CONTACT for details)
4  Multimediale Systeme der Informationsverarbeitung
5  Institut fuer Informatik
6  Christian-Albrechts-Universitaet Kiel
7 
8 
9  BIAS is free software; you can redistribute it and/or modify
10  it under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation; either version 2.1 of the License, or
12  (at your option) any later version.
13 
14  BIAS is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  along with BIAS; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/
22 
23 
24 /**
25  * @example ExampleFFT2D.cpp
26  @relates FFT2D
27  @brief Example for using the fast fourier Transform (FFT)
28  @ingroup g_examples
29  @author MIP
30 */
31 
32 #include <Image/FFT2D.hh>
33 #include <Base/Image/Image.hh>
34 #include <Base/Image/ImageIO.hh>
35 #include <Base/Image/ImageConvert.hh>
36 #include <Base/Debug/TimeMeasure.hh>
37 
38 
39 using namespace std;
40 using namespace BIAS;
41 
42 
43 int main(int argc, char *argv[])
44 {
45  TimeMeasure StopWatch;
46 
47  if (argc<2 || argc > 3){
48  cerr << argv[0] << " <image> [image2]\n";
49  return -1;
50  }
51 
52  Image<unsigned char> im1, im1grey;
53 
54  if (ImageIO::Load(argv[1], im1)!=0){
55  BIASERR("error loading image "<<argv[1]);
56  return -2;
57  }
58 
59  ImageConvert::ToGrey(im1,im1grey);
60  //ImageIO::Save("0_Grey1",im1grey);
61  ImageIO::Save("0_Grey1",im1grey);
62 
64  fft.Init(im1grey.GetWidth(),im1grey.GetHeight());
65 
66  Image<float> i,r,m,p;
67  Image<float> test;
68  StopWatch.Start();
69  // for (unsigned int k=0;k<100;k++)
70  fft.Filter(im1grey,r,i);
71  StopWatch.Stop();
72  cout <<"FFT Forward took [ms] :"<<StopWatch.GetRealTime()/1000<<endl;;
73 
74  fft.Filter(im1grey, test);
75  fft.Normalize(test);
76  Image<unsigned char> revTrans;
77  fft.TransformReverse(test, revTrans);
78  ImageIO::Save("revTrans.mip", revTrans);
79 
80  ImageIO::Save("1_Imaginaer1",i);
81  ImageIO::Save("1_Real1",r);
82 
83  fft.TransformPhase(im1grey,p);
84  fft.TransformAbs(im1grey,m);
85  // fft.Normalize(m);
86  ImageIO::Save("2_M1",m);
87  //ImageIO::Write("2_P1",p);
88 
89  if(argc == 3){
90  Image<unsigned char> im2, im2grey,res;
91  Image<float> cps;
92  if (ImageIO::Load(argv[2], im2)!=0){
93  BIASERR("error loading image "<<argv[2]);
94  return -2;
95  }
96  if((im1.GetWidth() != im2.GetWidth()) ||
97  (im1.GetHeight() != im2.GetHeight())){
98  BIASERR("images must have same size!");
99  return -2;
100  }
101  ImageConvert::ToGrey(im2,im2grey);
102  //ImageIO::Save("0_Grey2",im2grey);
103  ImageIO::Save("0_Grey2",im2grey);
104 
105  fft.Filter(im2grey,r,i);
106  //ImageIO::Save("1_Imaginaer2",i);
107  //ImageIO::Save("1_Real2",r);
108  ImageIO::Save("1_Imaginaer2",i);
109  ImageIO::Save("1_Real2",r);
110  //ImageIO::Save("1_Hanning2",im2grey);
111 
112  //fft.TransformPhase(im2grey,p);
113  //fft.TransformAbs(im2grey,m);
114  //fft.Normalize(m);
115  //ImageIO::Save("2_M2",m);
116  //ImageIO::Save("2_P2",p);
117 
118  fft.CrossPowerSpectrum(im1grey,im2grey,cps);
119  //ImageIO::Save("2_CPS",cps);
120  ImageIO::Save("2_CPS",cps);
121  //ImageIO::Save("2_M_Norm",m);
122  //fft.Normalize(cps);
123  //fft.Normalize(cps);
124  //ImageIO::Save("3_Normalized",cps);
125  fft.TransformReverse(cps,res);
126  //ImageIO::Save("4_Resolution",res);
127  ImageIO::Save("4_Resolution",res);
128 
129  }
130 
131 
132 
133 /*
134  // transform to 2-channel image for complex representation
135  fft.Filter(imgrey,res);
136  ImageIO::Save("1_FFT2D_Filter",res);
137  fft.Normalize(res);
138  ImageIO::Save("2_FFT2D_Normalized",res);
139  fft.TransformReverse(res,imgrev);
140  ImageIO::Save("3_FFT2D_Reversed",imgrev);
141 */
142 /*
143  // transform to 2 image (1 channel per image) for complex representation
144  fft.Filter(im1grey,r1,r2);
145  ImageIO::Save("4_FFT2D_real",r1);
146  ImageIO::Save("5_FFT2D_im",r2);
147 
148  fft.Normalize(r1);
149  fft.Normalize(r2);
150  ImageIO::Save("6_FFT2D_real_norm",r1);
151  ImageIO::Save("7_FFT2D_im_norm",r2);
152 
153  // transform to 1 image with 1 channel, magnitude and phase
154  fft.TransformAbs(im1grey,res);
155  ImageIO::Save("8_FFT2D_magnitude",res);
156  fft.MultHanning(res);
157  ImageIO::Save("8_FFT2D_magnitude_hanning",res);
158  fft.Normalize(res);
159  ImageIO::Save("8_FFT2D_magnitude_norm",res);
160 
161  fft.TransformPhase(im1grey,res);
162  ImageIO::Save("9_FFT2D_phase",res);
163  fft.Normalize(res);
164  ImageIO::Save("9_FFT2D_phase_norm",res);
165 */
166  return 0;
167 }
168 
unsigned int GetWidth() const
Definition: ImageBase.hh:312
virtual int TransformAbs(const Image< InputStorageType > &src, Image< OutputStorageType > &dst)
Transform forward and get absolute value from complex result The result is not normalized! ...
Definition: FFT2D.cpp:202
unsigned int GetHeight() const
Definition: ImageBase.hh:319
double GetRealTime() const
return real time (=wall time clock) in usec JW For Win32: real-time is measured differently from user...
void Init(int width, int height)
initializes for forward transformation on complete image.
Definition: FFT2D.cpp:57
virtual int TransformPhase(const Image< InputStorageType > &src, Image< OutputStorageType > &dst)
dstX.GetChannelCount()==src.GetCHannelCount()
Definition: FFT2D.cpp:240
virtual int Filter(const Image< InputStorageType > &src, Image< OutputStorageType > &dst)
dst.GetChannelCount()==2*src.GetCHannelCount() The result is not normalized!
Definition: FFT2D.cpp:156
virtual int CrossPowerSpectrum(const Image< InputStorageType > &src1, const Image< InputStorageType > &src2, Image< OutputStorageType > &dst1)
Definition: FFT2D.cpp:273
virtual int Normalize(Image< OutputStorageType > &dst)
Normalize output after transformation.
Definition: FFT2D.cpp:258
Wrapper to the fftw3 library adapted for 2D image filtering.
Definition: FFT2D.hh:50
virtual int TransformReverse(const Image< OutputStorageType > &src, Image< InputStorageType > &dst)
Transform reverse, src must be of _SizeX,_OutSizeY,2.
Definition: FFT2D.cpp:311
class TimeMeasure contains functions for timing real time and cpu time.
Definition: TimeMeasure.hh:111