生成一维高斯内核的最简单方法

syn*_*ack 5 python image-processing computer-vision

我想知道在给定过滤器长度的情况下,在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
Run Code Online (Sandbox Code Playgroud)

其中sigma,标准偏差是参数。filter-length也是一个参数。

这是不正确的,因为我得到例如length = 3和sigma = math.sqrt(1.0 / 2 / math.log(2))

[0.23485931967491286、0.46971863934982572、0.23485931967491286]

它应该是:

[0.25,0.5,0.25]

那么,舍入有什么问题吗?我不知道发生了什么...

编辑我认为我应该以某种方式截断

解决的问题问题是我没有规范化。我必须将向量除以所有分量的总和。

Hug*_*une 5

我对 numpy 语法不是很严格,但是如果你用狄拉克脉冲对内核进行卷积,你会得到与输出相同的内核。

因此,您可以简单地使用 inbuild scipy.ndimage.filters.gaussian_filter1d函数,并使用此数组作为输入: [ 0, 0, 0, ... 0, 1, 0, ...0, 0, 0]

输出应该是一个高斯核,其峰值值为 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)