OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。
一.线性组合原理
- 线性混合就是,对两幅图像 f0(x)和 f1(x)或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果,就像幻灯片放映和电影制作中的那样。函数表示为。
- 不同的像素采用不同的权重(在API中,alpha和beta对应着两幅图像的权重,gamma是校验值)
- Saturate这个函数,确保图像的灰度范围不会超过0~255区间
二.线性组合代码及实验
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
//Step1 读取照片
Mat src1, src2;
src1 = imread("image1.jpg");
src2 = imread("image2.jpg");
if (src1.empty() || src2.empty()) {
cout << "There is an empty image in the inputs: \n" << endl;
return -1;
}
//Step2 显示原图(namedWindow可以省略,IDE会自动添加)
imshow("Original_Image_1", src1);
imshow("Original_Image_2", src2);
//Step3 创建新图片,并且用addweighted函数,将两个图片拼接在一起
//注意: 使用multiply/add函数也可以拼接图片,但是addweighted函数效果更好
Mat dst;
double alpha = 0.5; //50%比重
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {//判断两张图片是否具有同样的尺寸等属性
addWeighted(src1, alpha, src2, (1 - alpha),0.0, dst); //(图1,图一比重,图二,图二比重,gamma,输出图)
imshow("procressed_image",dst);
}
else {
cout << "These two images dont have same property, skipped.... \n" << endl;
return -1;
}
waitKey();
return 0;
}
最终效果为: