OpenCV 学习笔记 04 GrabCut算法

GrabCut是一种基于图切割的图像分割方法。GrabCut算法是基于Graph Cut算法的改进。

基于要被分割对象的指定边界框开始,使用高斯混合模型估计被分割对象和背景的颜色分布(注意,这里将图像分为被分割对象和背景两部分)。简而言之,就是只需确认前景和背景输入,该算法就可以完成前景和背景的最优分割。

该算法利用图像中纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作就可得到较好的分割效果,和分水岭算法比较相似,但计算速度比较慢,得到的结果比较精确。若从静态图像中提取前景物体(例如从一个图像剪切到另外一个图像),采用GrabCut算法是最好的选择。

cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) -> mask, bgdModel, fgdModel

参数:

img - 8 位 3 通道图像。这也说明输入的为彩色图像

mode - 操作模式,可以是 GrabCutModes 模式中的一种。枚举值enmu

  • GC_INIT_WITH_RECT(=0),用矩形窗口初始化GRabCut;
  • GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;
  • GC_EVAL(=2),执行分割

  引用原语句

enum      
cv::GrabCutModes { 
  cv::GC_INIT_WITH_RECT = 0, 
  cv::GC_INIT_WITH_MASK = 1, 
  cv::GC_EVAL = 2 
}

详细内容

Enumerator
GC_INIT_WITH_RECT 

The function initializes the state and the mask using the provided rectangle. After that it runs iterCount iterations of the algorithm.

该函数使用提供的矩形初始化状态和掩码。之后,它运行算法的iterCount迭代。

GC_INIT_WITH_MASK 

The function initializes the state using the provided mask. Note that GC_INIT_WITH_RECT and GC_INIT_WITH_MASK can be combined. Then, all the pixels outside of the ROI are automatically initialized with GC_BGD .

GC_EVAL 

The value means that the algorithm should just resume.

参考:

https://docs.opencv.org/3.1.0/d7/d1b/group__imgproc__misc.html

https://docs.opencv.org/3.1.0/d7/d1b/group__imgproc__misc.html#gaf8b5832ba85e59fc7a98a2afd034e558

mask - mask - 输入/输出 8 位单通道掩码, 当mode = GC_INIT_WITH_RECT时,该函数初始化掩码。

输入/输出8位单通道掩码。 它的元素可能有一个#GrabCutClasses。

掩码图像,如果使用掩码进行初始化,那么mask保存初始化掩码信息;在执行分割的时候,也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数;在处理结束之后,mask中会保存结果。mask只能取以下四种值:
  GCD_BGD(=0),背景;
  GCD_FGD(=1),前景;
  GCD_PR_BGD(=2),可能的背景;
  GCD_PR_FGD(=3),可能的前景。

 8位单通道掩码图像, 如果使用掩码进行初始化, 那么mask保存掩码信息, 在执行分割的时候, 也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数, 在处理结束之后,mask中会保存结果。 
Mask只能取4种可能的值: 

cv2.GC_INIT_WITH_RECT或cv2.GC_INIT_WITH_MASK,或者组合起来决定我们是画矩形还是最后的触点.

      GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;

                   GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;

                   GC_EVAL(=2),执行分割。

操作模式可以是#GrabCutModes之一

rect - 包含分割对象的矩形ROI(Region of Interesting,ROI,感兴趣区域),ROI外部的像素位背景,ROI内部的像素位前景。该参数仅在mode=GC_INIT_WITH_RECT情况下使用。

  包含分段对象的ROI。 ROI外部的像素标记为“明显的背景”。 该参数仅在mode ==#GC_INIT_WITH_RECT时使用。

包含分割对象的矩形ROI, 矩形外部的像素为背景, 矩形内部的像素为前景,当参数使用

猜你喜欢

转载自www.cnblogs.com/gengyi/p/10348051.html