使用fftw进行通用卷积进行二维卷积

时间:2018-12-20 14:54:11

标签: fft fftw

我正在使用fftw进行镜像填充的真实图像的2D卷积。到目前为止,支持的内核始终是平方和对称的(例如,盒形内核,径向形内核...)。这些内核显然涵盖了大多数(如果不是全部)用例。但是,当使用内容和/或尺寸不对称的内核时,我的代码不再与直接空间中卷积的结果进行比较。我认为这是我在计算FFT之前将内核中心移到图像的左上角的原因。

在执行FFT之前,我使用以下方案:

- expand and mirror pad my image by half the kernel size:
- expand my kernel
- shift its original contents to the topleft corner

例如,对于要在4x4图像上使用的3x3盒形内核,这给出了(为便于阅读,我删除了内核的归一化因子)

图片(4x4):

 a b c d
 e f g h
 i j k l
 m n o p

镜像填充的图像减半内核大小(6x6):

a a b c d d
a a b c d d
e e f g h h
i i j k l l
m m n o p p
m m n o p p

中心偏移内核(6x6)

    1 1 0 0 0 1
    1 1 0 0 0 1
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    1 1 0 0 0 1

无论原始图像的大小是2k + 1,2k + 1还是对称内容,该方案都能提供完美的结果。

使用我的方案,以下(虚拟)内核无法正确地卷积我的数据

单行框内核(1,3):

           1 1 0 0 0 1
           0 0 0 0 0 0
1 1 1 ---> 0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0

单列框内核(3,1):

           1 0 0 0 0 0
1          1 0 0 0 0 0
1     ---> 0 0 0 0 0 0
1          0 0 0 0 0 0
           0 0 0 0 0 0
           1 0 0 0 0 0

不对称盒内核(1,3):

           2 4 0 0 0 1
           0 0 0 0 0 0
1 2 4 ---> 0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0
           0 0 0 0 0 0

大小均等的盒子内核(2,2):

            2 2 0 0 0 0
2 2         2 2 0 0 0 0
2 2    ---> 0 0 0 0 0 0
            0 0 0 0 0 0
            0 0 0 0 0 0
            0 0 0 0 0 0

您是否会知道设置扩展内核矩阵时我做错了什么?

0 个答案:

没有答案