原理:
两张图片合并,想想图片是用一个个像素点来存储,每个像素点有他的值。那么合并,无非就是像素点值得合并,使用的公式可以就是给两张图片分别一个权值,然后求和。向下面这个公式:
的值位于0至1之间
OpenCV实现:
那么我们在openCV内怎么实现呢?在openCV中,有一个addWeighted函数,函数具体调用可以看这里。
读取完两个要合并的图片后,(注意,这里合并的图片必须是相同的size和type,就是说图片长宽像素数一样,color存储方式要一样。我选的是388*388的png图片
1 /// Read image ( same size, same type )
2 src1= imread("zh.png"); 3 src2= imread("zh2.png");
调用addWeighted函数,
1 beta = ( 1.0 - alpha ); 2 addWeighted( src1, alpha, src2, beta, 0.0,dst);
这里src1和src2都是读取之后的矩阵,alpha和beta是他们的权重。
其实addWeighted的过程是下面的公式:
这里的Y是0.0。
好,让我们动手来做这个操作。代码如下:
1 #include <cv.h>
2 #include <opencv2/core/core.hpp>
3 #include<opencv2/highgui/highgui.hpp>
4 #include <highgui.h>
5 #include <iostream>
6
7 using namespace cv; 8
9 int main() 10 { 11 double alpha = 0.5; double beta; double input; 12
13 Mat src1, src2, dst; 14
15 /// Ask the user enter alpha
16 std::cout << " Simple Linear Blender " << std::endl; 17 std::cout << "-----------------------" << std::endl; 18 std::cout << "* Enter alpha [0-1]: "; 19 std::cin >> input; 20
21 /// We use the alpha provided by the user if it is between 0 and 1
22 if (input >= 0.0 && input <= 1.0) 23 { 24 alpha = input; 25 } 26
27 /// Read image ( same size, same type ),注意,这里一定要相同大小,相同类型,否则出错
28 src1 = imread("zh.png"); 29 src2 = imread("zh2.png"); 30
31 if (!src1.data) { printf("Error loading src1 \n"); return -1; } 32 if (!src2.data) { printf("Error loading src2 \n"); return -1; } 33
34 /// Create Windows
35 namedWindow("Linear Blend", 1); 36
37 beta = (1.0 - alpha); 38 addWeighted(src1, alpha, src2, beta, 0.0, dst); //这里调用了addWeighted函数,得到的结果存储在dst中
39
40 imshow("Linear Blend",dst); 41
42 waitKey(); 43 return 0; 44 }
结果:
图片1:
图片2:
合并后的图片: