我想知道在给定滤波器长度的情况下,在python中生成1D高斯内核的最简单方法是什么。我认为这个想法是评估向量值的正态分布[-filter-length,...,filter_length],它是否正确?
到目前为止,我已经这样做了,但我不知道为什么它不正确:
result = np.zeros( filter_length )
mid = filter_length/2
result=[(1/(sigma*np.sqrt(2*np.pi)))*(1/(numpy.exp((i**2)/(2*sigma**2)))) for i in range(-mid,mid+1)]
return result
其中sigma
是标准差,这是一个参数。 filter-length
也是一个参数。
这是不正确的,因为我得到了例如长度= 3和 sigma = math.sqrt(1.0 / 2 / math.log(2))
[0.23485931967491286,0.46971863934982572,0.23485931967491286]
它应该是:
[0.25,0.5,0.25]
那么,是否存在舍入问题?我不知道发生了什么......
编辑我认为我应该以某种方式截断
解决问题问题在于我没有正常化。我不得不将矢量除以其所有分量的总和。
答案 0 :(得分:1)
我对numpy语法不是很坚定,但是如果你用一个dirac脉冲卷积一个内核,你就会获得与输出相同的内核。
所以你可以简单地使用inbuild scipy.ndimage.filters.gaussian_filter1d函数,并使用这个数组作为输入:[0,0,0,... 0,1,0,... 0,0,0] < / p>
输出应为高斯内核,其峰值为1。 (用你想要的内核中你想要的最大值替换1)
所以从本质上讲,你将获得gaussian_filter1d函数在内部用作输出的高斯内核。这应该是生成高斯内核的最简单且最不容易出错的方法,并且您可以使用相同的方法生成具有相应scipy 2d函数的2d内核。当然,如果目标是从头开始,那么这种方法只能作为参考
关于你的等式:
要使用您的公式得到[...,0.5,...]作为输出,您需要求解
(1/(sigma*np.sqrt(2*np.pi)) = 0.5
所以正确的西格玛应该是
sigma = math.sqrt(2*1/np.pi)