官网参见 https://docs.opencv.org/3.4.1/d8/d83/tutorial_py_grabcut.html
GrabCut算法是微软剑桥研究院的Carsten Rother, Vladimir Kolmogorov和Andrew Blake在《“GrabCut”: interactive foreground extraction using iterated graph cuts 》中提出的。该算法只需要很小的人机交互实现前景抽取。
从用户角度来看该算法是如何工作的呢?
首先用户画一个矩形来框住前景区域。(前景必须完全包含在矩形框中)然后算法对它进行迭代分割来获得很好的结果。
但是有时候分割的效果并不好。有可能是前景区域被标记为背景,或者背景区域被标记为前景。此时,就需要用户自行修改了,其实只需要在错误部位画一笔。这一笔的含义就是“hi,这个区域应该是前景(背景),你把它标记为背景(前景)了。”等到下一次交互时候,你就可以得到很好的结果了。
观察下图
左图,首先把球员和足球框在蓝色矩形框中。然后做了一些修改,白色笔画表示这是前景,黑色画笔表示这是背景。最终,就能在右图得到很好的结果。
在这个过程中,实际在背后发生了什么呢?
- 用户输入一个矩形框,在此框外部的都是背景区域。(上面已经说过,你的框必须包含所有对象)矩形框内的所有东西都是未知的。用户指定的前景和背景都会被认为是硬标签(hard-labelling),整个过程中它们不会改变。
- 计算机会对我们提供的数据(输入图像