Numpy 2D阵列是否有scipy.signal.DECOVOLVE的等效项?

Numpy 2D阵列是否有scipy.signal.DECOVOLVE的等效项?,numpy,scipy,convolution,Numpy,Scipy,Convolution,我想用点扩散函数(PSF)去卷积2D图像。我看到了一个用于一维数组的scipy.signal.deconvolve函数,以及用于卷积多维数组的scipy.signal.fftconvolve。scipy中是否有特定的功能来解卷积2D阵列 我定义了一个fftdeconvolve函数,用除法替换fftconvolve中的乘积: def fftdeconvolve(in1, in2, mode="full"): """Deconvolve two N-dimensional arrays us

我想用点扩散函数(PSF)去卷积2D图像。我看到了一个用于一维数组的
scipy.signal.deconvolve
函数,以及用于卷积多维数组的
scipy.signal.fftconvolve
。scipy中是否有特定的功能来解卷积2D阵列

我定义了一个fftdeconvolve函数,用除法替换fftconvolve中的乘积:

def fftdeconvolve(in1, in2, mode="full"):
    """Deconvolve two N-dimensional arrays using FFT. See convolve.

    """
    s1 = np.array(in1.shape)
    s2 = np.array(in2.shape)
    complex_result = (np.issubdtype(in1.dtype, np.complex) or
                      np.issubdtype(in2.dtype, np.complex))
    size = s1+s2-1

    # Always use 2**n-sized FFT
    fsize = 2**np.ceil(np.log2(size))
    IN1 = fftpack.fftn(in1,fsize)
    IN1 /= fftpack.fftn(in2,fsize)
    fslice = tuple([slice(0, int(sz)) for sz in size])
    ret = fftpack.ifftn(IN1)[fslice].copy()
    del IN1
    if not complex_result:
        ret = ret.real
    if mode == "full":
        return ret
    elif mode == "same":
        if np.product(s1,axis=0) > np.product(s2,axis=0):
            osize = s1
        else:
            osize = s2
        return _centered(ret,osize)
    elif mode == "valid":
        return _centered(ret,abs(s2-s1)+1)
但是,以下代码在卷积和解卷积后不会恢复原始信号:

sx, sy = 100, 100
X, Y = np.ogrid[0:sx, 0:sy]
star = stats.norm.pdf(np.sqrt((X - sx/2)**2 + (Y - sy/2)**2), 0, 4)
psf = stats.norm.pdf(np.sqrt((X - sx/2)**2 + (Y - sy/2)**2), 0, 10)

star_conv = fftconvolve(star, psf, mode="same")
star_deconv = fftdeconvolve(star_conv, psf, mode="same")

f, axes = plt.subplots(2,2)
axes[0,0].imshow(star)
axes[0,1].imshow(psf)
axes[1,0].imshow(star_conv)
axes[1,1].imshow(star_deconv)
plt.show()
生成的二维阵列显示在下图的下一行中。如何使用FFT反褶积恢复原始信号


使用SciPy的fftpack软件包中的fftn、ifftn、fftshift和ifftshift的这些功能似乎可以工作:

from scipy import fftpack

def convolve(star, psf):
    star_fft = fftpack.fftshift(fftpack.fftn(star))
    psf_fft = fftpack.fftshift(fftpack.fftn(psf))
    return fftpack.fftshift(fftpack.ifftn(fftpack.ifftshift(star_fft*psf_fft)))

def deconvolve(star, psf):
    star_fft = fftpack.fftshift(fftpack.fftn(star))
    psf_fft = fftpack.fftshift(fftpack.fftn(psf))
    return fftpack.fftshift(fftpack.ifftn(fftpack.ifftshift(star_fft/psf_fft)))

star_conv = convolve(star, psf)
star_deconv = deconvolve(star_conv, psf)

f, axes = plt.subplots(2,2)
axes[0,0].imshow(star)
axes[0,1].imshow(psf)
axes[1,0].imshow(np.real(star_conv))
axes[1,1].imshow(np.real(star_deconv))
plt.show()
左下角的图像显示了上一行中两个高斯函数的卷积,右下角显示了卷积效应的相反方向


注意,傅里叶域中的除法解卷积除了用于演示目的外,对其他任何东西都没有真正的用处;任何类型的噪音,甚至是数字噪音,都可能使您的结果完全无法使用。人们可以用各种方式调节噪音;但根据我的经验,a更容易实现,并且在许多方面在物理上更合理。

在f域中用水位进行划分,
spec\u out=spec\u信号/(spec\u to\u deconv+水位)
而不是
spec\u out=spec\u信号/spec\u to\u deconv
?避免对
spec_to_deconv
中的小值进行小扰动,从而导致
spec_out
中的大变化;但它充其量也有很强的物理合理性,设置阈值总是需要在噪声抑制和引入的失真之间进行折衷。RL迭代是否也适用于一维时间序列?它适用于任何线性反演问题,其中右侧、解决方案、,算子具有严格的非负系数。