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


文章目录

  • ROI区域图像叠加中掩膜的理解
  • 1. 什么是掩膜
  • 2. ROI区域图像叠加原始代码
  • 3.对其中mask的理解
  • 3.1 导入图片
  • 3.2 获得掩膜
  • 3.3 定义ROI
  • 3.4混合叠加


1. 什么是掩膜

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

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

Opencv python掩膜 opencv图像掩膜_灰度图

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)

Opencv python掩膜 opencv图像掩膜_像素点_02

(dota.jpg)

Opencv python掩膜 opencv图像掩膜_Opencv python掩膜_03

组合效果:

Opencv python掩膜 opencv图像掩膜_灰度图_04

3.对其中mask的理解

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

所以做了一下验证:

使用的底图不变,logo图片换了以下这张:(dog.jpg)

Opencv python掩膜 opencv图像掩膜_灰度图_05

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];
		}
	}

得到这样一张掩膜

Opencv python掩膜 opencv图像掩膜_像素点_06

3.3 定义ROI

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

3.4混合叠加

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

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

Opencv python掩膜 opencv图像掩膜_Opencv python掩膜_07

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