最大类间方差法(大津法OTSU)

        public static byte OstuThreshold(Bitmap bitmap)
        {
            byte threshold = 128;
            if (bitmap.PixelFormat == PixelFormat.Format8bppIndexed)
            {
                Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                BitmapData bmpData = bitmap.LockBits(
                    rect,
                    ImageLockMode.ReadWrite,
                    bitmap.PixelFormat);

                int[] countPixel = new int[256];
                Array.Clear(countPixel, 0, 256);
                int offset = bmpData.Stride - bmpData.Width;
                int sum = bitmap.Height * bitmap.Width;
                double sumPixel = 0;
                double scale = 1 / (double)sum;

                unsafe
                {
                    byte* ptr = (byte*)bmpData.Scan0;
                    //calculate the count of each gray level
                    for (int y = 0; y < bmpData.Height; ++y)
                    {
                        for (int x = 0; x < bmpData.Width; ++x)
                        {
                            ++countPixel[*ptr];
                            ++ptr;
                        }
                        ptr += offset;
                    }
                }

                for (int i = 0; i < 256; ++i)
                {
                    sumPixel += i * countPixel[i];
                }

                int forePart = 0, backPart;
                double foreSum = 0, backSum;
                double foreAver, backAver;
                double minCost = -1, costFuc;

                for (int i = 0; i < 256; ++i)
                {
                    forePart += countPixel[i];
                    if (0 == forePart) continue;
                    backPart = sum - forePart;
                    if (0 == backPart) break;
                    foreSum += i * countPixel[i];
                    backSum = sumPixel - foreSum;
                    foreAver = foreSum / forePart;
                    backAver = backSum / backPart;
                    costFuc = forePart * scale * backPart * (foreAver - backAver) * (foreAver - backAver);
                    //find the cost function with the least value
                    if (costFuc > minCost)
                    {
                        minCost = costFuc;
                        threshold = (byte)i;
                    }
                }
                bitmap.UnlockBits(bmpData);
            }

            return threshold;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值