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]
那么,舍入有什么问题吗?我不知道发生了什么...
编辑我认为我应该以某种方式截断
解决的问题问题是我没有规范化。我必须将向量除以所有分量的总和。
我对 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)
| 归档时间: |
|
| 查看次数: |
7480 次 |
| 最近记录: |