代码之家  ›  专栏  ›  技术社区  ›  Kevinj22

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

  •  0
  • Kevinj22  · 技术社区  · 6 年前

    在这两种方法中,哪一种方法的位置最开始是正确的(即,我应该切换哪一个来匹配另一个)?

    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)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Paul Panzer    6 年前

    取决于坐标原点的位置。 如果在中间,用卷积法。

    >>> 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]])