![]() |
OpenCV 4.12.0
开源计算机视觉
|
GrabCut 算法由英国剑桥微软研究院的 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在他们的论文 "GrabCut": interactive foreground extraction using iterated graph cuts 中设计。需要一种以最少用户交互进行前景提取的算法,GrabCut 就是成果。
从用户的角度来看,它是如何工作的?最初,用户在前景区域周围绘制一个矩形(前景区域应完全位于矩形内部)。然后,算法迭代地分割它以获得最佳结果。完成。但在某些情况下,分割可能不太好,例如,它可能将某些前景区域标记为背景,反之亦然。在这种情况下,用户需要进行细微的调整。只需在存在错误结果的图像上进行一些笔划。笔划基本上表示“嘿,这个区域应该是前景,你把它标记为背景,在下一次迭代中纠正它”,或者它的背景相反。然后在下一次迭代中,您会获得更好的结果。
背景发生了什么?
如下图所示(图片来源:http://www.cs.ru.ac.za/research/g02m1682/)
我们使用函数:cv.grabCut (image, mask, rect, bgdModel, fgdModel, iterCount, mode = cv.GC_EVAL)
| image | 输入 8 位 3 通道图像。 |
| mask | 输入/输出 8 位单通道掩码。当模式设置为 GC_INIT_WITH_RECT 时,该掩码由函数初始化。它的元素可能具有 cv.grabCutClasses 之一。 |
| rect | 包含分割对象的 ROI。 ROI 外部的像素被标记为“明显的背景”。该参数仅在 mode==GC_INIT_WITH_RECT 时使用。 |
| bgdModel | 背景模型的临时数组。在您处理同一图像时,请勿修改它。 |
| fgdModel | 前景模型的临时数组。在您处理同一图像时,请勿修改它。 |
| iterCount | 算法在返回结果之前应进行的迭代次数。请注意,可以使用 mode==GC_INIT_WITH_MASK 或 mode==GC_EVAL 进一步优化结果。 |
| mode | 可以是 cv::GrabCutModes 之一的操作模式 |