OpenCV中的逆傅立叶变换

Posted

技术标签:

【中文标题】OpenCV中的逆傅立叶变换【英文标题】:Inverse fourier transformation in OpenCV 【发布时间】:2012-04-22 15:53:43 【问题描述】:

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

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];

【问题讨论】:

你认为你的代码和/或它产生的结果到底有什么“错误”? 我认为函数 polarToCart 不是函数量级的好反函数。 【参考方案1】:

实际上,您不必交换不同的象限,只有当您是人类并且想要更自然地可视化 FFT 结果时才需要它(即,0 频率在中间,负频率在左/底部和正频率向上/右侧)。

要反转 FFT,您需要将前向变换的结果“按原样”(或在您想要的频率滤波之后)传递给相同的 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);

【讨论】:

谢谢,因为代码,我在另一篇文章中写了我对你的帖子的回答。 我们如何应用低通或高通滤波器,就好像我们想去除低频一样,我们去除 FFT 的自然可视化中间的频率 cv::DFT_SCALE 标志应移至逆 DFT 调用(第二次调用)

以上是关于OpenCV中的逆傅立叶变换的主要内容,如果未能解决你的问题,请参考以下文章

图像中的傅立叶变换

应用逆傅立叶变换opencv后构建图像[重复]

OpenCV竟然可以这样学!成神之路终将不远(二十六)

OPENCV图像变换-1

以时频信号为例,分析常规傅立叶变换、短时傅立叶变换在暂态过程(非稳态信号)处理中的不足和小波变换的优

图像中的傅立叶变换