/*
图像融合--三个方法:
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;
}
(05)图像融合
最新推荐文章于 2024-03-06 09:03:40 发布