(05)图像融合

/*
图像融合--三个方法:
1、addWeighted(src1, alpha, src2, 1.0 - alpha, 0.0, dst);   //基于权重
2、add(src1, src2, dst);				    //这个是很生硬的把每个像素直接相加
3、multiply(src1, src2, dst);				    //这个是相乘,像素的相乘
*/

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat src1, src2, dst;
	src1 = imread("D:/A_Graduation/picture/Fusion/source17_1.tif");
	src2 = imread("D:/A_Graduation/picture/Fusion/source17_2.tif");

	if (!src1.data)
	{
		printf("Could not load image src1...\n");
		return -1;
	}
	if (!src2.data)
	{
		printf("Could not load image src2...\n");
		return -1;
	}

	namedWindow("input1", CV_WINDOW_AUTOSIZE);
	imshow("input1", src1); 
	namedWindow("input2", CV_WINDOW_AUTOSIZE);
	imshow("input2", src2);

	/*
	*图像混合
	*理论-线性混合操作
		g(x) = (1-α)f₀(x) + αf₁(x) 
		f₀(x)表示第一张输入的图像,因为图像在Mat对象里当作一个二维数组,如果用函数来表示的话,函数上面每一个x每变化一个对应一个像素值
		f₁(x)表示另外一张图像
		α表示占的权重, α的取值范围唉0-1之间,合起来的值就是255,最后的结果不会超过范围
		g(x)表示得到的生成的图像
		
		抽象的来讲把图像看成一个函数,就是两个函数经过线性运算得到另一个函数,
		如果是二维的图像,可以看成是f(x, y)的一个函数,(x, y)就是它的像素的位置,它每变化一个位置,f(x, y)就会得到一个新值,那个值就是像素值
		现实的讲就是图像了,它这里的相加是对两幅图像的每一个像素都做这个操作,输出的每一个像素得到的是g(x)对应的每一个像素,
		x没变,x相当于像素的位置
	*相关API(addWeighted)
		参数1:输入图像Mat-src1
		参数2:输入图像src1的alpha值
		参数3:输入图像Mat-src2
		参数4:输入图像src2的alpha值
		参数5:gamma值,是一个校验值,如果两个加起来太暗了就给它一个常量的值让它校验,就是加上去最后输出到那个像素上面去
		参数6:输出混合图像
		最后一个参数默认的值是-1, 不用管它,在下面的代码中也不会显示出来有这个参数
		dst(I) = saturate(src1(I) + alpha + src2(I) + beta + gamma),saturate确保它的值在0-255之间,不会超出给定的在那个空间的取值范围
		
		注意:两张图像的大小和类型必须一致才可以
	*/

	double alpha = 0.5;

	//保证两张图片的大小和类型是一致的
	if (src1.cols == src2.cols && src1.rows == src2.rows && src1.type() == src2.type())
	{
		//图像融合--三个方法
		addWeighted(src1, alpha, src2, 1.0 - alpha, 0.0, dst);
		//add(src1, src2, dst); //这个是很生硬的把每个像素直接相加,而且还不好调整它,不比上面是基于权重的效果,weight的意思是权重
		//multiply(src1, src2, dst); //这个是相乘,像素的相乘

		namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
		imshow("blend demo", dst);
	}
	else
	{
		printf("Could not blend images, the size or the type of image is not same....\n");
		return -1;
	}

	waitKey(0);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值