Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to do inverse DFT in OpenCV
    primarykey
    data
    text
    <p>I'm trying to implement inverse DFT using OpenCV in C++ I downloaded complete dft example in docs.opencv.org and just adjust couple of lines to inverse.</p> <p>my DFT code is like this</p> <pre><code>Mat DFT(const char* filename) { Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE); if (I.empty()) { Mat emty(7, 7, CV_32FC2, Scalar(1, 3)); return emty; } Mat padded; //expand input image to optimal size int m = getOptimalDFTSize(I.rows); int n = getOptimalDFTSize(I.cols); // on the border add zero values copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = { Mat_&lt;float&gt;(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros dft(complexI, complexI); // this way the result may fit in the source matrix // compute the magnitude and switch to logarithmic scale // =&gt; log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude Mat magI = planes[0]; magI += Scalar::all(1); // switch to logarithmic scale log(magI, magI); normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a // viewable image form (float between values 0 and 1). imshow("Input Image", I); // Show the result imshow(filename, magI); // waitKey(); return magI; } </code></pre> <p>and did IDFT. By just fix dft to idft. But the output was just look like noise. What did I do wrong? I thought the dft and idft is just same....</p> <pre><code>Mat IDFT(Mat src) { Mat I = src; Mat padded; //expand input image to optimal size int m = getOptimalDFTSize(I.rows); int n = getOptimalDFTSize(I.cols); // on the border add zero values copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = { Mat_&lt;float&gt;(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros dft(complexI, complexI, DFT_INVERSE); // this way the result may fit in the source matrix // compute the magnitude and switch to logarithmic scale // =&gt; log(1 + sqrt(Re(IDFT(I))^2 + Im(IDFT(I))^2)) split(complexI, planes); // planes[0] = Re(IDFT(I), planes[1] = Im(IDFT(I)) magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude Mat magI = planes[0]; magI += Scalar::all(1); // switch to logarithmic scale log(magI, magI); normalize(magI, magI, 0, 1, CV_MINMAX); imshow("forged map", magI); return magI; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload