1

我目前在 opencv 中遇到 dft 函数的奇怪行为。我正在 dft 转发一些 opencv 矩阵并在频域中进行一些计算,然后我再次将其转换回来。

对于尺寸为 2 次方(例如 256x256、512x512)的图像,结果看起来与预期的一样,但对于任何其他尺寸,我完全是胡说八道。

我的代码大致如下:

cv::Mat Z(Pgrads.rows, Pgrads.cols, CV_32FC2, cv::Scalar::all(0));

cv::dft(Pgrads, P, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);
cv::dft(Qgrads, Q, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);

/* doing some calculations */

cv::dft(Z, Z, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT);

我正在做的操作称为光度立体,所以简而言之,我正在对一些渐变进行全局积分。有没有其他人遇到过opencv这个问题,可以给我一些建议吗?

提前致谢

4

2 回答 2

1

FFT 仅适用于 2 次幂大小的数据集

扩展图像并用常数值填充它们是正常的(这对傅立叶结果没有影响)见http://docs.opencv.org/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html

于 2012-11-14T21:41:06.530 回答
-2

FFT 仅适用于 2 个数据集的幂是完全不正确的。对于 OCV 的特定实现,他们声称(从 2.4.9 开始)它可以与其他尺寸一起使用,但是为了提高效率,建议使用 2 填充的力量。你会发现有 2^N 限制的非常古老的 FFT 库,但我已经很久没见过了。您可能会确保您使用的是当前版本(我知道截至提问之日,OCV 或多或少具有当前的 FFT 实现)而不是一些真正的旧代码。我不知道你是如何评估输出的,但最有可能的问题是你给它一个复杂的输入 CV_32FC2,同时使用一个告诉它期待一个真实输入的标志,DFT_COMPLEX_OUTPUT。DFT_COMPLEX_OUTPUT 的意思是“接受真正的输入并给我完整的,

于 2014-10-11T00:07:01.270 回答