打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
userphoto

2023.09.07 山西

关注




图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。

在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。


6.3 基于拉普拉斯金字塔的图像融合

由于图像噪声、光照、曝光度、模型匹配误差等因素,图像直接拼接合成会在图像重叠区域的拼接处出现明显的痕迹 。图像融合的目的就是使两幅图像的重叠区域过渡自然且平滑。

拉普拉斯金字塔将源图像分解到不同的频带,越高频的图像信息越到上层。在相同显示尺寸下比较不同分辨率的拉普拉斯图像,可以发现不同尺度下关注的细节是不同的,低分辨率下关注的是较大尺度的基本纹理,而高分辨率下关注的是更精细的纹理。

因此,可以针对不同分解层的频带特征与细节,采用不同的融合算子以突出特定频带上特征与细节,也就可以将不同图像的特征与细节融合在一起。

金字塔图像融合过程,是在不同尺度、不同空间分辨率和不同分解层上分别进行的,也称为多波段融合(Multi-band Blending)。多波段融合的思想,是先对多幅图像分别构建拉普拉斯金字塔,然后对同一层图像(相同频段)按一定规则融合,对融合后的图像金字塔重建得到融合图像。

基于拉普拉斯金字塔的图像融合的基本步骤为:
1、对左图、右图分别构建高斯金字塔;
2、对左图、右图分别构建拉普拉斯金字塔;
3、在每个尺度(分辨率)下,根据当前尺度拼接左、右图的拉普拉斯图像 ,得到拼接图像的拉普拉斯金字塔;
4、由最低分辨率的高斯图像生成最低分辨率的起始图,通过拼接图像的拉普拉斯金字塔,逐层(逐个分辨率)重建拼接图像,直到得到最高分辨率的拼接图像。


例程:1.88 拉普拉斯金字塔图像融合

    # 1.88:拉普拉斯金字塔图像融合
    img1 = cv2.imread("../images/buddha01.png")
    img2 = cv2.imread("../images/buddha03.png")
    img1 = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC)  # 将图片大小调整到 2**levels 的整数倍
    img2 = cv2.resize(img2, (512, 512), interpolation=cv2.INTER_CUBIC)

    # 直接左右拼接图像 (用于对比)
    rows, cols, channel = img1.shape
    stack = np.hstack((img1[:,:int(cols/2)], img2[:,int(cols/2):]))

    # 图像向下取样, 构造高斯金字塔: [原图,下取样1次,下取样2次,下取样3次,下取样4次]
    levels = 5  # 高斯金字塔层数
    gaussPyr1, gaussPyr2 = [img1], [img2]  # 原始图像为高斯金字塔第 0 层, (512, 512)
    for i in range(1, levels):  # 高斯金字塔共 5 层: 0,1,2,3,4
        gaussPyr1.append(cv2.pyrDown(gaussPyr1[i-1]))  # 计算第 i 层高斯金字塔
        gaussPyr2.append(cv2.pyrDown(gaussPyr2[i-1]))

    # 图像向上取样, 构造拉普拉斯金字塔 [第1层残差,第2层残差,第3层残差,第4层残差]
    lapPyr1, lapPyr2 = [], []  # 从最顶层开始恢复
    for i in range(levels-1):  # 拉普拉斯金字塔有 4 层: 0,1,2,3
        lapPyr1.append(gaussPyr1[i] - cv2.pyrUp(gaussPyr1[i+1]))
        lapPyr2.append(gaussPyr2[i] - cv2.pyrUp(gaussPyr2[i+1]))

    # 拉普拉斯金字塔左右拼接
    lapStack = []
    for i in range(levels-1):  # 拉普拉斯金字塔共 4 层: 0,1,2,3
        rows, cols, channel = lapPyr1[i].shape
        splicing = np.hstack((lapPyr1[i][:, 0:int(cols/2)], lapPyr2[i][:, int(cols/2):]))
        lapStack.append(splicing)
        print("lapStack", i, lapStack[i].shape)

    # 由拼接后的Laplace金字塔恢复原图像
    rows, cols, channel = gaussPyr1[-1].shape  # 高斯金字塔顶层 G4:(32,32)
    stackG4 = np.hstack((gaussPyr1[-1][:,:int(cols/2)], gaussPyr2[-1][:,int(cols/2):]))  # 拼接高斯金字塔顶层
    stackG3 = lapStack[3] + cv2.pyrUp(stackG4)  # stackG3:(64,64)
    stackG2 = lapStack[2] + cv2.pyrUp(stackG3)  # stackG2:(128,128)
    stackG1 = lapStack[1] + cv2.pyrUp(stackG2)  # stackG1:(256,256)
    stackG0 = lapStack[0] + cv2.pyrUp(stackG1)  # stackG0:(512,512)

    plt.figure(figsize=(9, 7))
    plt.subplot(221), plt.axis('off'), plt.title("BuddhaFace A")
    plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
    plt.subplot(222), plt.axis('off'), plt.title("BuddhaFace B")
    plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
    plt.subplot(223), plt.axis('off'), plt.title("BuddhaFace stacked")
    plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))
    plt.subplot(224), plt.axis('off'), plt.title("Laplacian blended")
    plt.imshow(cv2.cvtColor(stackG0, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()   1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

程序说明:

左下图是基于拉普拉斯金字塔的图像融合,右下图是图像直接进行拼接的结果。直接拼接时,在左右拼接处可以看到非常明显、锐利的拼接缝,称为截断现象(Seams)。基于拉普拉斯金字塔的图像拼接,通过多频带融合,使两幅图像的重叠区域过渡自然且平滑。



(本节完)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python下opencv使用笔记(八)(图像金字塔)
OpenCV中的图像处理图像梯度 Canny边缘检测图像金字塔
【OpenCV学习笔记】之图像金字塔(Image Pyramid)
图像融合之拉普拉斯融合(laplacian blending)
DoG 、Laplacian、图像金字塔详解
尺度空间理论
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服