【问题标题】:How to transform filter when using FFT to do 2d convolution?使用 FFT 进行 2d 卷积时如何变换滤波器?
【发布时间】:2015-10-06 01:24:30
【问题描述】:

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

【问题讨论】:

  • 简而言之,使用零填充使图像和过滤器的大小相同(并且至少为 (15+300-1)x(15+300-1))。

标签: image-processing fft convolution


【解决方案1】:

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

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

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

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

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


我们可以填充哪些值?

Numpy's pad documentation毫不羞耻地被盗

  • 'constant':具有恒定值的焊盘。
  • 'edge' : 使用数组的边缘值填充。
  • 'linear_ramp' :在 end_value 和 arraydge 值之间具有线性斜坡的焊盘。
  • '最大': 具有全部或部分最大值的焊盘 沿每个轴的矢量。
  • '意思' 具有全部或部分平均值的焊盘 沿每个轴的矢量。
  • '中位数' 具有全部或部分的中值的焊盘 沿每个轴的矢量。
  • '最小' 具有全部或部分最小值的焊盘 沿每个轴的矢量。
  • '反映' 带有镜像的矢量反射的焊盘 沿每个向量的第一个和最后一个值 轴。
  • '对称' 带有镜像的矢量反射的焊盘 沿着阵列的边缘。
  • '换行' 使用沿轴的向量环绕的焊盘。 第一个值用于填充结尾和 end 值用于填充开头。

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

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

【讨论】:

    【解决方案2】:

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

    这是你必须做的:

    1. 填充图像:将您的图像居中到一个更大的具有二元尺寸的图像
    2. 填充内核:将卷积内核置于与步骤 1 相同尺寸的图像中。
    3. 对第 1 步中的图像进行 FFT
    4. 第 2 步中内核上的 FFT
    5. 第 3 步和第 4 步结果的复数乘法(傅立叶空间)。
    6. 在步骤 5 中对结果图像进行逆 FFT
    7. 在第 6 步生成的图像上取消填充
    8. 将所有 4 个块按正确的顺序排列。

    如果您使用的算法不需要二元尺寸,那么第 1 步是无用的,第 2 步必须是图像尺寸的简单填充。

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 1970-01-01
      • 2020-03-16
      • 2017-11-04
      • 1970-01-01
      • 2011-03-06
      • 2020-02-21
      • 2014-05-18
      • 1970-01-01
      相关资源
      最近更新 更多