2009-12-02 22 views
7

1次元ガウスフィルタを返す関数を記述しようとしています。関数はシグマをパラメータとして取りました。問題は、関数がすべてのsigmasに対して同じ配列を返すことです。Matlabの1次元ガウス畳み込み関数

function gaussFilter=gauss(sigma) 
    width = 3 * sigma; 
    support = (-width :sigma: width); 
    gaussFilter= exp(- (support).^2/(2*sigma^2)); 
    gaussFilter = gaussFilter/ sum(gaussFilter); 

サポート配列は正しく計算されますが、expを適用すると問題が発生することに注意してください。

+0

何が起こりますか? –

+1

e ^スカラーを返します。 – Jacob

答えて

4

アイデアは、フィルタがするのに十分な幅にする必要があるということですガウス関数を表す。経験則は少なくとも6*sigmaのフィルタサイズを使用することです。

サポートは0に集中する必要があるため、-3*sigmaから+3*sigmaの範囲を指定します(より正確には、中央にゼロを計上するには-/+ round(6*sigma - 1)/2です)。したがって:

function gaussFilter = gauss(sigma) 
    width = round((6*sigma - 1)/2); 
    support = (-width:width); 
    gaussFilter = exp(-(support).^2 ./ (2*sigma^2)); 
    gaussFilter = gaussFilter/ sum(gaussFilter); 

:あなたはスカラーと `exp`を実行すると(以下のすべてが等価である)

sigma = 1.2; 
width = round((6*sigma - 1)/2); 

gauss(sigma) 

normpdf(-width:width, 0, sigma) 

fspecial('gaussian', [1 2*width+1], sigma) 

h = gausswin(2*width+1)'; 
h = h/sum(h) 
+0

+1バック(私は実際にこれを長年前に+1しました!)Image Processing Toolboxをお持ちでない場合はとても良いです。 – rayryeng

4

結果に間違いはありません。あなたは、-support.^2

[-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2] 

をサポートする各要素を二乗して-1を掛けた場合、あなたのsupportベクトルだから2*sigma^2ことによってそれを分割することは、常に同じベクトルになり、基本的に

[-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma] 

されて、

[-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2] 

または

-4.5000 -2.0000 -0.5000   0 -0.5000 -2.0000 -4.5000 

だからあなたはいつも同じ答えを得ています。

したがって、アルゴリズムをチェックして、1次元ガウスフィルタを作成する必要があります。

EDIT:

あなたの元のコードは大丈夫です:除いあなたは-3*sigma:sigma:3*sigmasupportを作った理由を私は理解していない - あなたはsupport = -3:3にそれを変更する必要があります。

また、使用することができます。

gaussFilter = fspecial('gaussian',[1 7],sigma) 

EDIT:完全なコードや説明のためのチェックアウトAmro's solutionなぜsupport = -3*sigma:3*sigmaなくsupport = -3*sigma:sigma:3*sigma

+0

ありがとう、私はループを申請したくありません。私は代わりにベクトル(サポート)を使用したいと思います。どうすればいいか教えてください。 – Hani

+0

あなたが書いたことは、シグマ= 1では正しいですが、3 *シグマ:シグマ:3 *シグマは、2つの間にシグマを持つ6つの要素を与えます。ありがとうございますfspecialアドバイスが、私は使用しないでくださいone.Butでもサポート= -3:3の結果は同じ、それはないでしょうか? – Hani

+0

結果はシグマに関して変更されます。 'support'は'シグマ 'とは独立しているべきです、あなたの場合は1x7ベクトルと思われるウィンドウサイズに依存するだけです。 – Jacob

関連する問題