加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 生成1D高斯内核的最简单方法

发布时间:2020-12-20 13:33:07 所属栏目:Python 来源:网络整理
导读:我想知道在给定滤波器长度的情况下,在 python中生成1D高斯内核的最简单方法是什么.我认为这个想法是评估向量值的正态分布[-filter-length,…,filter_length],它是否正确? 到目前为止,我已经这样做了,但我不知道为什么它不正确: result = np.zeros( filter_
我想知道在给定滤波器长度的情况下,在 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]

那么,是否存在舍入问题?我不知道发生了什么……

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

解决问题问题是我没有正常化.我不得不将矢量除以其所有分量的总和.

解决方法

我对numpy语法不是很坚定,但是如果你用一个dirac脉冲卷积一个内核,你会得到与输出相同的内核.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读