2012-04-22 286 views
4

我是OpenCV和图像处理算法的新手。我需要在C++中使用OpenCV进行逆离散傅里叶变换,但我不知道如何。我通过互联网搜索,我没有找到答案。我正在使用此页面的代码对程序进行傅里叶变换:http://opencv.itseez.com/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html。我试图做与该代码相反的,但我不知道我在做什么错。我的代码是在这里(我认为整个代码是错误的):OpenCV逆向傅立叶变换

void doFourierInverse(const Mat &src, Mat &dst) { 
    normalize(src, dst, 0, -1, CV_MINMAX); 

    int cx = dst.cols/2; 
    int cy = dst.rows/2; 

    Mat q0(dst, Rect(0, 0, cx, cy)); 
    Mat q1(dst, Rect(cx, 0, cx, cy)); 
    Mat q2(dst, Rect(0, cy, cx, cy)); 
    Mat q3(dst, Rect(cx, cy, cx, cy)); 

    Mat tmp;   
    q0.copyTo(tmp); 
    q3.copyTo(q0); 
    tmp.copyTo(q3); 

    q1.copyTo(tmp);  
    q2.copyTo(q1); 
    tmp.copyTo(q2); 

    dst = dst(Rect(0, 0, dst.cols & -2, dst.rows & -2)); 

    exp(dst, dst); 
    dst -= Scalar::all(1); 

    Mat planes[2]; 

    polarToCart(dst, Mat::zeros(dst.rows, dst.cols, dst.type()), planes[0], planes[1]); 

    merge(planes, 2, dst);  

    idft(dst, dst, DFT_INVERSE | DFT_SCALE); 

    split(dst, planes); 

    dst = planes[0]; 
} 
+0

您认为您的代码和/或结果产生的“错误”是什么? – 2012-04-22 19:17:50

+0

我认为polarToCart函数对函数的幅度并不好。 – 2012-04-22 20:38:11

回答

16

其实,你不必交换不同的象限,只有当你是一个人,并希望有一个更自然的可视化它的需要的FFT结果(即中间的0频率,左/右负频率和正/负频率)。您需要将正向变换的结果“按原样”(或者在您想要的频率过滤之后)传递给相同的dft()函数,仅添加标志DFT_INVERSE。如果你还记得你对FFT,前后变换在配方很紧扭结数学...

---编辑---

究竟不起作用? 以下代码确实执行了前向后向后的FFT,并且一切正常,如预期的那样。

// Load an image 
cv::Mat inputImage = cv::imread(argv[argc-1], 0); 

// Go float 
cv::Mat fImage; 
inputImage.convertTo(fImage, CV_32F); 

// FFT 
std::cout << "Direct transform...\n"; 
cv::Mat fourierTransform; 
cv::dft(fImage, fourierTransform, cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT); 

// Some processing 
doSomethingWithTheSpectrum(); 

// IFFT 
std::cout << "Inverse transform...\n"; 
cv::Mat inverseTransform; 
cv::dft(fourierTransform, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT); 

// Back to 8-bits 
cv::Mat finalImage; 
inverseTransform.convertTo(finalImage, CV_8U); 
+0

谢谢,我在另一篇文章中写了我的回复,因为代码。 – 2012-04-23 14:44:14

+0

谢谢,这对我有帮助。 – 2012-04-26 23:56:46

+0

我们如何应用低通或高通滤波器就好像我们想要移除低频一样,我们移除了FFT自然视图可视化中间的频率 – 2015-08-10 06:13:06