// ================= // || Worksheet 6 // || In this example, we are going be performing DFT's // ================= // for another (less detailed example) see, // http://docs.opencv.org/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html #include "program.h" using namespace std; using namespace cv; // In this worksheet, we will be performing DFT's and Inverse DFT's int worksheetsix(Mat& src) { // can rotate the image by some angle if we want to play with this rotate(src, 15, src); // First, lets embed our source image in a complex image, so that we can easily take its fourier transform. Mat complexImage = embedInComplexImage(src); // PERFORM DISCRETE FOURIER TRANSFORM (DFT)! // because we have stored our image in a complex image, // we can perform the DFT 'inplace', // which means we use the same block of memory we have already created. dft(complexImage, complexImage); // Now, we are going to compute the magnitude of our complex image. // i.e. we want a new image whose values are sqrt( X^2+ Y^2) of our complex image X+iY. Mat magnitudeImage = computeMagnitudeImage(complexImage); // now we rearrange rearrange(magnitudeImage); // Show the result imshow("Input Image" , src ); imshow("Spectrum Magnitude", magnitudeImage); waitKey(); // PERFORM THE INVERSE DISCRETE FOURIER TRANSFORM (IDFT) cv::Mat invtransformedImage; // perform the inverse transform of our complex image. cv::dft(complexImage, invtransformedImage, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT); /// just normalize our image to be safe. normalize(invtransformedImage, invtransformedImage, 0, 1, CV_MINMAX); imshow("Reconstructed", invtransformedImage); waitKey(); return 0; }