假设我们有一个位图图像表示为2D整数数组,
FFT为int [,] image2D;
的Complex[,] fftImage2D;
假设我们有一个表示为2D整数数组的内核,
FFT为int [,] kernel2D;
的Complex[,] fftKernel2D;
我们知道image2D
和kernel2D
的卷积(在空间范围内)为
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/
频域中的卷积将是
fftImage2D
和fftKernel2D
之间的乘法。如何进行乘法?
如何将两个不同维度的
Complex [,]
类型2D数组相乘? 最佳答案
要通过在频域中使用乘法执行线性卷积,必须首先确保两个复杂的2D数组具有相同的尺寸。这可以通过将两个空间域数组(image2D
和kernel2D
)填充到相同大小来实现。请注意,您已经必须将空间域阵列填充到比两个阵列维度的总和(沿每个维度)小至少1个以执行线性卷积而不是圆形卷积。
这样的过程看起来像:
image2D.GetLength(0)+kernel2D.GetLength(0)-1
image2D.GetLength(1)+kernel2D.GetLength(1)-1
image2D
填充到此新大小,重复边框元素kernel2D
填充到此新大小,并填充零image2D
和kernel2D
fftImage2D
和fftKernel2D
的乘法image2D
大小(仅在您有兴趣获取由kernel2D
过滤的图像而没有完整卷积的边缘效果时才需要)。 对于示例实现, future 的读者可以看看this other question from @anonymous以及我在my answer中指示的更改。
关于c#-4.0 - 如何在频域中实现卷积?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37779344/