【问题标题】:How to accelerate DFT by specifying region of interest in frequency domain如何通过在频域中指定感兴趣区域来加速 DFT
【发布时间】:2018-05-25 03:53:38
【问题描述】:

注意:这个问题最初是几天前在OpenCV forum 提出的。

我正在构建一个广泛使用二维 dft 离散傅里叶变换的图像处理程序。我正在尝试加快速度以便实时运行。

在该应用程序中,我仅使用由矩形 ROI 指定的 dft 输出的一部分。我当前的实现遵循以下步骤:

  1. 计算输入图像f的dft(通常大小为512x512)并得到整个dft结果F
  2. F 裁剪到预先指定的感兴趣区域(ROI,通常大小为 32x32,任意位置),R

这个过程基本上很好,但是因为我只需要F的部分信息,所以涉及到无用的计算。我正在寻找一种仅通过计算 dft 的必要部分来加速此计算的方法。

我发现带有英特尔 IPP 的 OpenCV 可以使用英特尔 IPP 函数计算 dft,这比简单的 OpenCV 实现要快一个数量级。我想知道我是否可以仅通过计算预先指定的 dft 频域来加速这种计算。

由于我是 OpenCV 新手,所以我在这里迷路了,所以我希望你能提供一种方法来做到这一点。

请注意,我并不是要对图像的 ROI 进行 dft,即 dft(ROI(f)),但我想计算 ROI(dft( f)).

提前致谢。

【问题讨论】:

  • 你有源代码可以提供吗?对于Code Review,这可能是一个很好的问题,因为您的代码可以正常工作,但想知道如何提高性能。
  • 感谢您对 Code Review 的指点。不幸的是,我无法提供比问题更多的代码片段。我会考虑从 SO 迁移到 Code Review。

标签: opencv fft dft acceleration intel-ipp


【解决方案1】:

只是部分想法。

DFT 是可分离的。它总是通过首先将 FFT 算法应用于图像的行,然后应用于结果的列来计算(或者相反,顺序无关紧要)。

如果您只需要输出的 ROI,则在第二步中您只需处理 ROI 内的列。

我认为您不会找到一种方法来仅计算沿每个 1D 行/​​列的频率子集。这可能需要破解您自己的 FFT,这可能比在 IPP 或 FFTW 中使用的计算成本更高。

【讨论】:

  • 非常感谢。通过在第一阶段计算落在 ROI 内的频率是否可以更快? (或者在这种情况下,第二个过程必须对第一阶段进行完整计算?)
  • @mhirano:我想这是可能的,但我知道的工具不允许只计算 FFT 的一个子集,它们总是计算整个事情。如果可以的话,只计算每一行的 FFT 的输出,它落在你的 ROI 的列中。然后只计算那些列的 FFT 输出,该输出落在 ROI 内。
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2013-07-11
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多