首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >opencv dft仅适用于2次方的图像尺寸

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

Stack Overflow用户
提问于 2012-11-15 05:27:34
回答 2查看 2K关注 0票数 1

我最近在opencv的dft函数中遇到了一个奇怪的行为。我在dft中转发了一些opencv矩阵,并在频域中进行了一些计算,然后我又将其转换回来。

对于维度为2的幂(例如256x256,512x512)的图像,结果看起来与预期的一样,但对于任何其他维度,我都得到了完全的胡言乱语。

我的代码大致如下所示:

代码语言:javascript
运行
复制
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的这个问题,可以给我一些建议?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2012-11-15 05:41:07

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-11 08:07:01

这完全不是真的,FFT只能与2个数据集的幂一起工作。对于OCV的特殊实现,他们声称(从2.4.9开始)它可以与其他大小一起工作,但2填充的功能只是为了提高效率而推荐的。你会发现非常老的FFT库有2^N的限制,但是我已经很久没有看到这样的库了。您可能会确保您使用的是当前版本(我知道截至问及日期,OCV或多或少具有当前的FFT实现),而不是一些真正的旧代码。我不知道您是如何评估输出的,但最有可能的问题是,您给了它一个复杂的输入CV_32FC2,同时使用了一个告诉它期待一个实际输入的标志DFT_COMPLEX_OUTPUT。DFT_COMPLEX_OUTPUT的意思是“接受一个真实的输入,并给我完整的、未打包的复杂输出,而不是CSS表单。”如果您将该标志与复杂的输入混合在一起,我不知道代码试图做什么。您还可以确保将输入的虚部初始化为0,因为您使用的是实数图像数据。无论如何,您可能应该对图像使用CV_32FC1输入,而不是CV_32FC2。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13387623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档