Python卷积以及scipy.signal.fftconvolve公司不同的结果

2024-10-01 15:42:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组(G和G)。它们的形状和大小都一样,我想把它们卷积起来。我发现了纽比卷积以及FFT控制。 我的代码是:

foldedX = getFoldGradientsFFT(G, G_)
foldedY = getFoldGradientsNumpy(G, G_)

def getFoldGradientsFFT(G, G_):
    # convolve via scipy fast fourier transform  
    X =signal.fftconvolve(G,G_, "same)
    X*=255.0/numpy.max(X);
    return X

def getFoldGradientsNumpy(G, G_):
    # convolve via numpy.convolve
    Y = ndimage.convolve(G, G_)
    Y*=255.0/numpy.max(Y);
    return Y

但结果不一样。 结果是: Numpy.concolve公司()

^{pr2}$

在scipy.signal.fftconvolve公司公司名称:

[ -4.88130620e-15   6.74371119e-02   4.91875539e+00   1.94250997e+01
3.88227012e+01   6.70322921e+01   9.78460423e+01   1.08486302e+02
1.17267015e+02   1.15691562e+02]

我以为结果应该是一样的,即使两个函数用不同的过程卷积?!在


我忘了提到,我想卷积2个二维数组:S 阵列:

G = array([[1,2],[3,4]])
G_ = array([[5,6],[7,8]])

代码

def getFoldGradientsFFT(G, G_):
    X =signal.fftconvolve(G,G_,"same")
    X=X.astype("int")
    X*=255.0/np.max(X);
    return X

def getFoldGradientsNumpy(G, G_):
    # convolve via convolve
    old_shape = G.shape
    G = np.reshape(G, G.size)
    G_ = np.reshape(G_, G.size)
    Y = np.convolve(G, G_, "same")
    Y = np.reshape(Y,old_shape)
    Y = Y.astype("int")
    Y*=255.0/np.max(Y);
    return Y

def getFoldGradientsNDImage(G, G_):
    Y = ndimage.convolve(G, G_)
    Y = Y.astype("int")
    Y *= 255.0/np.max(Y)
    return Y

结果:

getFoldGradientsFFT
[[ 21  68]
[ 93 255]]

getFoldGradientsNumpy
[[ 66 142]
[250 255]]

getFoldGradientsNDImage
[[147 181]
[220 255]]

Tags: numpysignalreturndefnp公司卷积via
2条回答

getFoldGradientsNumpy正在使用scipy.ndimage.convolve。它进行多维卷积,与scipy.convolve不同。在

对我来说,当卷积两个一维数组时,scipy.convolvescipy.signal.convolve,和{}都返回相同的答案。在

在纽比卷积是一维数据。在

下面的代码比较信号卷积, 信号.fft控制,和nImage.卷积. 在

为nImage.卷积,当N为偶数时,需要将mode参数设置为“constant”,将origin参数设置为-1,当N为奇数时设置为0。在

from scipy import signal
from scipy import ndimage
import numpy as np

np.random.seed(1)

for N in xrange(2, 20):
    a = np.random.randint(0, 10, size=(N, N))
    b = np.random.randint(0, 10, size=(N, N))

    r1 = signal.convolve(a, b, mode="same")
    r2 = signal.fftconvolve(a, b, mode="same")
    r3 = ndimage.convolve(a, b, mode="constant", origin=-1 if N%2==0 else 0)
    print "N=", N
    print np.allclose(r1, r2)
    print np.allclose(r2, r3)

相关问题 更多 >

    热门问题