OpenCV基础(三)---图像混合

图像混合

图像混合,产生的效果跨越了时间空间.

原理如下面公式,两张原始图像按权重相加,最终生成新图像.

下面介绍,两种方法:

  1. 对两幅大小类型一样的图片叠加

  2.创建ROI区域叠加

函数介绍:addWeighted() 

函数原型:void addWeighted(InputArray src1, double alpha, InputArray src2,

     double beta, double gamma, OutputArray dst, int dtype = -1);

函数功能:计算两个数组的加权和。

函数声明:

InputArray src1::加权的第一个数组

double alpha:第一个数组的权重

InputArray src2:加权的第二个数组

double beta:第二个数组的权重

double gamma:计算完权重和,再加上这个值,才是最后的结果

OutputArray dst:输出数组,与输入数组具有相同大小和通道数

int dtype = -1: 输出阵列的可选深度;当两个输入数组具有相同的深度时,使用dtype

       可以设置为-1,这将等效于src1.depth()

方法1:线性混合模式

代码演示

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 int main(int argc, char** argv) {
 8 
 9     /*载入原图像*/
10     Mat src1, src2, dst;
11     src1 = imread("D:/shenjianxin.png");
12     src2 = imread("D:/xiaobai.png");
13     if (!src1.data ) {
14         cout << "could not load image1" << endl;
15         return false;
16     }
17     if (!src2.data) {
18         cout << "could not load image2" << endl;
19         return false;
20     }
21     imshow("shenjianxin", src1);
22     imshow("xiaobai", src2);
23     
24     /*图像融合*/
25     double alpha = 0.45;
26     if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {
27         addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
28     }
29     else {
30         cout << "could not blend photo" << endl;
31         return false;
32     }
33 
34     /*显示结果*/
35     namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
36     imshow("blend demo", dst);
37 
38     waitKey(0);
39     return 0;
40 }

原始图

效果图

方法2:ROI区域叠加

ROI(Region of Interest),即感兴趣区域.

创建方法有两种,

方法1: Rect()

   //加载原图片  

  Mat srcImage = imread("src.png"); 

  Mat logoImage = imread("logo.png");        

   //从srcImage中创建ROI区域.  Rect()中, 前两个值为图片的左上角,后两个值为矩形的宽度和高度    

  Mat imageROI = srcImage(Rect(100,200, logoImage.cols, logoImage.rows));  

方法2: Range() 

   //加载原图片  

  Mat srcImage = imread("src.png"); 

  Mat logoImage = imread("logo.png");        

   //从srcImage中创建ROI区域.  Range(), 指定了ROI的起始与终止索引

  Mat imageROI = srcImage(Range(200, 200 + logoImage.rows), Range(100, 100 + logoImage.cols));

 代码演示

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 int main(int argc, char** argv) {
 8 
 9     /*载入原图像*/
10     Mat srcImage, logoImage;
11     srcImage = imread("D:/shenjianxin.png");
12     logoImage = imread("D:/dudou.png");
13     if (!srcImage.data) {
14         cout << "could not load srcImage" << endl;
15         return false;
16     }
17     if (!logoImage.data) {
18         cout << "could not load logo" << endl;
19         return false;
20     }
21     imshow("shenjianxin", srcImage);
22     imshow("dudou", logoImage);
23 
24     //Mat imageROI = srcImage(Range(0, 0 + logoImage.rows), Range(0,0 + logoImage.cols));
25     Mat imageROI = srcImage(Rect(0,0, logoImage.cols, logoImage.rows));  //定义ROI区域
26     addWeighted(imageROI, 0.7, logoImage, 0.5, 0, imageROI);
27  
28     /*显示结果*/
29     namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
30     imshow("blend demo",srcImage);
31 
32     waitKey(0);
33     return 0;
34 }

原始图

 

效果图

原文地址:https://www.cnblogs.com/zmm1996/p/10661822.html