15

これはLoGフィルタリングの式です:( 出典:ed.ac.uk代替テキスト

また、LoGフィルタリングを使用するアプリケーションでは、関数が1つのパラメーターsigma(σ)のみで呼び出されることがわかります。その式を使用してLoGフィルタリングを試してみたい(以前の試みは、ガウスフィルター、次にフィルターウィンドウサイズのラプラシアンフィルターによるものでした)しかし、その式を見ると、フィルターのサイズがこの式とどのように関連しているか理解できません。フィルタサイズが固定されていることを意味しますか?使い方を教えてください。

4

4 に答える 4

8

他の回答やリンクからおそらくわかっているように、Log フィルターは画像のエッジとラインを検出します。まだ欠けているのは、σ とは何かの説明です。

σ はフィルターのスケールです。1 ピクセル幅の線は線またはノイズですか? 幅が 6 ピクセルの線は、2 つの明確な平行エッジを持つ線またはオブジェクトですか? 6 ピクセルまたは 8 ピクセルにわたって黒から白に変化するグラデーションは、エッジですか、それとも単なるグラデーションですか? それはあなたが決定しなければならないことであり、σ の値はあなたの決定を反映します — σ が大きいほど線は広くなり、エッジはより滑らかになり、より多くのノイズが無視されます。

フィルターのスケール (σ) と離散近似 (通常はステンシルと呼ばれる) のサイズを混同しないでください。Paul のリンクでは σ=1.4 で、ステンシル サイズは 9 です。通常は 4σ から 6σ のステンシル サイズを使用するのが合理的ですが、これら 2 つの量はまったく独立しています。ステンシルを大きくすると、フィルターの近似が向上しますが、ほとんどの場合、それほど正確な近似は必要ありません。

于 2010-03-30T16:02:02.937 に答える
5

これも私を混乱させたものでした。ユニプロジェクトであなたと同じことをしなければならなかったので、あなたが数式で何をすべきかを理解しました。

この式を使用して、離散LoGフィルターを生成できます。その式を実装するためのコードを少し書くと、画像の畳み込みで使用するフィルターを生成できます。たとえば5x5テンプレートを生成するには、xとyの範囲が-2から+2のコードを呼び出すだけです。

これにより、LoGテンプレートで使用する値が生成されます。これが生成する値をグラフ化すると、次のように、このフィルターに典型的な「メキシコの帽子」の形が表示されます。

LoGテンプレート
(出典:ed.ac.uk

テンプレートの幅(サイズ)とシグマ値(ピークの幅)を変更することで、テンプレートを微調整できます。テンプレートが広くなるほど、ノイズの影響を受けにくくなります。これは、テンプレートがより広い領域で動作するためです。

フィルタを取得したら、テンプレートを画像で畳み込むことにより、フィルタを画像に適用できます。これまでにこれを行ったことがない場合は、これらのいくつかのチュートリアルを確認してください。 javaアプレットのチュートリアル より数学的な

基本的に、各ピクセル位置に、そのピクセルを中心に畳み込みテンプレートを「配置」します。次に、周囲のピクセル値にテンプレート内の対応する「ピクセル」を掛けて、結果を合計します。これがその位置の新しいピクセル値になります(通常、出力を正規化(スケーリング)して正しい値の範囲に戻す必要があります)。

以下のコードは、これをどのように実装するかについての大まかなアイデアを示しています。テストされていないので、間違い/タイプミスなどはご容赦ください。

これがお役に立てば幸いです。

private float LoG(float x, float y, float sigma)
{
    // implement formula here
    return (1 / (Math.PI * sigma*sigma*sigma*sigma)) * //etc etc - also, can't remember the code for "to the power of" off hand
}

private void GenerateTemplate(int templateSize, float sigma)
{
    // Make sure it's an odd number for convenience
    if(templateSize % 2 == 1)
    {
        // Create the data array
        float[][] template = new float[templateSize][templatesize];

        // Work out the "min and max" values. Log is centered around 0, 0
        // so, for a size 5 template (say) we want to get the values from
        // -2 to +2, ie: -2, -1, 0, +1, +2 and feed those into the formula.
        int min = Math.Ceil(-templateSize / 2) - 1;
        int max = Math.Floor(templateSize / 2) + 1;

        // We also need a count to index into the data array...
        int xCount = 0;
        int yCount = 0;

        for(int x = min; x <= max; ++x)
        {
            for(int y = min; y <= max; ++y)
            {
                // Get the LoG value for this (x,y) pair
                template[xCount][yCount] = LoG(x, y, sigma);
                ++yCount;
            }
            ++xCount;
        }
    }
}
于 2010-03-30T13:31:45.847 に答える
2

視覚化のために、ここにガウスのラプラシアン(メキシカンハット)ウェーブレットの単純なMatlab3Dカラープロットを示します。sigma(σ)パラメーターを変更して、グラフの形状への影響を確認できます。

sigmaSq = 0.5 % Square of σ parameter
[x y] = meshgrid(linspace(-3,3), linspace(-3,3)); 
z = (-1/(pi*(sigmaSq^2))) .* (1-((x.^2+y.^2)/(2*sigmaSq))) .*exp(-(x.^2+y.^2)/(2*sigmaSq)); 
surf(x,y,z)

また、次のようにして、シグマパラメータがメキシカンハットに与える影響を比較することもできます。

t = -5:0.01:5;
sigma = 0.5;

mexhat05 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 1;
mexhat1 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

sigma = 2;
mexhat2 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1) / (pi^(1/4)*sqrt(3*sigma));

plot(t, mexhat05, 'r', ...
     t, mexhat1, 'b', ...
     t, mexhat2, 'g');

または、Matlabが提供するWaveletツールボックスを次のように使用します。

lb = -5; ub = 5; n = 1000; 
[psi,x] = mexihat(lb,ub,n); 
plot(x,psi), title('Mexican hat wavelet')

コンピュータビジョンのエッジ検出にこれを実装するときに、これが役立つことがわかりました。正確な答えではありませんが、これがお役に立てば幸いです。

于 2012-11-12T03:34:17.760 に答える
1

これは、半径が sqrt(2) * sigma である連続円形フィルターのように見えます。画像処理のためにこれを実装したい場合は、近似する必要があります。

ここに sigma = 1.4 の例があります: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

于 2010-03-30T13:07:14.743 に答える