C++ opencv 图像色彩空间转换--色域捕获

1.API和相关知识

1.inRange

在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。

关于inRange的提取原理

图像中,对于在指定色彩范围内的颜色,将置为255(白色),不在的则置为0(黑色)
对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。
因此也有人将输出理解为mask掩码模板,作为mask使用。

将位于颜色在图像上下界当中就可以将颜色单独提取出来,设为白色,不在的设为黑色
 

inRange
	提取指定色彩范围内的区域
		共4个参数
			第1个参数 输入
			第2个参数 色彩下界
			第3个参数 色彩上界
			第4个参数 输出

说明:

HSV色彩空间

HSV相较于BGR色彩空间,颜色的区分度比较明显,对某个颜色来说可以很容易的提取出来。

在这里插入图片描述

2.image.copyTo

更换图像背景,这里利用到了重载的copyTo

当我们传入mask时,这里的copyTo只会拷贝到mask中不为0的像素点,即白色区域(255)

白色区域为背景色重载

inRange提取后,指定色彩区域为255,roi区域为0。
为了利用copyto,我们需要对提取后的图像进行非操作,这样roi区域就会变为255。

copyTo
	重载的拷贝
		共2个参数
			第1个参数 输出
			第2个参数 输入

2.示例代码

配合copy使用,用一个取反操作变白即可

void QuickDemo::inrange_demo(Mat& image) {

	Mat dst;
	cvtColor(image, dst, COLOR_BGR2HSV);

	Mat mask;

	inRange(dst, Scalar(100, 43, 46), Scalar(124, 255, 255), mask);

	imshow("提取", mask);

	Mat greenback = Mat::zeros(image.size(), image.type());
	greenback = Scalar(40, 200, 40);

	bitwise_not(mask, mask);
	imshow("非", mask);

	image.copyTo(greenback, mask);
	/*
		mask剩下的黑色区域,由greenback填充
	*/
	imshow("绿色", greenback);

}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

打酱油的;

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

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

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

打赏作者

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

抵扣说明:

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

余额充值