python – 生成1D高斯内核的最简单方法
我想知道在给定滤波器长度的情况下,在
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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |