OpenCVSharp 分水岭算法

分水岭算法的原理大概就是在需要被区分的各个区域注入不同的颜色的水,这个水会染色它标志处的点,然后还会染色相邻的像素值差不多的点,不断漫延到像素值差异大的点停止。

        public void Run()
        {
 
            Mat src = Cv2.ImRead("./Data/Image/lumu.jpg");

            Console.WriteLine("用鼠标 标记前景,然后按键盘任意键。");
            Cv2.ImShow("src", src);
            Cv2.SetMouseCallback("src", MyMouseCallback);
            Cv2.WaitKey();

            Mat imgMask = new Mat(src.Size(), MatType.CV_8U, Scalar.Black);

  

            imgMask.Rectangle(new Rect(1, 1, imgMask.Width - 2, imgMask.Height - 2), new Scalar(255));
            foreach (var pp in p)
            {
                imgMask.Circle(pp, 3, new Scalar(1), -1);
            }
            Console.WriteLine("用鼠标 标记被分割的背景,然后按键盘任意键。");
            Cv2.ImShow("src", src);
            Cv2.SetMouseCallback("src", MyMouseCallbackbg);
            Cv2.WaitKey();

 

            foreach (var pp in p2)
            {
                imgMask.Circle(pp, 3, new Scalar(200), -1);
            }
 

            imgMask.ConvertTo(imgMask, MatType.CV_32S);
            Cv2.Watershed(src, imgMask);
            Mat mask = new Mat();
            imgMask.ConvertTo(mask, MatType.CV_8U);
 
            mask = mask.Threshold(100, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu);
 

            Mat dst = Mat.Zeros(src.Height, src.Width, MatType.CV_8UC3);
            src.CopyTo( dst, mask);

            Cv2.ImShow("dst", dst);
            Cv2.WaitKey();

        }

        readonly List<Point> p = new List<Point>();
        readonly List<Point> p2 = new List<Point>();
        private void MyMouseCallback(MouseEventTypes e, int x, int y, MouseEventFlags f, IntPtr Data)
        {
            if (e == MouseEventTypes.LButtonDown)
            {
                Console.WriteLine(x + ":" + y);
                p.Add(new Point(x, y));
            }
        }
        private void MyMouseCallbackbg(MouseEventTypes e, int x, int y, MouseEventFlags f, IntPtr Data)
        {
            if (e == MouseEventTypes.LButtonDown)
            {
                Console.WriteLine(x + ":" + y);
                p2.Add(new Point(x, y));
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值