OpenCV 的 DFT-based filter2D 是如何工作的?

How does OpenCV's DFT-based filter2D actually work?

我无法理解 OpenCV 库的 filter2D 方法的实际工作原理。根据文档,小内核大小的“标准”直接版本很清楚,但对于较大的内核大小“(~11 x 11 或更大)函数使用 DFT-based 算法”。

哪个DFT-based算法?没有给出科学参考,我无法确定具体使用了哪种算法。我知道 DFT 是如何工作的,所以我对输入图像和内核都进行了侦察,将其转换为进行卷积然后再返回的光谱表示?如果这是一般的想法,我仍然想要一些额外的背景信息。

使用 DFT 处理卷积的技术通常称为“overlap-add”。当内核很大但仍然比您应用它的 signal/image 小很多时它是合适的。

在 2D 中,给定一个 MxM 内核(通常 M 会四舍五入为 2 的幂):

  1. 图像被分成 MxM 块。
  2. 块和内核用零填充到 2Mx2M 大小。
  3. FFT卷积用于将每个块与内核进行卷积。每个卷积产生一个 2Mx2M 的结果,但是因为输入的 non-zero 部分只有 MxM,所以卷积不会回绕。可以对所有块重复使用相同的内核 FFT。
  4. 每个 MxM 块的 2Mx2M 结果然后以重叠的方式加回到一起以产生结果图像。

这种技术在信号处理领域已经广为人知很长时间了,我没有提到它的起源。还有一种称为“overlap-save”的变体。

google 搜索“2d overlap add convolution”得到了一些令人满意的结果。