Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 寻找直方图的局部最大值/峰值和最小值/谷值_C# 4.0_Image Processing_Histogram_Mathematical Optimization_Image Segmentation - Fatal编程技术网

C# 4.0 寻找直方图的局部最大值/峰值和最小值/谷值

C# 4.0 寻找直方图的局部最大值/峰值和最小值/谷值,c#-4.0,image-processing,histogram,mathematical-optimization,image-segmentation,C# 4.0,Image Processing,Histogram,Mathematical Optimization,Image Segmentation,好的,我有一个直方图(由整数数组表示),我正在寻找找到局部最大值和最小值的最佳方法。每个直方图应该有3个峰值,其中一个(第一个)可能比其他的高很多 我想做几件事: 找到第一个峰后的第一个“谷”(为了完全摆脱图中的第一个峰) 在剩下的两个峰值之间找到最佳的“谷”值以分离图片 我已经知道如何通过实现Otsu的变体来执行步骤2。 但我正在努力完成第一步 如果剩下的两座山峰之间的山谷不够低,我想发出警告 此外,图像非常干净,几乎没有噪音 执行步骤1和步骤3的暴力算法是什么?我可以找到一种实现大津的方法,

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

我想做几件事:

  • 找到第一个峰后的第一个“谷”(为了完全摆脱图中的第一个峰)

  • 在剩下的两个峰值之间找到最佳的“谷”值以分离图片

    我已经知道如何通过实现Otsu的变体来执行步骤2。 但我正在努力完成第一步

  • 如果剩下的两座山峰之间的山谷不够低,我想发出警告

  • 此外,图像非常干净,几乎没有噪音

    执行步骤1和步骤3的暴力算法是什么?我可以找到一种实现大津的方法,但从数学角度看,蛮力正在逃离我。事实证明,有更多关于像大津这样的方法的文档,而很少有关于简单地寻找峰值和谷值的文档。除了完成工作之外,我不需要其他任何东西(即,这是一个临时解决方案,必须在合理的时间范围内实施,直到我可以花更多的时间在上面)

    我用c语言做这些#

    如果您有任何需要采取的步骤,我们将不胜感激! 非常感谢你

    编辑:更多数据:

    大多数直方图可能与第一个相似,第一个峰值代表背景


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

    资料来源:

    下面是我的代码:

    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;
    }
    
    公共静态列表PeakinessTest(int[]直方图,双peakinessThres)
    {
    int j=0;
    列表=新列表();
    //山谷的起点
    int vA=直方图[j];
    int P=vA;
    //山谷的尽头
    int vB=0;
    //山谷的宽度,默认宽度为1
    int W=1;
    //vA和vB之间的像素总和
    int N=0;
    //峰峰值的测量
    双峰值=0.0;
    int峰值=0;
    bool=假;
    尝试
    {
    而(j<254)
    {
    l=假;
    vA=直方图[j];
    P=vA;
    W=1;
    N=vA;
    int i=j+1;
    //寻峰
    而(P=直方图[i])
    {
    vB=直方图[i];
    W++;
    N+=直方图[i];
    i++;
    }
    //计算峰值
    峰值=(1-(双)(vA+vB)/(2.0*P))*(1-((双)N/(双)(W*P));
    if(peakiness>peakinesthres&!valley.Contains(j))
    {
    //峰值。添加(峰值);
    7.添加(j);
    增加(i-1);
    }
    j=i-1;
    }
    }
    捕获(例外)
    {
    如果(l)
    {
    vB=直方图[255];
    峰值=(1-(双)(vA+vB)/(2.0*P))*(1-((双)N/(双)(W*P));
    如果(峰值>峰值三)
    增加(255);
    //增加(255);
    返回谷;
    }   
    }
    //如果(!valley.Contains(255))
    //增加(255);
    返回谷;
    }
    
    请您提供一些样本数据好吗?山峰周围的面积是否呈正态分布?例如,您可以将三个独立的正态分布拟合到您的数据中。然后你可以用标准差来决定分界点,以确定你的峰谷。那么用k=3的k均值算法来获得3个不同的聚类呢?如果一切顺利,每个质心都应该对应一个峰值。@EdwinG您是否尝试过将直方图视为一个图像,构造一个凸包,然后继续对其进行分析?我记得我读过一篇30年前的论文,这篇文章与我很快描述的方法有关。你可以尝试先平滑你的直方图(通过运行平均值或高斯卷积),然后应用数值导数(即取相邻值之间的差值)。例如,可以通过一阶导数中的符号变化来检测极值。