使用OpenCV实现两张图像融合在一起

简单介绍

图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据,以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法,以及基于多尺度分解如图像金字塔的方法。

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()函数复制图像以避免原始图像被修改。

效果展示

相关推荐
深蓝AI1 小时前
无头浏览器不必从 Chrome 改:Lightpanda 用 Zig 从零造,100 个页面只占 123MB 内存
人工智能·程序员
奈落243 小时前
AI辅助的另一面:从2026年国际AI安全报告的“故障”清单到国内专家的可靠性短板,自主行动的Agent为什么更难及时干预
人工智能·安全·agent·本地部署·ai 办公
火山引擎开发者社区5 小时前
eMudhra 证书失陷:容器用户最容易忽略的镜像信任链漏洞
人工智能
LabVIEW开发6 小时前
LabVIEW 机载 DIAL:每秒万次甲烷测量
人工智能·labview·labview知识·labview功能·labview程序
飞猫的边缘AI7 小时前
英特尔量子生意
人工智能·量子计算·边缘ai
深蓝AI7 小时前
桌面 Agent 缺的不是视觉:Vercel 开源 agent-desktop,用无障碍树 ref 替代截图坐标
人工智能·程序员
镜子AI7 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
向哆哆8 小时前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪
如若1238 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
赛博守夜人9 小时前
AI安全攻防与治理之十六:对抗样本、恶意文件与多模态攻击,AI 内容安全检测的真实盲区
人工智能·安全