我想使用FFT来加速2D卷积。滤镜尺寸为15 x 15,图像尺寸为300 x 300.滤镜的尺寸与图像不同,因此我无法在FFT后进行点积。那么如何在进行FFT之前对滤波器进行变换,使其大小与图像匹配?
答案 0 :(得分:1)
我使用N
是内核大小的约定。
知道卷积没有在数学上定义(数学上)(每个维度的每一端都为N//2
),你会在每个轴上的总计中丢失N
个像素。
你需要为卷积腾出空间:用足够的“中性值”填充图像,以便边缘情况(插入那里的垃圾值)消失。
这将涉及使您的图像成为307x307px图像(具有合适的填充值,请参见下一段),在卷积后会返回300x300图像。
流行的图像处理库已经嵌入了这个:当你要求卷积时,你有额外的参数来指定“模式”。
- '常数':具有恒定值的垫片。
- 'edge':边缘值为数组的垫。
- 'linear_ramp':在end_value和arraydge值之间具有线性斜坡的垫片。
- '最大': 垫的全部或部分最大值 沿每个轴的矢量。
- '平均' 垫的全部或部分平均值 沿每个轴的矢量。
- '中间' 垫的全部或部分中值 沿每个轴的矢量。
- '最小' 具有全部或部分最小值的垫 沿每个轴的矢量。
- '反映' 带有反射矢量反射的垫片 每个向量的第一个和最后一个值 轴。
- '对称' 带有反射矢量反射的垫片 沿着阵列的边缘。
- 卷收 垫沿着轴的矢量包裹。 第一个值用于填充结尾和 结束值用于填补开头。
这取决于你,真的,但经验法则是“为手头的任务选择中性值”。
(例如,在进行平均时用0填充没有意义,因为0在平均正值中不是中性的)
答案 1 :(得分:1)
它取决于您用于FFT的算法,因为它们中的大多数都需要处理二维维度的图像(2的幂)。
以下是您需要做的事情:
如果您使用的算法不需要二元尺寸,则步骤1无用,2必须是带图像尺寸的简单填充。