图像混合
图像混合,产生的效果跨越了时间空间.
原理如下面公式,两张原始图像按权重相加,最终生成新图像.
下面介绍,两种方法:
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 }
原始图