【发布时间】:2019-02-27 02:10:33
【问题描述】:
我在使用 numpy 进行傅里叶反卷积时遇到了一些麻烦。我目前正在尝试使用 3 个高斯的测试用例,所以我确切地知道每一端会发生什么。
我要恢复的是输入信号,给出了滤波器和输出的确切形式。
在这里,我使用了一个简单的约束来抑制高频端,将其设置为零(因为信号也是傅立叶空间中的高斯信号)。由于这个限制,我希望通过一点点振铃来恢复我的原始输入。
#Dummy Case for Gaussian convolve with Gaussian
N = 128
x = np.arange(-5, 5, 10./(2 * N))
epsilon = 1e-18
def gaus(x,sigma):
return 1./np.sqrt(2*np.pi)/sigma * np.exp(-(x * x)/(2 * sigma**2))
y_g = gaus(x,0.3) #output gaussian blurred signal
y_b = gaus(x,0.1) #gaussian blur filter
y_i = gaus(x,np.sqrt(0.3**2 - 0.1**2)) #og gaussian input
f_yg = np.fft.fft(y_g) #fft the blur
f_yb = np.fft.fft(y_b) #fft the filter
f_yi = np.fft.fft(y_i)
r_f = (np.fft.fftshift(f_yg)+epsilon)/(np.fft.fftshift(f_yb)+epsilon) #deconvolve by division in fourier space
r_f[np.abs(x)>0.5] = 0 #naive constraint to remove the artifacts by knowing final form is gaussian
r_f = np.fft.ifftshift(r_f)
r_if = np.fft.ifft(r_f)
y_gf = np.fft.ifft(f_yg)
y_bf = np.fft.ifft(f_yb)
y_if = np.fft.ifft(f_yi)
plt.plot(x,y_if, label='fft true input')
plt.plot(x,r_if, label='fft recv. input')
plt.legend(framealpha=0.)
plt.show()
这里的橙色是使用输出和模糊的反卷积恢复的输入信号。
我有几个问题:
- 显然存在缩放问题。我认为这可能会出现的唯一领域是当我应用天真约束时。如果知道傅立叶空间上的 1/sqrt(N)*integral 等于 1,我是否应该在这一步重新归一化?
- 看起来恢复的高斯的位置与曲线两侧的一半曲线混淆了。这是由于傅立叶空间的划分吗?我如何恢复原来的位置(或者我一开始就做错了)
我附上了用于生成两条曲线的脚本,即物理空间中的原始输入和恢复输入。
干杯, 凯文
编辑:我应该补充一点,使用 scipy.deconvolve + 一些小编辑恢复图像没有问题。这一定意味着我这里的方法有些错误?
【问题讨论】: