Image processing opencv dft仅适用于2次方的图像尺寸
我目前在opencv中使用dft函数时遇到了一个奇怪的行为。我正在dft转发一些opencv矩阵,并在频域中进行一些计算,然后我再次将其转换回来 对于维数为2次方的图像(例如256x256、512x512),结果与预期的一样,但对于任何其他维数,结果都是毫无意义的 我的代码大致如下所示:Image processing opencv dft仅适用于2次方的图像尺寸,image-processing,opencv,fft,dft,Image Processing,Opencv,Fft,Dft,我目前在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
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时遇到过这个问题,可以给我一些建议
提前感谢FFT仅适用于2次方大小的数据集
展开图像并用常量填充它们(这对傅里叶结果没有影响)是正常的。请参见FFT仅在2个数据集的幂次下工作,这一点都不正确。对于OCV的特定实现,他们声称(从2.4.9开始)它可以与其他尺寸的产品一起使用,但建议使用2填充的功能以提高效率。你会发现非常古老的FFT库有2^N的限制,但我已经很久没有看到了。您可以确保您使用的是当前版本(我知道截至发问之日,OCV或多或少有当前的FFT实现),而不是一些真正的旧代码。
我不知道您是如何评估输出的,但最可能的问题是,您给它一个复杂的输入CV_32FC2,同时使用一个标志,告诉它期望一个真实的输入,DFT_复杂的输出。DFT_COMPLEX_OUTPUT的意思是“接受一个真实的输入,并给我完整的、未打包的复杂输出,而不是CSS表单。”我不知道如果将该标志与复杂输入混合在一起,代码会做什么。您还可以确保将输入的虚部初始化为0,因为您使用的是真实图像数据。无论如何,您可能应该对图像使用CV_32FC1输入,而不是CV_32FC2。我知道opencv dft正在进行fft,当且仅当图像具有2维幂次方且在任何其他情况下具有常规dft时,但这并不能解释为什么我会得到奇怪的结果。