opencv实战从0到N (15)- grabcut分割(抠图)

opencv实战从0到N (15)- grabcut分割(抠图)

同步知乎:中庸

1.概述:

GrabCut是一种基于图切割的图像分割方法。

从围绕要分割的对象的用户指定的边界框开始,算法使用高斯混合模型估计目标对象和背景的颜色分布。这用于在像素标签上构建马尔可夫随机场,其具有优选具有相同标签的连接区域的能量函数,

并且运行基于图切割的优化以推断它们的值。由于这个估计可能比边界框中的原始估计更准确,所以重复这个两步程序直到收敛。由于分割过程需要训练高斯混合模型,所以大图像比较耗时。

 

2,接口调用如下

static void getBinMask(const Mat& comMask, Mat& binMask)
{
	if (comMask.empty() || comMask.type() != CV_8UC1)
		CV_Error(Error::StsBadArg, "comMask is empty or has incorrect type (not CV_8UC1)");
	if (binMask.empty() || binMask.rows != comMask.rows || binMask.cols != comMask.cols)
		binMask.create(comMask.size(), CV_8UC1);
	binMask = comMask & 1;
}

int m = 0;

int main_(int argc, char** argv)
{
	string filename = "dm.png";
	if (filename.empty())
	{
		cout << "\nDurn, empty filename" << endl;
		return 1;
	}
	Mat image = imread(filename, 1);
	if (image.empty())
	{
		cout << "\n Durn, couldn't read image filename " << filename << endl;
		return 1;
	}
	
	Mat mask, bgModel, fgModel;
	Rect rect(Point(66, 100), Point(330, 300));
	grabCut(image, mask, rect, bgModel, fgModel, 500, GC_INIT_WITH_RECT);
	rectangle(image, rect, Scalar(255), 2, 8);

	//compare(mask, GC_PR_FGD, mask, CMP_EQ);
	imshow("src", image);
	Mat binMask;
	getBinMask(mask, binMask);
	
	imshow("dst", binMask * 255);
	
	cvWaitKey(0);
	return 0;
}

3,结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Arthur.AI

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值