一、掩膜操作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
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);
}