OpenCV 4.11.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)
图像 | 输入 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 中的一个。 |