Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing opencv dft仅适用于2次方的图像尺寸_Image Processing_Opencv_Fft_Dft - Fatal编程技术网

Image processing opencv dft仅适用于2次方的图像尺寸

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

我目前在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时遇到过这个问题,可以给我一些建议


提前感谢

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时,但这并不能解释为什么我会得到奇怪的结果。