#include #include #include #include #include #include #include using namespace std; using namespace Magick; double pi=3.1415; PixelPacket* pixels; int c,r; complex inpixels[512][512]; int squaresize; bool imageloaded=false; double fftout[512][512]; Image* image; Pixels* view; complex* t,t1; double* s,s1; timeval t1,t2; void startwatch() { cout << "\n Stopwatch started..." << flush; gettimeofday(&t1,NULL); } void stopwatch() { gettimeofday(&t2,NULL); long timediff=(t2.tv_sec-t1.tv_sec)*1000000 + (t2.tv_usec-t1.tv_usec); cout << "\nTime Taken : " << timediff << flush; } class ImageFFT { private: complex a[512]; complex A[512]; // Bit reverse an integer int rev(int k,int b) { char a[b],i; for(i=0;i=0;i--) { k+=a[i]*s; s*=2; } return k; } //____________Bit reverse an array - n is the size of array___ void bitrev(int n) { int ln=(int)ceil(log(n)/log(2)); for(int i=0;i Inverse FFT void fft(int n,int mode=1) { bitrev(n); int ln=(int)ceil(log(n)/log(2)); complex t,u; int s,j,k; for(s=1;s<=ln;s++) { int m=(int)pow(2,s); complex wm(cos(2*pi/m),sin(mode*2*pi/m)); complex w(1,0); for(j=0;j<=m/2-1;j++) { for(k=j;k<=n-1;k+=m) { t=w*A[k+m/2]; u=A[k]; A[k]=u+t; A[k+m/2]=u-t; } w=w*wm; } } if(mode==-1) { for(int i=0;i> choice; if(choice!='y' && choice!='Y') return; cout << "Enter filename : " ; cin >> buffer; } Image fspectrum(Geometry(c,r),"white"); fspectrum.classType(DirectClass); fspectrum.quantizeColorSpace(GRAYColorspace); Pixels fview(fspectrum); PixelPacket *fpixels = fview.get(0,0,c,r); for(int x=0;xclassType(DirectClass); view =new Pixels(*image); c=image->columns(); r=image->rows(); int i,j; // convert image to grayscale image->classType(DirectClass); image->quantizeColorSpace(GRAYColorspace); pixels=view->get(0,0,c,r); // assume square image squaresize=r >c ? r : c; squaresize=(int)pow(2,(int)(log(squaresize)/log(2))+1); imageloaded=true; } void pixelsToComplex() { int i,j; for(i=0;i(pow(-1,i+j)* ( (ColorGray)*(pixels+i*c+j) ).shade(),0); else inpixels[i][j]=complex(0,0); } } //pixels-=i*j; } void displayFourier(int squaresize) { int i,j; double max=0; for(int i=0; i max) max = fftout[i][j]; } //normalize from 0 to 1 for(int i=0; i max) max = fftout[i][j]; } //normalize for(int i=0; i> size; int ln=(int)(log(size+1)/log(2)); size=pow(2,ln); fstream perf; perf.open("perf.txt",ios::out); ImageFFT fft; for(i=0;i<=ln;i++) { int j=pow(2,i); timeval t1,t2; gettimeofday(&t1,NULL); fft.DoImageFFT(j,j,1); gettimeofday(&t2,NULL); long timediff=(t2.tv_sec-t1.tv_sec)*1000000 + (t2.tv_usec-t1.tv_usec); cout << "\n" << j << "\t" << timediff; perf << "\n" << j << "\t" << timediff; } perf.close(); } void main(int argc,char* argv[]) { int choice; do { cout << "\n\n"; cout << " MAIN MENU \n"; cout << "------------------------------------"; cout << "\n\n\n"; cout << "1. Load image and compute Fourier Transform\n"; cout << "2. Display image\n"; cout << "3. Dynamic Range Compression for fourier transform\n"; cout << "4. Ideal Low Pass\n"; cout << "5. Ideal High Pass\n"; cout << "6. Butterworth Low Pass\n"; cout << "7. Butterworth High Pass\n"; cout << "8. Do Translation for Fourier Transform\n"; cout << "9. Do Rotation for Fourier Transform\n"; cout << "10. Write Performance report for 2D FFT\n"; cout << "15. Exit\n"; cout << "\n\nEnter choice : "; cin >> choice; char filename[80]; ImageFFT fft; double h; int mx,my; double f; int n; switch(choice) { case 1: cout << "\nEnter filename : "; cin >> filename; loadimage(filename); imageloaded=true; //pixelsToComplex(); //___Init data break; case 2: if(imageloaded) image->display(); else cout << "\nNo image loaded..."; break; case 3: cout << "Doing Fourier Transform..." << flush; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); stopwatch(); //cout << "\nEnter filename : "; //cin >> filename; displayFourier(squaresize); break; case 4: cout << "Doing Fourier Transform..." << flush; cout << "\nLow Pass Filter\n"; cout << "\nEnter cutoff frequency : "; cin >> f; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i f) inpixels[i][j]= complex(0,0); stopwatch(); cout << "\nDisplaying Fourier..." << flush; displayFourier(squaresize); //__Inverse FFT fft.DoImageFFT(squaresize,squaresize,-1); for(int i=0;i> f; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i(0,0); stopwatch(); cout << "\nDisplaying Fourier..." << flush; displayFourier(squaresize); //__Inverse FFT fft.DoImageFFT(squaresize,squaresize,-1); for(int i=0;i> f; cout << "\nEnter order : "; cin >> n; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i> f; cout << "\nEnter order : "; cin >> n; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i h; cout << "\nTranslate using fourier transform"; cout << "\nEnter translation coord : "; cin >> x >> y; startwatch(); pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i(cos(-2*pi*(j*x+i*y)/squaresize),sin(-2*pi*(j*x+i*y)/squaresize)); inpixels[i][j]*=h; } stopwatch(); cout << "\nDisplaying Fourier..." << flush; displayFourier(squaresize); //__Inverse FFT fft.DoImageFFT(squaresize,squaresize,-1); for(int i=0;i> angle; cout << "\nInitial fourier transform..." << flush; pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); displayFourier(squaresize); cout << "\nAfter rotation..." << flush; cout << "\nImage..." << flush; image->matteColor(ColorGray(0)); image->matte(false); image->rotate(angle); int tr=image->rows(); int tc=image->columns(); //cout << tr << " " << tc << " " << flush; image->matteColor(ColorGray(0)); image->matte(false); image->matteColor(ColorGray(0)); // crop it char geom[80]; sprintf(geom,"%dx%d+%d+%d",c,r,(tc-c)/2,(tr-r)/2); //cout << geom << flush; image->crop(geom); image->display(); Pixels view(*image); pixels=view.get(0,0,c,r); cout << "\nFFT..." << flush; pixelsToComplex(); fft.DoImageFFT(squaresize,squaresize,1); displayFourier(squaresize); break; } case 10: measure_performance(); break; case 15: exit(0); default: break; } } while(1); }