首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人知道如何实现“最优全局和自适应阈值”吗?

有人知道如何实现“最优全局和自适应阈值”吗?
EN

Stack Overflow用户
提问于 2010-07-27 22:11:16
回答 2查看 738关注 0票数 0

有人知道如何实现“最优全局和自适应阈值”算法吗?

如果知道,可以和我分享。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-07-27 23:40:42

看看基于图像直方图选择全局阈值的Otsu's方法。

票数 0
EN

Stack Overflow用户

发布于 2010-07-28 04:30:57

代码语言:javascript
复制
public int OtsuThreshold(double[] histogram)
{
    double pr1, pr2, pr;
    int t = 0;
    double[] vet = new double[255];

    double major = -1;
    //int idx;
    for (int k = 1; k < Util.GrayLevels-1; k++)
    {                
        pr1 = HistogramProbability(0, k, histogram);
        pr2 = HistogramProbability(k + 1, Util.MaxGrayLevel, histogram);
        pr=pr1*pr2;
        if(pr==0) pr=1;

        double result = Math.Pow((ImageMean(0, k, histogram) * pr2) - (ImageMean(k + 1, Util.MaxGrayLevel, histogram) * pr1), 2) / pr;
        if (result > major)
        {
            major = result;
            t = k;
        }
    }

    //t = IMaior(vet,Util.GrayLevels);
    return t;
}        


public double HistogramProbability(int start, int end, double[] histogram)
{
    if (start < 0 || end > histogram.Length)
        return 0;

    double p = 0;
    for (int i = start; i < end; ++i)
        p += histogram[i];

    return p;
}


public double ImageMean(int start, int end, double[] histogram)
{
    double mean = 0;

    if (start < 0 || end > histogram.Length) return 0;

    for (int i = start; i < end; i++)
    {
        mean += i * histogram[i];
    }

    return mean;
}

对不起,我知道这里有很多源代码,一些方法可能会丢失,但如果你遵循它,我会发现它并不是那么难。不幸的是,我正在重新发明轮子(没有使用任何库),但我希望这里的源码可以帮助你用你选择的语言编写它。

link可能会很有用

另外,如果你附近有图书馆(工程或CS资料),我推荐使用this book。它清楚地解释了Otsu方法是如何工作的。

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3344503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档