当前位置:C++技术网 > 资讯 > opencv编程:17 图像进行叠加处理(一)

opencv编程:17 图像进行叠加处理(一)

更新时间:2016-07-08 18:15:58浏览次数:1+次

  利用opencv封装的函数将两个图像进行叠加,使用一大一小两张图像,目的是将小图像叠加到大图中,就像大图的水印。这里用到的两个图像分别是知名的Lena图像和opencvlogo

示例代码如下:
Mat image=imread("lena.png");  //载入背景图像
Mat logo = imread("opencv.png");  //载入logo

namedWindow("lena");    //依次显示图像图像
imshow("lena",image);
waitKey(0);
namedWindow("logo");
imshow("logo",logo);
waitKey(0);

Mat imageROI=image(Rect(0,0,logo.cols,logo.rows));   //获取感兴趣区域,即logo要放置的区域
addWeighted(imageROI,0.8,logo,0.6,0,imageROI);     //图像叠加
	
namedWindow("叠加");      //显示叠加图像
imshow("叠加",image);
waitKey(0);
  先是将两张图像载入,之后要选取logo在背景图像要放置的区域,也就是常说的感兴趣区域。这里感兴趣区域的选取方法是image(Rect(0,0,logo.cols,logo.rows)),image是背景图(Lena图像)Rect()是在背景图上选择感兴趣区域的大小,其参数分别是:区域起点坐标位置,区域的长和宽(长和宽是logo的尺寸)

  接下来就是完成图像叠加了。使用opencv的函数addWeighted(),参数的含义分别是:感兴趣区域,感兴趣区域参数,logo图,logo参数,添加的常数项,输出图像。下面看一下效果图,

  在这个实验中,我将logo放在了Lena图像的左上角,在选取logo放置位置时,需要注意的是要保证logo不会超出背景图像的边界。在结果图中,我们可以看到logo图像具有一定的透明度,这是addWeighted()中两个图像参数调节的结果,感兴趣的读者可以调节这两个参数试试。

  可能有读者会好奇,在addWeighted()函数中叠加的是感兴趣区域,叠加后的图像也是输出到了感兴趣区域,为什么显示叠加图像时时显示的image图像,而不是imageROI,并且结果还是叠加后的结果。这是因为imageROI是我们感兴趣的区域,它不是在背景图中选取后复制这部分区域的信息,而是与背景图共享这一区域的信息,所以我们对感兴趣区域imageROI进行处理也是对背景图中相应区域进行处理。我们可以将imageROI显示出来看一下效果。左边是载入的logo图,右边是叠加后的感兴趣区域,即imageROI,可以从右边图像中看到logo已经发生了变化。