ROI区域图像叠加中掩膜的理解
文章目录
- ROI区域图像叠加中掩膜的理解
- 1. 什么是掩膜
- 2. ROI区域图像叠加原始代码
- 3.对其中mask的理解
- 3.1 导入图片
- 3.2 获得掩膜
- 3.3 定义ROI
- 3.4混合叠加
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做叠加混合,然后神奇的事情就发生了,我得到了这么样的一张图片
可以看出,掩膜为黑色的地方,确实没有被操作,保持的底图的像素点,验证了我的猜测。