假设我们有一个位图图像表示为2D整数数组,
FFT为int [,] image2D;Complex[,] fftImage2D;
假设我们有一个表示为2D整数数组的内核,
FFT为int [,] kernel2D;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
        //...........................
    }
}

以下链接都是关于空间域中的卷积的:

http://www.codeproject.com/Articles/2008/Image-Processing-for-Dummies-with-C-and-GDI-Part
http://www.gutgames.com/post/Matrix-Convolution-Filters-in-C.aspx
https://softwarebydefault.com/2013/05/01/image-convolution-filters/

频域中的卷积将是fftImage2DfftKernel2D之间的乘法。

如何进行乘法?

如何将两个不同维度的Complex [,]类型2D数组相乘?

最佳答案

要通过在频域中使用乘法执行线性卷积,必须首先确保两个复杂的2D数组具有相同的尺寸。这可以通过将两个空间域数组(image2Dkernel2D)填充到相同大小来实现。请注意,您已经必须将空间域阵列填充到比两个阵列维度的总和(沿每个维度)小至少1个以执行线性卷积而不是圆形卷积。

这样的过程看起来像:

  • 计算填充的行数:image2D.GetLength(0)+kernel2D.GetLength(0)-1
  • 计算填充的列数:image2D.GetLength(1)+kernel2D.GetLength(1)-1
  • image2D填充到此新大小,重复边框元素
  • kernel2D填充到此新大小,并填充零
  • 计算填充的image2Dkernel2D
  • 的FFT
  • 对已加大小的
  • 进行填充的fftImage2DfftKernel2D的乘法
  • 计算逆FFT
  • (可选)将结果截断为原始image2D大小(仅在您有兴趣获取由kernel2D过滤的图像而没有完整卷积的边缘效果时才需要)。

  • 对于示例实现, future 的读者可以看看this other question from @anonymous以及我在my answer中指示的更改。

    关于c#-4.0 - 如何在频域中实现卷积?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37779344/

    10-10 16:42