在频域中实现卷积?

信息处理 图像处理 fft 傅里叶变换 卷积 快速卷积
2021-12-28 10:17:07

假设我们有一个表示为二维整数数组的位图图像, int [,] image2D;其 FFT 为Complex[,] fftImage2D;

假设,我们有一个表示为 2D 整数数组的内核, int [,] kernel2D;其 FFT 为Complex[,] fftKernel2D;

我们知道,和的卷积(在空间域中)将是image2Dkernel2D

int Rows = image2D.GetLength(0);
int Cols = image2D.GetLength(1);

for(int i=0 ; i<Rows ; i++)
{
    for(int j=0 ; j<Cols ; j++)
    {
        //sweep the kernel2D across image2D
        //...........................
    }
}

我们还知道,频域中的卷积将是 和 之间的fftImage2D乘积fftKernel2D

我怎样才能做这个乘法?

如何将两个Complex [,]不同维度的二维数组相乘?我已经理解了这个理论。我的问题是实际实施。正如我在问题中描述的那样,

  1. 图像的 DFT 和内核的 D​​FT 是否会具有不同的大小?大概吧。那么,我怎样才能将它们逐个元素相乘呢?

  2. 在我的代码中,每个 DFT 都由 2D 复数表示。我应该根据复数的乘法规则将它们相乘吗?可能是。但是,只有当它们的尺寸相同时。正确的?

1个回答

如果需要,IDFT 较小或两个 DFT。零填充内核和图像中的一个或两个,以使它们具有相同的尺寸和大小。根据需要重新 DFT,现在您可以将 2 个 DFT 数组逐个元素进行复乘,因为它们现在将具有相同的大小。