前景提取、去除背景(selectROI+Grabcut)

本文介绍了一种基于GrabCut算法的图像前景提取方法,并通过一个简单的C++代码示例展示了如何利用OpenCV库中的GrabCut函数实现前景的精确分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天看到别人数学建模题目是前景提取,想到很早之前试过的grabcut,所以来放个demo,2333


惯例先放效果   //必须是三通道图片


两个函数:

1.selectROI 【需要配置Opencv的contribute模块】、、主要作用是获取矩形框,可自行写其他

第一个参数为输入图片,第二个参数为是否从中心开始选取矩形

2.grabCut函数 //输入必须是三通道的彩色图

详细用法如下:

/*
	参考:
	http://blog.youkuaiyun.com/zouxy09/article/details/8535087
	****参数说明:

	image——待分割的源图像,必须是8位3通道(CV_8UC3)图像,在处理的过程中不会被修改;

	mask——掩码图像,如果使用掩码进行初始化,那么mask保存初始化掩码信息;在执行分割的时候,也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数;在处理结束之后,mask中会保存结果。mask只能取以下四种值:

	GCD_BGD(=0),背景;

	GCD_FGD(=1),前景;

	GCD_PR_BGD(=2),可能的背景;

	GCD_PR_FGD(=3),可能的前景。

	如果没有手工标记GCD_BGD或者GCD_FGD,那么结果只会有GCD_PR_BGD或GCD_PR_FGD;

	rect——用于限定需要进行分割的图像范围,只有该矩形窗口内的图像部分才被处理;

	bgdModel——背景模型,如果为null,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;

	fgdModel——前景模型,如果为null,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;

	iterCount——迭代次数,必须大于0;

	mode——用于指示grabCut函数进行什么操作,可选的值有:

	GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;

	GC_INIT_WITH_MASK(=1),用掩码图像初始化GrabCut;

	GC_EVAL(=2),执行分割。

	*/


下面就是简单粗暴的代码了,233


//Interactive Foreground Extraction using Iterated Graph Cuts


#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <iostream>  

using namespace std;
using namespace cv;

int main()
{
	Mat image = imread("test.jpg");
	Mat mask; 

	//框选前景所在区域
	bool fromCenter = false;
	Rect2d r = selectROI(image,fromCenter);

	Mat bgModel, fgModel; // 模型(内部使用)  
	grabCut(image,mask, r, bgModel, fgModel, 1, cv::GC_INIT_WITH_RECT);
	


	// 得到可能为前景的像素  
	compare(mask, cv::GC_PR_FGD, mask, cv::CMP_EQ);
	imshow("mask", mask);
	// 生成输出图像  
	Mat foreground(image.size(), CV_8UC3, cv::Scalar(255, 255, 255));
	image.copyTo(foreground, mask); // 复制背景数据  

	// 输出前景图像结果  
	cv::imshow("提取后", foreground);


	cvWaitKey(0); //等待退出  
	return 0;
}


//口腔溃疡好严重,我去多吃点草了……


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值