我正在尝试反转高斯(DoG)滤波器的差异。逆是不稳定的,所以我试图找到一个应用于特定输入的近似值。DoG 过滤器增加了边缘的对比度,我试图找到一个降低边缘对比度的逆。
近似的倒数不是很清楚,我的尝试让我接近但并不完全在那里。
此 Google Colab 笔记本中提供了所有代码。
输入
我的输入是一维的一系列上升步骤。它是这样创建的:
luminances = np.repeat(np.linspace(0, 1, 5), 100)
狗过滤器
我的 DoG 过滤器是用以下代码制作的:
filter_len = 81
excitatory_gaussian = scipy.signal.gaussian(filter_len, 1.4)
inhibitory_gaussian = scipy.signal.gaussian(filter_len, 16) * -0.043
filter = excitatory_gaussian + inhibitory_gaussian
filter /= sum(filter)
plt.plot(filter)
卷积
当我将输入与 DoG 滤波器进行卷积时,我看到边缘的对比度更高,正如预期的那样:
我可以使用convolve
or创建相同的输出lfilter
:
deconvolved_luminances = signal.convolve(luminances, filter)
deconvolved_luminances = signal.lfilter(filter, [1], luminances)
反转尝试
我想找到 DoG 滤波器的倒数,这样,当将此输入与反向滤波器进行卷积时,输出是递增的,边缘对比度降低,并且可以与我的原始 DoG 滤波器进行卷积以输出原始输入的近似值.
信号.反卷积
似乎是因为 DoG 滤波器的逆滤波器不稳定,所以使用 signal.deconvolve 会导致输出错误。
deconvolved_luminances, remainder = scipy.signal.deconvolve(luminances, filter)
lfilter
正如预期的那样,使用而不是时的输出是相同的deconvolve
:
deconvolved_luminances = scipy.signal.lfilter([1], filter, luminances)
反相过滤器的一半
看起来过滤器的右半部分是稳定的。如果我将这个右半部分 ( half_filter_r = filter[len(filter)//2:]
) 与我的信号 ( ) 反卷积s_deconvolved_r = signal.lfilter([1], half_filter_r, s)
,我会得到一个有意义的输出,如下所示:
然而,取过滤器的左半部分 ( half_filter_l = filter[:len(filter)//2 + 1]
) 并执行相同操作会产生一个输出,表明过滤器的左半部分不稳定:
我可以假设左半部分的适当输出只是右半部分输出的倒数s_deconvolved_l = max(s_deconvolved_r) - s_deconvolved_r[::-1]
(s_deconvolved_r + s_deconvolved_l
但是,假设左半部分的输出基于右半部分似乎是可疑的,并且似乎应该有更好的方法。为什么左半边不稳定而右半边稳定?此外,当我将过滤器与上述输出进行卷积时,我得到的结果看起来与原始过滤器相似但不太正确(达到了我允许发布的图像的限制,但它在 colab 笔记本中)。
谢谢你的帮助!