C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码

1 全局阈值的耶恩算法(Yen Throsholding)

常见阈值算法

1.1黄算法

HuangThresholdImageFilter使用Shannon的熵函数实现Huang的模糊阈值[1]。模糊性度量表示原始图像与其二进制版本之间的差异。

对于给定的阈值级别,像素的模糊隶属度函数由像素灰度级和其所属区域的平均灰度级之间的绝对差来定义,较大的差导致较小的隶属度值。最佳阈值是将模糊性最小化的值,如香农熵函数所定义的,应用于模糊隶属函数。

1.2间歇性算法

IntermodesThresholdImageFilter实现了[8]中描述的方法。对直方图进行迭代平滑,直到只剩下两个峰值。在一个变体中,阈值是两个峰值的中点,而在另一个变体,阈值是峰值之间的最小点。使用UseIntermodeOff方法选择这两种变体。这对于峰值非常不相等的直方图是不好的。

1.3 ISO数据算法

IsoDataThresholdImageFilter实现了Ridler和Calvard的[9]isodata方法。它计算低于和高于初始阈值的体素的平均值。阈值设置为两者的平均值。重复此操作,直到阈值大于两个区域的亮度平均值。

1.4 Li算法

LiThresholdImageFilter实现了Li的最小交叉熵方法[5,6],该方法选择了最小化原始图像和阈值图像之间的交叉熵的阈值。

1.5最大熵算法

MaxEntropyThresholdImageFilter实现了[2]中描述的方法,该方法选择一个阈值,以使高于和低于阈值的分布的熵最大化。这是几种基于熵的方法之一。

1.6雷尼熵算法

RenyiEntropyThresholdImageFilter与MaxEntropy相似,但使用了不同的熵度量[2]。

1.7Kittler算法,基特尔·伊林沃思

KittlerIllingworthThresholdImageFilter实现了最小误差阈值方法[3]。选择一个阈值,以最小化给定均值、方差和比例的两个正态分布之间的错误分类数量。该方法假设高斯混合模型,类似于Otsu方法。

1.8力矩保持算法

MomentsThresholdImageFilter实现了Tsai的矩保持方法[11],该方法选择阈值,使得二进制图像具有与灰度图像相同的前三个矩。

1.9耶恩算法

YenThresholdImageFilter基于最大相关准则[12]实现阈值化,作为熵度量的更有效的计算替代方案。

1.10香巴拉算法

ShanbhagThresholdImageFilter实现了Shanbhag对Kapur方法的扩展[10],其中包括熵度量中与阈值的距离。

1.11三角形算法

TriangleThresholdImageFilter实现了[13]的变体。三角形方法在直方图峰值和直方图最远端之间构建一条线。阈值是直线和直方图之间的最大距离点。此实现使用了直方图末端的稳健(默认值为1%和99%)估计。

BrainTonDensitySSlice图像经过裁剪和平滑,用于演示结果。已应用平滑来避免直方图中的间隙,并应用裁剪来去除原始图像中填充导致的0处的峰值。这是一个稍微有挑战性的图像,因为有三个类别,但两个较亮的类别重叠。基于模式的方法如图2所示;在最暗(背景)类和前景之间选择阈值,从而合并两个前景类。图3所示的一些熵度量试图以不同的成功程度分割两个前景类。阈值如图4中的直方图所示。

这些类可以以类似于成熟的OtsuThresholdImageFilter的方式使用。类在输入和输出图像类型上进行模板化,并具有设置输出内部和外部像素值、直方图箱数、SetNumberOfHistogramBins的方法。中间模式有一种选择中间模式或最小选择选项SetU的方法

2 全局阈值的耶恩算法(Yen Throsholding)的源代码

二值算法综述请阅读:

C#,图像二值化(01)——二值化算法综述与二十三种算法目录

https://blog.csdn.net/beijinghorn/article/details/128425225?spm=1001.2014.3001.5502

支持函数请阅读:

C#,图像二值化(02)——用于图像二值化处理的一些基本图像处理函数之C#源代码

https://blog.csdn.net/beijinghorn/article/details/128425984?spm=1001.2014.3001.5502


namespace Legalsoft.Truffer.ImageTools
{
    public static partial class BinarizationHelper
    {
        #region 灰度图像二值化 全局算法 Yen 算法 

        /// 
        /// Yen算法
        /// 
        /// 
        /// 
        public static int Yen_Threshold(int[] histogram)
        {
            int total = Histogram_Sum(histogram);
            double[] norm_histo = Histogram_Normalize(histogram);

            double[] P1 = new double[histogram.Length];
            double[] P1_sq = new double[histogram.Length];
            double[] P2_sq = new double[histogram.Length];
            P1[0] = norm_histo[0];
            for (int ih = 1; ih < histogram.Length; ih++)
            {
                P1[ih] = P1[ih - 1] + norm_histo[ih];
            }
            P1_sq[0] = norm_histo[0] * norm_histo[0];
            for (int ih = 1; ih < histogram.Length; ih++)
            {
                P1_sq[ih] = P1_sq[ih - 1] + norm_histo[ih] * norm_histo[ih];
            }
            P2_sq[histogram.Length - 1] = 0.0;
            for (int ih = histogram.Length - 2; ih >= 0; ih--)
            {
                P2_sq[ih] = P2_sq[ih + 1] + norm_histo[ih + 1] * norm_histo[ih + 1];
            }

            int threshold = -1;
            double max_crit = Double.MinValue;
            for (int it = 0; it < histogram.Length; it++)
            {
                double crit = -1.0 * ((P1_sq[it] * P2_sq[it]) > 0.0 ? Math.Log(P1_sq[it] * P2_sq[it]) : 0.0) + 2 * ((P1[it] * (1.0 - P1[it])) > 0.0 ? Math.Log(P1[it] * (1.0 - P1[it])) : 0.0);
                if (crit > max_crit)
                {
                    max_crit = crit;
                    threshold = it;
                }
            }
            return threshold;
        }

        public static void Yen_Algorithm(byte[,] data)
        {
            int[] histogram = Gray_Histogram(data);
            int threshold = Yen_Threshold(histogram);
            Threshold_Algorithm(data, threshold);
        }

        #endregion
    }
}

3 全局阈值的耶恩算法(Yen Throsholding)计算效果

POWER BY 315SOFT.COM AND TRUFFER.CN

:-)

你可能感兴趣的:(C#算法演义,Algorithm,Recipes,C#实用代码,Coding,Recipes,算法,c#,计算机视觉,图像处理)