?? rect - 包含前景的矩形,格式为 (x,y,w,h)
?? bdgModel, fgdModel - 算法内部使用的数组. 你只需要创建两个大小为 (1,65),数据类型为 np.float64 的数组。
?? iterCount - 算法的迭代次数
?? mode 可以设置为 cv2.GC_INIT_WITH_RECT 或 cv2.GC_INIT_WITH_MASK,
也可以联合使用。这是用来确定我们进行修改的方式,矩形模式或者掩模模式。
首先,我们来看使用矩形模式。加载图片,创建掩模图像,构建 bdgModel和 fgdModel。传入矩形参数。都是这么直接。让算法迭代 5 次。由于我们在使用矩形模式所以修改模式设置为 cv2.GC_INIT_WITH_RECT。运行grabcut。算法会修改掩模图像,在新的掩模图像中,所有的像素被分为四类:
背景,前景,可能是背景/前景使用 4 个不同的标签标记(前面参数中提到过)。
然后我们来修改掩模图像,所有的 0 像素和 1 像素都被归为 0(例如背景),所有的 1 像素和 3 像素都被归为 1(前景)。我们最终的掩模图像就这样准备好了。用它和输入图像相乘就得到了分割好的图像。
结果如下:

哎呀,梅西的头发被我们弄没了!让我们来帮他找回头发。所以我们要在那里画一笔(设置像素为 1,肯定是前景)。同时还有一些我们并不需要的草地。我们需要去除它们,我们再在这个区域画一笔(设置像素为 0,肯定是背景)。现在可以象前面提到的那样来修改掩模图像了。
结果如下:

就是这样。你也可以不使用矩形初始化,直接进入掩码图像模式。使用 2像素和 3 像素(可能是背景/前景)对矩形区域的像素进行标记。然后象我们在第二个例子中那样对肯定是前景的像素标记为 1 像素。然后直接在掩模图像模式下使用 grabCut 函数。
练习
1. OpenCV 自带的示例中有一个使用 grabcut 算法的交互式工具 grabcut.py,自己玩一下吧。
2. 你可以创建一个交互是取样程序,可以绘制矩形,带有滑动条(调节笔刷的粗细)等。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70909-7.html
恶狗