使用FFT进行二维卷积时如何变换滤波器?

时间:2015-10-06 01:24:31

标签: image-processing fft convolution

我想使用FFT来加速2D卷积。滤镜尺寸为15 x 15,图像尺寸为300 x 300.滤镜的尺寸与图像不同,因此我无法在FFT后进行点积。那么如何在进行FFT之前对滤波器进行变换,使其大小与图像匹配?

2 个答案:

答案 0 :(得分:1)

我使用N是内核大小的约定。

知道卷积没有在数学上定义(数学上)(每个维度的每一端都为N//2),你会在每个轴上的总计中丢失N个像素。

你需要为卷积腾出空间:用足够的“中性值”填充图像,以便边缘情况(插入那里的垃圾值)消失。

这将涉及使您的图像成为307x307px图像(具有合适的填充值,请参见下一段),在卷积后会返回300x300图像。

流行的图像处理库已经嵌入了这个:当你要求卷积时,你有额外的参数来指定“模式”。

我们可以使用哪些值?

Numpy's pad documentation

无耻被盗
  
      
  • '常数':具有恒定值的垫片。
  •   
  • 'edge':边缘值为数组的垫。
  •   
  • 'linear_ramp':在end_value和arraydge值之间具有线性斜坡的垫片。
  •   
  • '最大':           垫的全部或部分最大值           沿每个轴的矢量。
  •   
  • '平均'           垫的全部或部分平均值           沿每个轴的矢量。
  •   
  • '中间'           垫的全部或部分中值           沿每个轴的矢量。
  •   
  • '最小'           具有全部或部分最小值的垫           沿每个轴的矢量。
  •   
  • '反映'           带有反射矢量反射的垫片           每个向量的第一个和最后一个值           轴。
  •   
  • '对称'           带有反射矢量反射的垫片           沿着阵列的边缘。
  •   
  • 卷收           垫沿着轴的矢量包裹。           第一个值用于填充结尾和           结束值用于填补开头。
  •   

这取决于你,真的,但经验法则是“为手头的任务选择中性值”。

(例如,在进行平均时用0填充没有意义,因为0在平均正值中不是中性的)

答案 1 :(得分:1)

它取决于您用于FFT的算法,因为它们中的大多数都需要处理二维维度的图像(2的幂)。

以下是您需要做的事情:

  1. 填充图像:将图像置于具有二维尺寸的较大图像中
  2. 填充内核:将卷积内核置于与步骤1相同尺寸的图像中。
  3. 来自步骤1的图像的FFT
  4. 来自第2步的内核的FFT
  5. 步骤3和4的结果的复数乘法(傅里叶空间)。
  6. 在步骤5中对结果图像进行逆FFT
  7. 在步骤6中生成的图像上取消打印
  8. 按顺序排列所有4个集团。
  9. 如果您使用的算法不需要二元尺寸,则步骤1无用,2必须是带图像尺寸的简单填充。