OpenCV学习10 用GrabCut算法分割图像

该代码示例展示了如何利用OpenCV库中的GrabCut算法来分割图像,特别是从静态图像中提取前景物体。程序首先读取图像,定义一个矩形区域,然后通过grabCut函数进行多次迭代以创建精确的分割模型。最终,它将背景剔除,只保留标记为可能属于前景的像素,生成输出图像。
摘要由CSDN通过智能技术生成

 效果

 代码:

#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

// 用GrabCut算法分割图像

// 前面学习了如何利用颜色,根据场景中的特定元素分割图像。
// 物体通常有自己特有的颜色,通过识别颜色接近的区域,通常可以提取出这些颜色。

// 另外OpenCV提供一种常用的分割算法--GrabCut算法,计算量也很大,但结果通常很精确。
//如果要从静态图像中提取前景物体(例如从图像中剪切一个物体,并粘贴到另一幅图像),最好采用GrabCut算法。


using namespace cv;
int main()
{

    Mat image = imread("/home/jason/work/01-img/dog.png");
    std::cout << "size:" << image.rows << " * " << image.cols << std::endl;

    // 定义一个带边框的矩形
    //矩形外部的像素会被标记为背景
    Rect rectangle(130, 0, 230, 400);

    imshow("image", image);
    imshow("re", image(rectangle));


    Mat result; // 分割结果(四种可能的值)

    // 定义两个矩阵,用于存放算法构建的模型
    Mat bgModel, fgModel; // 模型(内部使用)

    grabCut(image,            // 输入图像
            result,           // 分割结构
            rectangle,        // 包含前景的矩形
            bgModel, fgModel, // 模型
            10,                // 迭代次数
            GC_INIT_WITH_RECT); // 使用带边框的矩形模型


    // 取得标记为“可能属于前景”的像素
    compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
    imshow("r2", result);

    // 生成输出图像
    Mat foreground(image.size(), CV_8UC3, Scalar(255, 255, 255));
    image.copyTo(foreground, result); // 不复制背景像素

    imshow("r3",foreground);




    waitKey(0);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值