OpenCV3 3.3 用GrabCut算法分割图像

GrabCut算法

常用于从静态图像中取出前景物体,计算量很大, 但结果通常很精确

int main()
{
    cv::Mat dva = cv::imread("newdva.jpg");
    //创建包含前景的矩形区域
    cv::Rect rectangle(50, 50, 470, 850);
    //创建分割图,内部使用的模型
    cv::Mat result, bgModel, fgModel;

    //grabCut分割算法,参数分别为:输入图像,分割结果,包含前景的矩形,两个内部模型,迭代次数,模式(使用带边框的矩形)
    cv::grabCut(dva, result, rectangle, bgModel, fgModel, 2, cv::GC_INIT_WITH_RECT);
    //算法生成的result是一个由cv::GC_BDG、cv::GC_FDG、cv::GC_PR_BDG、cv::GC_PR_FDG组成的与原图一样大的图像
    //参数分别为:明确属于背景的像素,明确属于前景的像素,可能属于背景的像素,可能属于前景的像素

    //通过提取值为cv::GC_PR_FDG的像素,可以得到包含分割信息的二值图像
    cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
    //创建全白前景图(输出图)
    cv::Mat foreground(dva.size(), CV_8UC3, cv::Scalar(255, 255, 255));
    //将二值图作为掩码,把原图拷贝到前景图中
    dva.copyTo(foreground, result);

    cv::imshow("previous", dva);
    //显示前景图
    cv::imshow("foreground", foreground);
    cv::waitKey();
    return 0;
}

cv::grabCut函数的使用

函数签名

CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect,
                           InputOutputArray bgdModel, InputOutputArray fgdModel,
                           int iterCount, int mode = GC_EVAL );

参数分别为:输入图像,掩码(模式为cv::GC_INIT_WITH_RECT时可不填),分割结果,包含前景的矩形(模式为cv::GC_INIT_WITH_MASK时可不填),两个内部模型,迭代次数,模式名字。

GrabCut算法模式名含义
cv::GC_INIT_WITH_RECT使用带边框的矩形
cv::GC_INIT_WITH_MASK使用掩码区域
GrabCut算法生成像素种类含义
cv::GC_BGD == 0表示明确属于背景的像素
cv::GC_FGD == 1表示明确属于前景的像素
cv::GC_PR_BGD == 2表示可能属于背景的像素
cv::GC_PR_FGD == 3表示可能属于前景的像素

本实例中,Rectangle矩形区域以外的像素为cv::GC_BGD,即明确属于背景的像素,在第一次迭代前,矩形区域以内的像素为cv::GC_PR_FGD,即可能属于前景的像素。

本实例最后只提出了可能属于前景的像素,有时若要提取全部前景像素(由于本例分割图像没有明确指定cv::GC_FGD,故效果相同)有时若要提取全部前景像素,即cv::GC_FGDcv::GC_PR_FGD,只需在cv::compare生成二值图之前进行按位与操作,1和3都将转变为1,其余代码不变,即可输出所有前景像素。

result = result&1;

补充:cv::compare函数的使用

函数常用于比较两幅输入图像素,并根据模式输出二值图,可用于cv::copyTo函数的掩码。

函数签名

CV_EXPORTS_W void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);

参数分别为:输入图像1,输入图像2,输出图(二值图),模式名。

cv::compare函数模式名含义
cv::CMP_EQ表示像素相等时输出255,否则输出0
cv::CMP_GT像素1>像素2时输出255,否则输出0
cv::CMP_GE像素1>=像素2时输出255,否则输出0
cv::CMP_LT像素1<像素2时输出255,否则输出0
cv::CMP_LE像素1<=像素2时输出255,否则输出0
cv::CMP_NE像素1!=像素2时输出255,否则输出0

效果

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值