我正在使用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
您是否会知道设置扩展内核矩阵时我做错了什么?