【OpenCV】(五)—— 图像融合

在OpenCV中,图像融合是指将两张或多张图像合并成一张图像的技术。这种技术在很多场景下都非常有用,比如全景图的拼接、多曝光图像的融合、多焦点图像的融合等。下面是一些常用的图像融合方法和技术:

  1. 加权平均法: 这是最简单的图像融合方法之一,通过给每张图像分配一个权重,然后计算每个像素点上所有图像对应像素值的加权平均值来得到最终的融合图像。这种方法简单但可能会导致边界模糊。
  2. 多分辨率金字塔融合: 这种方法首先构建每张图像的高斯金字塔和拉普拉斯金字塔,然后在不同的尺度上对图像进行融合,最后通过重建过程得到融合后的图像。这种方法可以较好地保留图像的细节。
  3. 基于梯度的融合: 在这种融合方法中,会考虑图像的梯度信息,目的是使融合区域的边缘更加自然,减少融合边界处的不连续性。
  4. 基于小波变换的融合: 使用小波变换将图像分解到不同的频带,然后根据不同频带的特点选择合适的融合规则,最后通过逆小波变换重构图像。这种方法能够很好地保持图像的高频细节。
  5. 基于深度学习的方法: 随着深度学习的发展,也有研究者开始探索使用神经网络来进行图像融合,比如使用卷积神经网络(CNN)来学习更高级别的特征表示,并据此实现图像融合。

下面主要介绍一下加权平均法和多分辨率金字塔两种方法

加权平均法

这是最简单的图像融合方法之一,通过给每张图像分配一个权重,然后计算每个像素点上所有图像对应像素值的加权平均值来得到最终的融合图像。这种方法简单但可能会导致边界模糊。

此处除了之前一直使用的小猫示例图外,我们再使用另外一张小狗照片来实现图像融合,示例图如下:

加权平均法使用方法addWeighted,其函数原型如下:

py 复制代码
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)

其中:

  • src1src2 分别是输入的两个图像,这两个图像需要具有相同的尺寸和类型。
  • alphabeta 是分别应用于 src1src2 的权重。
  • gamma 是一个可选的标量值,它会被直接加到加权和的结果上。
  • 相当于是dst = alpha*src1 + beta+src2 + gamma

【示例】使用加权平均法融合猫狗的照片

使用加权平均要确保两张图片大小一致,如果不一样的话,可以使用cv2.resize方法修改图片大小

py 复制代码
# 融合图片要确保两张图片大小一致
dog = cv2.resize(dog,(629,521))
dog.shape
py 复制代码
# 融合并展示结果
res = cv2.addWeighted(cat,0.4,dog,0.6,0)
cv_show('res',res)

运行结果:

多分辨率金字塔

在计算机视觉中,多分辨率金字塔用于处理不同尺度下的图像。OpenCV 提供了构建多分辨率金字塔的方法,这有助于图像的缩放和平滑,以及在不同尺度下进行特征检测等任务。多分辨率金字塔通常分为两种类型:高斯金字塔(Gaussian Pyramid)和拉普拉斯金字塔(Laplacian Pyramid)。

高斯金字塔

高斯金字塔是一种通过连续降采样(缩小图像)来创建的一系列图像。每层图像都是前一层图像的一个低通滤波版本,并且尺寸通常是前一层的一半。这种金字塔可以用于多尺度目标检测、图像融合等场景。

【示例】

py 复制代码
# 高斯金字塔
import cv2
import numpy as np

# 读取图像
img = cv2.imread('cat.jpg')

# 创建高斯金字塔
lower_res1 = cv2.pyrDown(img)  # 第一层
lower_res2 = cv2.pyrDown(lower_res1)  # 第二层

# 显示原图和金字塔层
cv2.imshow('Original Image', img)
cv2.imshow('Pyramid Level 1', lower_res1)
cv2.imshow('Pyramid Level 2', lower_res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

拉普拉斯金字塔

拉普拉斯金字塔是基于高斯金字塔构建的,它表示的是相邻高斯金字塔层之间的差异。每个拉普拉斯金字塔层都是通过从高斯金字塔的某一层中减去其上一层的放大版本得到的。这种金字塔可以用于图像重建和压缩等任务。

【示例】因为拉普拉斯用到了不同分辨率图像的减法,会让边缘变得更加明显,此处我们使用一张边缘明显的图作为例子

py 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('pie.jpg')

# 创建高斯金字塔
gaussian_pyr = [img]
for i in range(3):
    img = cv2.pyrDown(img)
    gaussian_pyr.append(img)

# 创建拉普拉斯金字塔
laplacian_pyr = []
for i in range(len(gaussian_pyr) - 1, 0, -1):
    size = (gaussian_pyr[i - 1].shape[1], gaussian_pyr[i - 1].shape[0])
    expanded = cv2.pyrUp(gaussian_pyr[i], dstsize=size)
    laplacian = cv2.subtract(gaussian_pyr[i - 1], expanded)
    laplacian_pyr.append(laplacian)

# 显示拉普拉斯金字塔层
for i, layer in enumerate(laplacian_pyr):
    cv2.imshow(f'Laplacian Level {i}', layer)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

相关推荐
千宇宙航2 分钟前
闲庭信步使用图像验证平台加速FPGA的开发:第十五课——基于sobel算子边缘检测的FPGA实现
图像处理·计算机视觉·fpga开发
鹧鸪云光伏5 分钟前
鹧鸪云重构光伏发电量预测的精度标准
人工智能·无人机·光伏·光伏设计·光伏模拟
九章云极AladdinEdu7 分钟前
摩尔线程MUSA架构深度调优指南:从CUDA到MUSA的显存访问模式重构原则
人工智能·pytorch·深度学习·机器学习·语言模型·tensorflow·gpu算力
IT信息技术学习圈14 分钟前
AI交互中的礼貌用语:“谢谢“的效用与代价分析
人工智能·交互
F_D_Z1 小时前
【EM算法】三硬币模型
算法·机器学习·概率论·em算法·极大似然估计
机器之心2 小时前
马斯克Grok这个二次元「小姐姐」,攻陷了整个互联网
人工智能
szxinmai主板定制专家3 小时前
基于光栅传感器+FPGA+ARM的测量控制解决方案
arm开发·人工智能·嵌入式硬件·fpga开发
Guheyunyi3 小时前
电气安全监测系统:筑牢电气安全防线
大数据·运维·网络·人工智能·安全·架构
三桥君3 小时前
在AI应用中Prompt撰写重要却难掌握,‘理解模型与行业知识是关键’:提升迫在眉睫
人工智能·ai·系统架构·prompt·产品经理·三桥君
semantist@语校3 小时前
日本语言学校:签证制度类 Prompt 的结构整理路径与策略
人工智能·百度·ai·语言模型·prompt·github·数据集