總結
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、漫水填充: