512x512 ピクセルの画像に 5x5 ピクセルのガウス フィルターを適用したいのですが、これを行うための scipy 関数を見つけました。
scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
ガウス ウィンドウが 5x5 ピクセルになるように、シグマのパラメーターをどのように選択すればよいですか?
ベストアンサー1
ここでソースコードを確認してください:https://github.com/scipy/scipy/blob/master/scipy/ndimage/filters.py
gaussian_filter
が各軸に対して呼び出していることがわかりますgaussian_filter1d
。 では、フィルタの幅はとgaussian_filter1d
の値によって暗黙的に決定されます。実際には、幅はsigma
truncate
w
w = 2*int(truncate*sigma + 0.5) + 1
それで
(w - 1)/2 = int(truncate*sigma + 0.5)
w = 5の場合、左辺は2です。右辺は2の場合、
2 <= truncate*sigma + 0.5 < 3
または
1.5 <= truncate*sigma < 2.5
truncate = 3
(デフォルトの4を上書きして)選択すると、
0.5 <= sigma < 0.83333...
これを確認するには、1 つの 1 を除いてすべて 0 である入力をフィルタリングし (つまり、フィルタのインパルス応答を見つけます)、フィルタリングされた出力内の非ゼロ値の数を数えます。 (以下では、np
ですnumpy
。)
まず、1 を 1 つだけ含む入力を作成します。
In [248]: x = np.zeros(9)
In [249]: x[4] = 1
サイズの変化はsigma = 0.5
…で確認してください。
In [250]: np.count_nonzero(gaussian_filter1d(x, 0.49, truncate=3))
Out[250]: 3
In [251]: np.count_nonzero(gaussian_filter1d(x, 0.5, truncate=3))
Out[251]: 5
...そしてsigma = 0.8333...
:
In [252]: np.count_nonzero(gaussian_filter1d(x, 0.8333, truncate=3))
Out[252]: 5
In [253]: np.count_nonzero(gaussian_filter1d(x, 0.8334, truncate=3))
Out[253]: 7