有人可以建议哪个库支持创建所需长度和sigma的高斯滤波器吗?我基本上需要一个等效函数用于下面的matlab函数:
fltr = fspecial('gaussian',[1 n],sd)
答案 0 :(得分:9)
你不需要一个简单的1D高斯库。
from math import pi, sqrt, exp
def gauss(n=11,sigma=1):
r = range(-int(n/2),int(n/2)+1)
return [1 / (sigma * sqrt(2*pi)) * exp(-float(x)**2/(2*sigma**2)) for x in r]
注意:这将始终返回一个以0为中心的奇数长度列表。我想在某些情况下你可能需要一个偶数长度的高斯,其值为x = [...,-1.5,-0.5,0.5 ,1.5,...],但在这种情况下,你需要一个稍微不同的公式,我会把它留给你;)
默认值为n = 11
,sigma = 1
的输出示例:
>>> g = gauss()
1.48671951473e-06
0.000133830225765
0.00443184841194
0.0539909665132
0.241970724519
0.398942280401
0.241970724519
0.0539909665132
0.00443184841194
0.000133830225765
1.48671951473e-06
>>> sum(g)
0.99999999318053079
答案 1 :(得分:6)
也许scipy.ndimage.filters.gaussian_filter
?我从未使用它,但文档位于:https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.ndimage.filters.gaussian_filter.html
答案 2 :(得分:3)
尝试scipy.ndimage.gaussian_filter
,但你真的想要内核还是想要应用它? (在这种情况下,您可以使用此功能。)在前一种情况下,将过滤器应用于数组,该数组在任何位置都为0,但中心位置为1。对于更容易编写的1d情况,例如:
>>> ndimage.gaussian_filter1d(np.float_([0,0,0,0,1,0,0,0,0]), 1)
array([ 1.33830625e-04, 4.43186162e-03, 5.39911274e-02,
2.41971446e-01, 3.98943469e-01, 2.41971446e-01,
5.39911274e-02, 4.43186162e-03, 1.33830625e-04])
答案 3 :(得分:0)
如果运行时速度很重要,我强烈建议您创建一次过滤器,然后在每次迭代时使用它。优化是不断进行的,但几年前,这大大加快了我写的一些代码。 (以上答案显示了如何创建过滤器。)