512x512ピクセルの画像に5x5ピクセルのガウスフィルターを適用したい。私はそれを行うためのscipy関数を見つけました:
scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
シグマのパラメーターを選択して、ガウシアンウィンドウが5x5ピクセルになるようにするにはどうすればよいですか?
ここでソースコードをチェックしてください: 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 <= truncate*sigma + 0.5 < 3
または
1.5 <= truncate*sigma < 2.5
truncate = 3
(デフォルトの4を上書き)を選択すると、
0.5 <= sigma < 0.83333...
これは、単一の1を除いてすべて0である入力をフィルター処理して(つまり、フィルターのインパルス応答を見つけて)、フィルター処理された出力の非ゼロ値の数を数えることで確認できます。 (以下では、np
はnumpy
です。)
最初に、単一の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
s = 2
_w = 5
_t = (((w - 1)/2)-0.5)/s
filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)