使用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:常数,添加到权重和之后。

通过调整 alphabeta 参数,你可以控制两张图像在融合结果中的相对强度或透明度。如果希望得到的是简单的加权平均效果,那么通常会将 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()函数复制图像以避免原始图像被修改。

效果展示

相关推荐
lijianhua_97121 小时前
国内某顶级大学内部用的ai自动生成论文的提示词
人工智能
EDPJ1 小时前
当图像与文本 “各说各话” —— CLIP 中的模态鸿沟与对象偏向
深度学习·计算机视觉
蔡俊锋1 小时前
用AI实现乐高式大型可插拔系统的技术方案
人工智能·ai工程·ai原子能力·ai乐高工程
自然语1 小时前
人工智能之数字生命 认知架构白皮书 第7章
人工智能·架构
大熊背1 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
eastyuxiao2 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
诸葛务农2 小时前
AGI 主要技术路径及核心技术:归一融合及未来之路5
大数据·人工智能
光影少年2 小时前
AI Agent智能体开发
人工智能·aigc·ai编程
charlee442 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
ai生成式引擎优化技术2 小时前
TSPR-WEB-LLM-HIC (TWLH四元结构)AI生成式引擎(GEO)技术白皮书
人工智能