opencv中的图像简单的线性融合(附带测试程序)

图像融合技术就是将两个图像进行配比融合显示的过程,基本原理为:
g(x)=a*f(x)+(1-a)h(x);
g(x)为融合后的图像
f(x)为其中一个图像,h(x)为其中的另一个图像,a为两幅图像的融合度;原理简单
实现方式1:
1.先定义感兴趣的区域ROI,在其中一幅图像中选取和第二幅图像一样大小的区域
矩形区域的选取:ROI=IMG(Rect(x,y,loge.cols,loge.rows));
选取法2:ROI=IMG(Range(350,350+loge.rows),Range(800,800+loge.cols));

图片的大小一定要适合第一幅第二幅的大小切记不然编译出错;
1.固定值融合程序:
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;
#define namedWindow1 “原图”
#define namedWindow2 “原图1”
#define namedWindow3 “原图2”

int main()
{
//线性混合操作g(x)=(1-a)f1(x)+bf2(x);
//线性融合的函数为addWeighted(输入,权值1,输出,权值2,gamma,输出,输出阵列的可选深度);
/这里补充一下图像的融合操作是有条件的,在融合的过程中图像的尺寸和类型必须要相同/
double alphaValue=0.5;
double betaValue;
Mat img1,img2,img3;
img1=imread(“2.jpg”);
img2=imread(“3.jpg”);
if(!img1.data){printf(“读取图片1的数据出错,请查看位置是否正确”);}
if(!img2.data){printf(“读取图片2的数据出错,请查看位置是否正确”);}
betaValue=(1-alphaValue);
addWeighted(img1,alphaValue,img2,betaValue,0.0,img3);
imshow(namedWindow1,img1);
imshow(namedWindow2,img2);
imshow(namedWindow3,img3); //程序从这里将被割断
waitKey(0);
return 0;
}
2.线性融合的综合实例:图片放到工程中去
#include<opencv2/opencv.hpp>
#include

using namespace cv;
using namespace std;

bool ROI_AddImage()
{
Mat img1=imread(“1.jpg”);
Mat img2=imread(“2.jpg”);
if(!img1.data){printf(“载入图片1出错”);return false;}
if(!img2.data){printf(“载入图片2出错”);return false;}

Mat imgROI=img1(Rect(0,0,img2.cols,img2.rows));

Mat mask=imread(“img2”,0);
img2.copyTo(imgROI,mask);//把图像放到指定区域中 mask可有可无,记住mask有的话就会使添加到指定区域更加逼真
imshow(“图像融合1”,img2); //图像融合的过程必须是相同大小的图片和图片的类型相同
return true;
}
//两张图像的线性混合
bool linerBlending()
{
Mat img3=imread(“3.jpg”);
Mat img4=imread(“4.jpg”);
if(!img3.data){printf(“载入图片3错误”);return false;}
if(!img4.data){printf(“载入图片4错误”);return false;}
Mat dstImage;
double alphaValue=0.3;
double betaValue=(1-alphaValue);
addWeighted(img3,alphaValue,img4,betaValue,0.0,dstImage);
imshow(“线性融合图像”,dstImage);
}
//指定区域线性混合的利用
bool ROI_LinerBlending()
{
Mat img5=imread(“5.jpg”);
Mat img6=imread(“6.jpg”);
Mat dst1Image;
if(!img5.data){printf(“载入图片5错误”);return false;}
if(!img6.data){printf(“载入图片6错误”);return false;}
Mat img2ROI=img6(Rect(0,0,img5.cols,img5.rows));
addWeighted(img5,0.4,img2ROI,0.7,0.0,dst1Image);
imshow(“指定区域的线性融合”,img6);
return true;
}
int main()
{
if(ROI_AddImage() && linerBlending() && ROI_LinerBlending())
{
cout<<“图像叠加&图像融合成功”<<endl;
}
// waitKey(0);
while(1);
return 0;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值