scipyのガウスフィルタ 質問する

scipyのガウスフィルタ 質問する

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の値によって暗黙的に決定されます。実際には、幅はsigmatruncatew

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

おすすめ記事