web-dev-qa-db-ja.com

Scipyのガウスフィルター

512x512ピクセルの画像に5x5ピクセルのガウスフィルターを適用したい。私はそれを行うためのscipy関数を見つけました:

scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)

シグマのパラメーターを選択して、ガウシアンウィンドウが5x5ピクセルになるようにするにはどうすればよいですか?

21
user2863620

ここでソースコードをチェックしてください: https://github.com/scipy/scipy/blob/master/scipy/ndimage/filters.py

軸ごとにgaussian_filtergaussian_filter1dを呼び出すことがわかります。 gaussian_filter1dでは、フィルターの幅はsigmatruncateの値によって暗黙的に決定されます。実際には、幅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である入力をフィルター処理して(つまり、フィルターのインパルス応答を見つけて)、フィルター処理された出力の非ゼロ値の数を数えることで確認できます。 (以下では、npnumpyです。)

最初に、単一の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
27

優れた以前の答えに従って:

  1. シグマを設定_s = 2_
  2. ウィンドウサイズを設定_w = 5_
  3. 「切り捨て」値を評価します:t = (((w - 1)/2)-0.5)/s
  4. フィルタリング:filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)
10
Gustavo Ortiz