OpenCV-学习历程5- 线性混合操作(将两张图片融合在一起)(理论+代码)

OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。

 一.线性组合原理

  1. 线性混合就是,对两幅图像 f0(x)和 f1(x)或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果,就像幻灯片放映和电影制作中的那样。函数表示为。
  2. 不同的像素采用不同的权重(在API中,alpha和beta对应着两幅图像的权重,gamma是校验值)
  3. 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;
}

最终效果为:

猜你喜欢

转载自blog.csdn.net/weixin_42503785/article/details/113913208