gpt4 book ai didi

c#-4.0 - 查找直方图的局部最大值/峰值和最小值/谷值

转载 作者:行者123 更新时间:2023-12-04 04:26:18 35 4
gpt4 key购买 nike

好的,所以我有一个直方图(用整数数组表示),我正在寻找找到局部最大值和最小值的最佳方法。每个直方图应具有3个峰,其中一个(第一个)峰可能比其他峰高得多。

我想做几件事:

  • 在第一个峰之后找到第一个“谷”(以便完全摆脱图中的第一个峰)
  • 在其余两个峰之间找到最佳“谷”值以分离图片

    我已经知道如何通过实现Otsu的变体来执行步骤2。
    但是我在第一步中苦苦挣扎
  • 如果剩余的两个峰之间的谷底不够低,我想发出警告。

  • 而且,图像非常干净,几乎没有噪点

    执行步骤1和步骤3的蛮力算法是什么?我可以找到一种实现Otsu的方法,但是从数学角度讲,蛮力正在逃避我。事实证明,有更多的文档来介绍类似otsu的方法,而很少有关于简单地查找峰谷的信息。我所寻求的不仅仅是完成任务的方法(即这是一个临时解决方案,只需要在合理的时间范围内实现,直到我可以花更多时间在上面)即可。

    我正在用C#进行所有这些操作

    任何帮助采取的步骤将不胜感激!
    非常感谢!

    编辑:更多数据:

    大多数直方图很可能像第一个直方图,第一个峰值代表背景。

    最佳答案

    使用峰值测试。这是一种找到两个局部最小值之间所有可能的峰,然后根据公式测量峰度的方法。如果峰值高于阈值,则接受该峰值。

    资料来源:UCF CV CAP5415 lecture 9 slides

    下面是我的代码:

    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;
    }

    关于c#-4.0 - 查找直方图的局部最大值/峰值和最小值/谷值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694523/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com