#include #include #include #include #include #include #include using namespace std; using namespace Magick; double pi=3.1415; 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: // 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(complex a[],complex A[],int n) { int ln=(int)ceil(log(n)/log(2)); for(int i=0;i Inverse FFT void fft(complex a[],complex A[],int n,int mode=1) { bitrev(a,A,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** buffer,int x,int y,int mode) { complex* temp; complex* temp1; int n; if (y>x) n=y; else n=x; temp = new complex[n]; temp1 = new complex[n]; //__Compute FFT for each column first___ 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;x** inpixels; int squaresize; bool imageloaded=false; double** fftout; Image* image; Pixels* view; void loadimage(char* filename) { image=new Image(filename); image->classType(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); 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); } } } 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); complex** matrix; matrix=new complex*[size]; for(i=0;i[size]; } ImageFFT fft; for(i=0;i<=ln;i++) { int j=pow(2,i); timeval t1,t2; gettimeofday(&t1,NULL); fft.DoImageFFT(matrix,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(); for(i=0;i<512;i++) delete[] matrix[i]; delete[] matrix; } void freemem() { // init memory for image int i; for(i=0;ic ? r : c; squaresize=(int)pow(2,(int)(log(squaresize)/log(2))+1); // init memory for image inpixels=new complex*[squaresize]; for(i=0;i[squaresize]; //alloc memory fftout=new double*[squaresize]; for(i=0;i> 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); if(imageloaded) freemem(); else imageloaded=true; allocmem(); 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(inpixels,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(inpixels,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(inpixels,squaresize,squaresize,-1); for(int i=0;i> f; startwatch(); pixelsToComplex(); fft.DoImageFFT(inpixels,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(inpixels,squaresize,squaresize,-1); for(int i=0;i> f; cout << "\nEnter order : "; cin >> n; startwatch(); pixelsToComplex(); fft.DoImageFFT(inpixels,squaresize,squaresize,1); mx=squaresize/2,my=squaresize/2; for(int i=0;i> f; cout << "\nEnter order : "; cin >> n; startwatch(); pixelsToComplex(); fft.DoImageFFT(inpixels,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; pixelsToComplex(); fft.DoImageFFT(inpixels,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(inpixels,squaresize,squaresize,-1); for(int i=0;i> angle; cout << "\nInitial fourier transform..." << flush; pixelsToComplex(); fft.DoImageFFT(inpixels,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(inpixels,squaresize,squaresize,1); displayFourier(squaresize); break; } case 10: measure_performance(); break; case 15: exit(0); default: break; } } while(1); }