OpenCV 4.10.0
开源计算机视觉
|
GrabCut 算法是由英国剑桥微软研究院的 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在其论文中设计的,“GrabCut”:使用迭代图剪切进行交互式前景提取。GrabCu">交互使用迭代图剪切进行前景提取。需要一种算法来以最少的用户交互进行前景提取,而 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 中的一个 |