循环卷积的哪个输出最初是正确的?FFT 卷积或 scipy 信号包装卷积



使用"wrap"边界设置通过FFT VS通过scipy convolve2d进行循环卷积会给出相同的结果,但在输出矩阵中的位置不同。

在这两种方法中,哪个位置最初是正确的(即我应该移动哪一种方法以匹配另一种(?

import numpy as np
import scipy
from scipy import signal
from numpy.fft import ifft2, fft2
imgSize = 4
filtSize = 3
padFilt = imgSize - filtSize
testImg = np.random.uniform(0,1,(imgSize,imgSize))
filter = np.random.normal(0,3.0,(filtSize,filtSize))

circConv = scipy.signal.convolve2d(testImg, filter, boundary="wrap", mode="same")
filterFFT = np.pad(filter,((0,padFilt),(0,padFilt)),'constant')
fftConv = np.real(ifft2(fft2(testImg) * fft2(filterFFT)))
# Roll the FFT output to match the wrap output
fftConv = np.roll(fftConv, (-((filterFFT.shape[0] - 1) // 2), -((filterFFT.shape[1] - 1) // 2)), axis=(0, 1))
print(circConv)
print(fftConv)

取决于坐标原点的位置。 如果它是左上角,请使用 fft。 如果它在中心,则进行卷积。

>>> a = (1, 0, 0, 0, 0)
>>> a = np.outer(a, a)
>>> a
array([[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]])
>>> np.real(ifft2(fft2(a) * fft2(a)))
array([[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.]])
>>> 
>>> a = (0, 0, 1, 0, 0)
>>> a = np.outer(a, a)
>>> a
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
>>> scipy.signal.convolve2d(a, a, boundary="wrap", mode="same")
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

最新更新