使用OpenCV实现两张图像融合在一起
创作时间:
作者:
@小白创作中心
使用OpenCV实现两张图像融合在一起
引用
CSDN
1.
https://blog.csdn.net/CHNIM/article/details/136621759
图像融合技术是一种将多个不同来源或不同传感器捕获的同一场景的图像数据结合在一起,生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。本文将介绍如何使用OpenCV库在Python和C++两种编程语言中实现图像融合。
简单介绍
图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据,以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法,以及基于多尺度分解如图像金字塔的方法。
OpenCV + Python实现
OpenCV 中实现图像融合的一个常见方法是使用 addWeighted() 函数。这个函数可以用来对两张图像按照指定的权重进行线性组合,从而达到融合的效果。以下是一个基本的示例代码片段:
import cv2
# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 确保两张图像具有相同的尺寸,如果不相同,可以先调整到同一尺寸
if img1.shape != img2.shape:
# 调整图像大小
img1_resized = cv2.resize(img1, img2.shape[:2][::-1], interpolation=cv2.INTER_LINEAR)
img2_resized = img2
else:
img1_resized = img1
img2_resized = img2
# 定义权重
alpha = 0.7 # 第一张图像的权重
beta = 0.3 # 第二张图像的权重
gamma = 0 # 常数值(可选,通常设为0)
# 使用 addWeighted() 进行图像融合
blended_img = cv2.addWeighted(img1_resized, alpha, img2_resized, beta, gamma)
# 显示或保存融合后的图像
cv2.imshow('Blended Image', blended_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 或者直接保存
cv2.imwrite('blended_image.jpg', blended_img)
在这个例子中,addWeighted() 函数接收五个参数:
src1(这里是img1_resized):第一个输入图像矩阵。alpha:第一个图像的权重,取值范围从0到1之间。src2(这里是img2_resized):第二个输入图像矩阵。beta:第二个图像的权重。gamma:常数,添加到权重和之后。
通过调整 alpha 和 beta 参数,你可以控制两张图像在融合结果中的相对强度或透明度。如果希望得到的是简单的加权平均效果,那么通常会将 gamma 设为0。如果需要做亮度调节或者其它非线性混合,可以根据实际情况调整这些参数。
OpenCV + C++实现
在C++中使用OpenCV实现图像融合的方式与Python类似,主要区别在于语法和API调用方式。以下是使用C++实现图像融合的示例代码:
#include <opencv2/opencv.hpp>
int main() {
// 读取两张图像
cv::Mat img1 = cv::imread("image1.jpg");
cv::Mat img2 = cv::imread("image2.jpg");
// 检查图像是否成功读取
if (img1.empty() || img2.empty()) {
std::cout << "Error: Could not open or find the images!" << std::endl;
return -1;
}
// 确保两张图像具有相同的尺寸,如果不相同,可以先调整到同一尺寸
cv::Mat img1_resized, img2_resized;
if (img1.size() != img2.size()) {
cv::resize(img1, img1_resized, img2.size(), 0, 0, cv::INTER_LINEAR);
img2_resized = img2.clone();
} else {
img1_resized = img1.clone();
img2_resized = img2.clone();
}
// 定义权重
double alpha = 0.7; // 第一张图像的权重
double beta = 0.3; // 第二张图像的权重
double gamma = 0; // 常数值(可选,通常设为0)
// 使用 addWeighted() 进行图像融合
cv::Mat blended_img;
cv::addWeighted(img1_resized, alpha, img2_resized, beta, gamma, blended_img);
// 显示或保存融合后的图像
cv::imshow("Blended Image", blended_img);
cv::waitKey(0);
// 或者直接保存
cv::imwrite("blended_image.jpg", blended_img);
return 0;
}
请注意,在C++版本中,你需要包含必要的头文件,并且在显示图像后使用 waitKey(0) 来暂停程序执行,等待用户按键,然后关闭所有打开的窗口。同时,使用 clone() 函数复制图像以避免原始图像被修改。
效果展示
本文原文来自CSDN
热门推荐
增强现实二维码:增强AR交互指南
广深佛莞惠中上榜!中国百强产业集群出炉,广东入选12个排前三
考研b区有哪些学校?国家线有优势,适合分数稍低的考生
留学乌克兰签证材料准备与流程
韩国为何选择“韩”作为国号?一文读懂其历史渊源
年中盘点|2024年上半年,广电5G网络、应用、终端进展一览
高考最难省,狂揽985!
报警后多久可以知道是否立案
闲鱼到付怎么操作?流程有哪些?
猪场五大常见问题及解决方案:从僵猪到奶胖子
出口跨境电商的合规之路 | “出海”早知道③
离职两年发现公积金未缴存?HR系统专家教你三步追回合法权益
什么情况下微信会被冻结
慢性化脓性骨髓炎特征性X线表现及临床症状
赡养费最低标准及申请流程详解
25万人排队买特朗普"金卡",美智库警告投资者或成"冤大头"
安全生产常识大全,条条有用!
死刑执行: 社会争议与法律伦理探讨
血糖高可以吃金桔吗?医生的专业解答来了
多传感器融合技术简介
牙齿矫正后保持器佩戴时间及重要性,不戴保持器牙齿容易反复吗?
间谍过家家人物介绍,间谍过家家角色盘点:人物简介大揭秘
研究证实:荆防颗粒可通过调节免疫细胞和细胞因子增强免疫力
买卖合同补充协议的法律效力及补偿标准详解
对比分子束外延(MBE)与金属有机化学气相外延(MOCVD)技术
培养孩子耐心与专注力,解锁成长“直通车”的密码之旅
4部电影,票房接近1.3亿,力压谢苗,安志杰已经成为“网大一哥”
驾驶证损坏后怎样进行规范补办?补办过程中需要注意什么?
纸贵洛城 | 不应惊讶湖人现阶段的成功,他们真能踏入争冠行列
血糖高可以吃金桔吗?医生的权威解答来了