9

わかりましたので、ヒストグラム (int の配列で表される) があり、局所的な最大値と最小値を見つけるための最良の方法を探しています。各ヒストグラムには 3 つのピークがあり、そのうちの 1 つ (最初のピーク) はおそらく他のピークよりもはるかに高くなります。

私はいくつかのことをしたい:

  1. 最初のピークに続く最初の「谷」を見つけます (図で最初のピークを完全に取り除くため)

  2. 残りの 2 つのピークの間で最適な「谷」の値を見つけて、画像を分離します。

    Otsu のバリアントを実装することで、ステップ 2 を実行する方法を既に知っています。しかし、私はステップ1に苦労しています

  3. 残りの 2 つのピークの間の谷が十分に低くない場合は、警告を発したいと思います。

また、画像は非常にきれいで、考慮すべきノイズはほとんどありません

ステップ 1 と 3 を実行するブルート フォース アルゴリズムは何でしょうか? 大津を実装する方法を見つけることができましたが、数学的には力ずくで逃げています。結局のところ、otsu のようなメソッドの実行に関するドキュメントは多く、単純に山と谷を見つける方法に関するドキュメントはあまりありません。私は仕事を成し遂げる以上のものを探していません(つまり、それは一時的な解決策であり、より多くの時間を費やすことができるようになるまで、合理的な時間枠で実装可能でなければなりません)

私はこれをすべてC#でやっています

どの手順を実行するかについてのヘルプをいただければ幸いです。どうもありがとう!

編集: いくつかのデータ:

ほとんどのヒストグラムは最初のピークに似ており、最初のピークが背景を表しています。

ヒストグラム

ヒストグラム 2

4

1 に答える 1

4

ピーキーテストを使用します。2 つの極小値の間で可能なすべてのピークを見つけ、数式に基づいてピーキーを測定する方法です。ピーキーがしきい値よりも高い場合、ピークは受け入れられます。

出典: UCF CV CAP5415 レクチャー 9 スライド

以下は私のコードです:

public static List<int> PeakinessTest(int[] histogram, double peakinessThres)
{
    int j=0;
    List<int> valleys = new List<int> ();

    //The start of the valley
    int vA = histogram[j];
    int P = vA;

    //The end of the valley
    int vB = 0;

    //The width of the valley, default width is 1
    int W = 1;

    //The sum of the pixels between vA and vB
    int N = 0;

    //The measure of the peaks peakiness
    double peakiness=0.0;

    int peak=0;
    bool l = false;

    try
    {
        while (j < 254)
        {

            l = false;
            vA = histogram[j];
            P = vA;
            W = 1;
            N = vA;

            int i = j + 1;

            //To find the peak
            while (P < histogram[i])
            {
                P = histogram[i];
                W++;
                N += histogram[i];
                i++;
            }


            //To find the border of the valley other side
            peak = i - 1;
            vB = histogram[i];
            N += histogram[i];
            i++;
            W++;

            l = true;
            while (vB >= histogram[i])
            {
                vB = histogram[i];
                W++;
                N += histogram[i];
                i++;
            }

                //Calculate peakiness
            peakiness = (1 - (double)((vA + vB) / (2.0 * P))) * (1 - ((double)N / (double)(W * P)));

            if (peakiness > peakinessThres & !valleys.Contains(j))
            {
                //peaks.Add(peak);                        
                valleys.Add(j);
                valleys.Add(i - 1);
            }

            j = i - 1;
        }
    }
    catch (Exception)
    {
        if (l)
        {
            vB = histogram[255];

            peakiness = (1 - (double)((vA + vB) / (2.0 * P))) * (1 - ((double)N / (double)(W * P)));

            if (peakiness > peakinessThres)
                valleys.Add(255);

                //peaks.Add(255);
            return valleys;
        }   
    }

        //if(!valleys.Contains(255))
        //    valleys.Add(255);

    return valleys;
}
于 2013-02-25T09:32:38.813 に答える