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、漫水填充:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章