k聚类简单实现(灰度分割,分黑白)

该算法使用K-Means迭代策略将图像分割为黑白两类,通过比较像素值与预设阈值globu1和globu2来归类像素点。然后更新类别的均值,当均值变化小于一定阈值时停止迭代。最终将黑色类染为红色以核对结果正确性。
摘要由CSDN通过智能技术生成

加载图像:

k聚类分割后图像,分成黑白两类,故意把结果黑色类染红,核对发现是正确的:

  具体算法如下:

float globu1 = 40;
        float globu2 = 180;

  public void k均值迭代法更新(int imgw, int imgh, byte[] img)
        {
            //1,归类
            List<Point> QArea1 = new List<Point>();
            List<Point> QArea2 = new List<Point>();
            for (int i = 0; i < imgw; i++)
                for (int j = 0; j < imgh; j++)
                {
                    int pos = j * imgw + i;
                    if (Math.Abs(img[pos] - globu1) - Math.Abs(img[pos] - globu2) < 0)
                    {
                        Point tempt = new Point(i, j);
                        QArea1.Add(tempt);
                    }
                    else
                    {
                        Point tempt = new Point(i, j);
                        QArea2.Add(tempt);
                    }
                }
            //2,更新均值
            float u1 = 0; float u2 = 0;
            for (int i = 0; i < QArea1.Count; i++)
            {
                int pos = QArea1[i].Y * imgw + QArea1[i].X;
                u1 += img[pos];
            }
            for (int i = 0; i < QArea2.Count; i++)
            {
                int pos = QArea2[i].Y * imgw + QArea2[i].X;
                u2 += img[pos];
            }
            u1 = u1 / QArea1.Count;
            u2 = u2 / QArea2.Count;
            if (Math.Abs(globu1 - u1) < 2 || Math.Abs(globu2 - u2) < 2)
            {
                return;
            }
            else
            {
                globu1 = u1;
                globu2 = u2;
                k均值迭代法更新(imgw, imgh, img);
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值