30-GrabCut与FloodFill(EmguCV学习)

文章目录

总结

1、Grabcuts算法: 是Graphcuts算法的改进,用于用户导向的图像分割,具有较好的分割效果;Grabcuts算法的改进:①使用高斯混合代替Graphcuts中的直方图模型,使算法可以用于彩色图像;②通过迭代方法解决了能量函数最小化的问题,提供了一个更高的全局结果,赋予用户提供的标记更大的灵活性;
2、Grabcuts算法允许调用者只在待分割对象周围提供一个矩形框,矩形框的外部属于背景,并没有指定前景;(Grabcuts算法具有较好的分割性,但运行时间较长);
3、grabCut()函数中:
参数mas中每一个像素最好赋值,赋值范围只能为:0,1,2,3;背景色为0;
参数mode控制使用矩形初始化Grab,还是使用mask初始化Grab;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、漫水填充算法:floodfill():
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;

namespace lesson30
{
    class Program
    {
        static void Main(string[] args)
        {
            ///使用Rectangle初始化Grab进行图像分割
            ////Mat src = CvInvoke.Imread("2.bmp");
            //Mat src = CvInvoke.Imread("bird.jpg");
            //Mat mask = new Mat();
            //Mat bgModel = new Mat();
            //Mat fgModel = new Mat();
            //Rectangle rect = new Rectangle(78, 69, 406, 332);
            ////Rectangle rect = new Rectangle(223, 123, 308, 356);
            //CvInvoke.GrabCut(src, mask, rect, bgModel, fgModel, 5,
            //                GrabcutInitType.InitWithRect);  //GrabCut 算法进行图像分割
            //CvInvoke.Rectangle(src, rect, new MCvScalar(0, 0, 255), 2);
            //CvInvoke.Imshow("input", src);
            //CvInvoke.Imshow("grab", mask);
            //Mat prFGD = new Mat(src.Size, DepthType.Cv8U, 1);
            //prFGD.SetTo(new MCvScalar(3));  //属于前景的像素
            //Mat mask1 = new Mat();
            //CvInvoke.Compare(mask, prFGD, mask1, CmpType.Equal);   //提取前景像素的掩膜

            //Mat dst = new Mat();
            //src.CopyTo(dst, mask1);
            //CvInvoke.Imshow("result", dst);        
            //CvInvoke.WaitKey(0);

            ///使用mask初始化GrabCut进行分割
            //Mat src = CvInvoke.Imread("bird.jpg");
            //CvInvoke.Imshow("input", src);
            //Mat mask = new Mat(src.Size, DepthType.Cv8U, 1);            
            //mask.SetTo(new MCvScalar(0));   //这一步必须有:将所有像素值设为0:表示均为背景
            ////设置掩膜
            //Rectangle rect = new Rectangle(78, 69, 406, 332);
            //Mat roi = new Mat(mask, rect);
            //roi.SetTo(new MCvScalar(3));    //注意这里掩膜值必须在0、1、2、3之间选取

            //Mat fgModel = new Mat();
            //Mat bgModel = new Mat();
            ////使用Mask掩分割图像
            //CvInvoke.GrabCut(src, mask, new Rectangle(), bgModel, fgModel, 3, GrabcutInitType.InitWithMask);

            //Mat prFGD = new Mat(src.Size, DepthType.Cv8U, 1);
            //prFGD.SetTo(new MCvScalar(3));
            //Mat mask_dst = new Mat();
            //CvInvoke.Compare(mask, prFGD, mask_dst, CmpType.Equal);     //像素值比较

            //Mat dst = new Mat();
            //src.CopyTo(dst, mask_dst);
            //CvInvoke.Imshow("result", dst);
            //CvInvoke.WaitKey(0);

            ///漫水填充算法
            Mat src = CvInvoke.Imread("2.bmp");
            CvInvoke.Imshow("input", src);

            Rectangle rect = new Rectangle();
            Mat mask = new Mat();
            //漫水填充
            CvInvoke.FloodFill(src, mask, new Point(100, 100), new MCvScalar(255, 0, 255), out rect, new MCvScalar(5, 5, 5),
                               new MCvScalar(5, 5, 5));
            CvInvoke.Circle(src, new Point(100, 100), 5, new MCvScalar(0, 255, 0), -1);
            CvInvoke.Imshow("result", src);
            CvInvoke.WaitKey(0);
        }
    }
}

效果

1、Grabcut算法,迭代次数:12(计算时间稍长)
在这里插入图片描述
2、Grabcut算法,迭代次数:5

在这里插入图片描述
3、提取背景:

在这里插入图片描述
在这里插入图片描述

4、漫水填充:
在这里插入图片描述

发布了61 篇原创文章 · 获赞 5 · 访问量 4459

猜你喜欢

转载自blog.csdn.net/hellohake/article/details/105090398
今日推荐