gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:34:43 41 4
gpt4 key购买 nike

我想知道在给定滤波器长度的情况下,在 python 中生成一维高斯核的最简单方法是什么。我认为这个想法是评估向量 [-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也是一个参数。

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

[0.23485931967491286, 0.46971863934982572, 0.23485931967491286]

它应该是:

[0.25, 0.5, 0.25]

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

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

问题已解决 问题是我没有正常化。我必须将向量除以其所有分量的总和。

最佳答案

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

所以你可以简单地使用内置 scipy.ndimage.filters.gaussian_filter1d函数,并使用此数组作为输入:[ 0, 0, 0, ... 0, 1, 0, ...0, 0, 0]

输出应该是一个高斯核,其峰值处的值为 1。 (用你想要的内核中的最大值替换 1)

所以本质上,您将获得 gaussian_filter1d 函数在内部用作输出的高斯内核。这应该是生成高斯核的最简单且最不容易出错的方法,您可以使用相同的方法生成 2d 核,使用相应的 scipy 2d 函数。当然,如果目标是从头开始,那么这种做法也只能作为引用

关于你的等式:
要获得 [..., 0.5, ...] 作为公式的输出,您需要解决
(1/(sigma*np.sqrt(2*np.pi)) = 0.5
所以正确的西格玛应该是
sigma = math.sqrt(2*1/np.pi)

关于python - 生成一维高斯核的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916085/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com