opencv c++ 图像色彩空间转换 掩膜mask处理(12)

这篇博客介绍了如何利用OpenCV的cvtColor和inRange函数在RGB、HSV、YUV和YCrCb色彩空间中进行转换,并通过设定色彩范围提取图像中的特定对象。首先,将图像从BGR转换到HSV色彩空间,然后创建一个mask来隔离绿色区域。接着,通过对mask取反并应用到原图像上,实现背景的替换。为了更干净地提取对象,可以多次迭代此过程。
摘要由CSDN通过智能技术生成

知识点:色彩空间及其转换

RGB色彩空间

HSV色彩空间

YUV色彩空间

YCrCb色彩空间

API:

cvtColor——色彩空间转换

inRange——提前指定色彩范围区域

 1、获取mask:

void QuickDemo::in_Range_Demo(Mat& image) {
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	//获取图像的mask
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
	imshow("mask", mask);
}

上述Scalar中的参数是基于去掉绿色背景来取的Scalar上下限,如在下表中,绿色的三通道最小值分别为35,43,46。

结果:

 2、将mask和原背景合成:

1、将获取的mask进行取反操作,获取背景形状~mask。

2、创建背景矩阵redback,使用copyTo函数,将image复制到redback中,同时,保留~mask的部分。

image.copyTo(redback, mask);

代码:

void QuickDemo::in_Range_Demo(Mat& image) {
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	//获取图像的mask
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
	//imshow("mask", mask);
	Mat redback = Mat::zeros(image.size(), image.type());
	redback = Scalar(40, 40, 255);
	bitwise_not(mask, mask);
	image.copyTo(redback, mask);
	imshow("redback", redback);

}

结果: 

 如果想要扣的干净,可以将图中其余颜色的部分再次生成mask,重复上述操作即可,但仍会有微小瑕疵。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值