GrabCut是一种基于图切割的图像分割方法。GrabCut算法是基于Graph Cut算法的改进。
基于要被分割对象的指定边界框开始,使用高斯混合模型估计被分割对象和背景的颜色分布(注意,这里将图像分为被分割对象和背景两部分)。简而言之,就是只需确认前景和背景输入,该算法就可以完成前景和背景的最优分割。
该算法利用图像中纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作就可得到较好的分割效果,和分水岭算法比较相似,但计算速度比较慢,得到的结果比较精确。若从静态图像中提取前景物体(例如从一个图像剪切到另外一个图像),采用GrabCut算法是最好的选择。
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) -> mask, bgdModel, fgdModel
参数:
img - 8 位 3 通道图像。这也说明输入的为彩色图像
mode - 操作模式,可以是 GrabCutModes 模式中的一种。枚举值enmu
引用原语句
enum cv::GrabCutModes { cv::GC_INIT_WITH_RECT = 0, cv::GC_INIT_WITH_MASK = 1, cv::GC_EVAL = 2 }详细内容
参考:
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, 矩形外部的像素为背景, 矩形内部的像素为前景,当参数使用
原文:https://www.cnblogs.com/gengyi/p/10348051.html