总结
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、漫水填充: