本文首发于
“小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归
人民邮电出版社发行所有,禁止转载,侵权必究!
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
Grabcut算法是重要的图像分割算法,其使用高斯混合模型估计目标区域的背景和前景。该算法通过迭代的方法解决了能量函数最小化的问题,使得结果具有更高的可靠性。OpenCV 4提供了利用Grabcut算法分割图像的grabCut()函数,该函数的函数原型在代码清单8-21中给出。
代码清单8-21 grabCut()函数原型
1. void cv::grabCut(InputArray img,
2. InputOutputArray mask,
3. Rect rect,
4. InputOutputArray bgdModel,
5. InputOutputArray fgdModel,
6. int iterCount,
7. int mode = GC_EVAL
8. )
- img:输入的待分割图像,数据类型为CV_8U的三通道图像。
- mask:用于输入、输出的CV_8U单通道掩码图像,图像中像素值的取值范围以及含义在表8-4给出。
- rect:包含对象的ROI区域,该参数仅在mode == GC_INIT_WITH_RECT时使用。
- bgdModel:背景模型的临时数组。
- fgdModel:前景模型的临时数组。
- iterCount:算法需要进行的迭代次数。
- mode:分割模式标志,该参数值可选择范围以及含义在表8-5给出。
表8-4 grabCut()函数中掩码图像像素值范围和含义
标志参数 |
简记 |
含义 |
GC_BGD |
0 |
明显为背景的像素 |
GC_FGD |
1 |
明显为前景(对象)的像素 |
GC_PR_BGD |
2 |
可能为背景的像素 |
GC_PR_FGD |
3 |
可能为前景(对象)的像素 |
表8-5 grabCut()函数中分割模式标志取值范围和含义
标志参数 |
简记 |
含义 |
GC_INIT_WITH_RECT |
0 |
使用提供的矩形初始化状态和掩码,之后根据算法进行迭代更新 |
GC_INIT_WITH_MASK |
1 |
使用提供的掩码初始化状态,可以组合GC_INIT_WITH_RECT和GC_INIT_WITH_MASK。然后,使用GC_BGD自动初始化ROI外部的所有像素。 |
GC_EVAL |
2 |
算法应该恢复 |
GC_EVAL_FREEZE_MODEL |
3 |
只使用固定模型运行grabCut算法(单次迭代) |
该函数实现了GrabCut图像分割算法,函数的第一个参数是待分割的输入图像,要求是CV_8U的三通道彩色图像。第二个参数是掩码矩阵,该参数既用于输入又用于输出,当最后一个参数设置为GC_INIT_WITH_RECT时,该矩阵会被设置为初始掩码,掩码矩阵中具有4个可选择的参数,分别是0(GC_BGD)表示明显为背景的像素、1(GC_FGD)表示明显为前景或者对象的像素、2(GC_PR_BGD)表示疑似背景的像素、3(GC_PR_FGD)表示疑似前景或者对象的像素。最后图像的分割结果也是通过分析掩码矩阵中每个像素的数值进行提取。函数第三个参数是需要进行分割去ROI区域,在ROI区域的外部会被标记为“明显的背景”区域,该参数尽在mode == GC_INIT_WITH_RECT时使用。函数第四个和第五个参数分别是背景模型、前景模型的临时数组,需要注意的是在处理同一图像时,请勿对它进行修改。函数第六个参数是算法进行迭代的次数。函数最后一个参数是分割模式标志,可以选择的参数及其