【Opencv】ROI区域图像叠加中掩膜的理解

ROI区域图像叠加中掩膜的理解

1. 什么是掩膜

《Opencv3编程入门》ROI区域图像叠加一节中,提到了掩膜的概念,一直不清楚对于这个图像叠加有什么作用,所以探索了一下,并记录下一些结论

所谓掩膜,就是一个矩阵,可以看做是一种图像处理的标记,掩膜矩阵内数字不为0的点,才能够被操作,所以就有这样的图片。
在这里插入图片描述

2. ROI区域图像叠加原始代码

这里程序的原始代码是这个样子的

//导入图片
	Mat srcImage1 = imread("dota.jpg");
	Mat logoImage = imread("dota_logo.jpg");

	//设置ROI区域
	Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols, logoImage.rows));

	//加载掩膜(必须是灰度图)
	Mat mask = imread("dota_logo,jpg", 0);

	//把掩膜复制到ROI
	logoImage.copyTo(imageROI, mask);

	imshow("a", srcImage1);



原始图片:(dota_logo.jpg)
在这里插入图片描述

(dota.jpg)
在这里插入图片描述

组合效果:
在这里插入图片描述

3.对其中mask的理解

因为mask是个类似指示物的东西,这里使用了logo图片的灰度图作为掩膜。掩膜具有当数值元素为0的时候具有不可操作性,那不就是意味着,当你的logo图片里面有全黑(色彩值为0)的像素点的时候,这个像素点就不能被填充到底图里去了,而是使用了底图原来的像素点。

所以做了一下验证:
使用的底图不变,logo图片换了以下这张:(dog.jpg)
在这里插入图片描述

3.1 导入图片

首先是导入图片

	Mat srcImg, logo, mask;
	srcImg = imread("dota.jpg");
	logo = imread("dog.jpg");
	mask = imread("dog.jpg",0);

3.2 获得掩膜

因为这张图片比较白,我就想,如果给他做一个像素点反色,是不是大部分就是黑色的了,就有了掩膜很多都是0的数据点,所以做了如下处理,对每个像素点都取了反。


for (int i = 0; i < mask.rows; i++)
	{
		uchar* pt = mask.ptr<uchar>(i);
		for (int j = 0; j < mask.cols * mask.channels(); j++)
		{
			pt[j] = 255-pt[j];
		}
	}

得到这样一张掩膜
在这里插入图片描述

3.3 定义ROI

Mat srcROI (srcImg(Rect(100, 100, logo.cols, logo.rows)));

3.4混合叠加

logo.copyTo(srcROI,mask);
	
imshow("b", srcImg);
	


然后再用这张掩膜和那张dog.jpg做叠加混合,然后神奇的事情就发生了,我得到了这么样的一张图片

在这里插入图片描述可以看出,掩膜为黑色的地方,确实没有被操作,保持的底图的像素点,验证了我的猜测。

发布了14 篇原创文章 · 获赞 1 · 访问量 500

猜你喜欢

转载自blog.csdn.net/qq_41741344/article/details/104361007