OpenCV学习笔记11_Mask操作与图像叠加

24 篇文章 0 订阅
19 篇文章 0 订阅

一、掩膜操作Mask

在opencv功能(两点):

1、 逻辑运算模板mask;

可以理解为一个字帖模板,
能描的地方就看成是一个Mask,
后续的处理只针对这个Mask来操作

例如:

inline //内联函数
void GpuMat::copyTo(OutputArray dst, InputArray mask) const
{
    copyTo(dst, mask, Stream::Null());
}
//copyTo函数
CV_WRAP void copyTo(OutputArray dst, InputArray mask, Stream& stream) const;

/*
Src:
123	 13	 1
3	 23	 20
32	 1	 0
Mask :
0	13	1
3	23	0
0	1	24
Dst :
0	13	1
3	23	0
0	1	0*/

只复制了一部分,src与mask进行与操作运算;

2、 卷积核kernel

卷积核可以理解为运算规定,
kernel上是什么相应的像素就如何处理,
处理方式可以理解为简单的线性表出。

见OpenCV矩阵上的掩码操作

二、图像叠加

注意事项:
① 通道数相同;
② Size相同;
实现方法:

	//实现方法1--直接将logo的值拷贝到ROI区域
	logo.copyTo(Roi_add, logo_gray);
	//注意这句,原图(logo)与掩膜(logo_gray)进行与运算后得到了被复制图
	//其像素进行与操作,如果与运算后像素值为0则不拷贝。 
	//加载掩膜必须为灰度值(我的理解是降低与操作的运算量,但是参数解释说不是灰度图也可以)
	//实现方法2--使用add方法将ROI区域与logo相加
	add(Roi_add_1,logo ,Roi_add_1);
	//实现方法3--符号重载运算
	Roi_add_2 += logo;
	//实现方法4--加权叠加
	addWeighted(Roi_add_3,0.5,logo,0.5,1.0,Roi_add_3);

三、代码

#include <opencv.hpp>
using namespace std;
using namespace cv;

void main()
{
	Mat dst;
	Mat logo = imread("logo.png");
	Mat logo_gray;
	cvtColor(logo, logo_gray, COLOR_BGR2GRAY);
	Mat src = imread("test.jpg");
	Mat Roi_add = src(Rect(20,20,350, 84));//Size为logo的Size
	Mat Roi_add_1 = src(Rect(20, 104, 350, 84));
	Mat Roi_add_2 = src(Rect(20, 188, 350, 84));
	Mat Roi_add_3 = src(Rect(20, 188+84, 350, 84));
	//直接简单叠加
	//实现方法1--直接将logo的值拷贝到ROI区域
	logo.copyTo(Roi_add, logo_gray);//注意这句,原图(logo)与掩膜(logo_gray)进行与运算后得到了结果图
	//其像素进行与操作,如果与运算后像素值为0则不拷贝。 
	//加载掩膜必须为灰度值(我的理解是降低与操作的运算量,但是参数解释说不是灰度图也可以)

	//实现方法2--使用add方法将ROI区域与logo相加
/*	Mat bwt,fact;*/
/*	ones.ones(Size(350, 84), CV_8UC3);*/ //此句错误用法
// 	bitwise_and(logo, Roi_add_1, bwt);
// 	fact = Roi_add_1 - 255*logo;
/*	bitwise_or(Roi_add_1, logo, Roi_add_1, bwt);*/
	add(Roi_add_1,logo ,Roi_add_1);

	//实现方法3--符号重载运算
	Roi_add_2 += logo;
 
	
	//实现方法4--加权叠加
	addWeighted(Roi_add_3,0.5,logo,0.5,1.0,Roi_add_3);

	//注意涉及运算结果输出都为深拷贝

	/*dst = Roi_add + logo;*/

	/*addWeighted(Roi_add, 0, logo, 1, 1, Roi_add);*/
	

/*	imshow("dst", dst);*/
	imshow("src", src);
	waitKey(0);




}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiao张的da世界

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

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

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

打赏作者

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

抵扣说明:

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

余额充值