8

フィルターの長さを考えると、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もパラメータです。

たとえば、 length=3 およびsigma=math.sqrt(1.0/2/math.log(2))を取得するため、正しくありません

[0.23485931967491286、0.46971863934982572、0.23485931967491286]

そして、それは次のようになります。

[0.25、0.5、0.25]

それで、丸めの問題はありますか?何が起こっているのかわかりません...

編集私は何とか切り捨てるべきだと思います

問題解決問題は、正規化していないことでした。ベクトルをそのすべてのコンポーネントの合計で割る必要がありました。

4

1 に答える 1

3

私は numpy 構文にあまり固執していませんが、カーネルをディラック インパルスで畳み込むと、同じカーネルが出力として得られます。

したがって、単に組み込みのscipy.ndimage.filters.gaussian_filter1d関数を使用し、この配列を入力として使用することができます: [ 0, 0, 0, ... 0, 1, 0, ...0, 0, 0]

出力は、最大値が 1 のガウス カーネルである必要があります。(1を目的のカーネルで必要な最大値に置き換えます)

したがって、本質的には、gaussian_filter1d 関数が出力として内部的に使用するガウス カーネルを取得します。これは、Gaussian カーネルを生成する最も簡単でエラーが発生しにくい方法である必要があり、同じアプローチを使用して、それぞれの scipy 2d 関数を使用して 2d カーネルを生成できます。もちろん、ゼロから行うことが目標である場合、このアプローチは参照としてのみ有効です。

方程式に関して:
[..., 0.5, ...] を数式の出力として取得するには、解く必要がある
(1/(sigma*np.sqrt(2*np.pi)) = 0.5
ため、正しいシグマは次のようになります。
sigma = math.sqrt(2*1/np.pi)

于 2013-02-16T23:09:53.850 に答える