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

OpenCV 例程200篇 总目录-202205更新


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


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

程序说明:

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

扫描二维码关注公众号,回复: 14176199 查看本文章

在这里插入图片描述



(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124866268)

Copyright 2022 youcans, XUPT
Crated:2022-5-20


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
【youcans 的 OpenCV 例程200篇】148. 图像分割之线检测
【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
【youcans 的 OpenCV 例程200篇】150. 边缘检测梯度算子
【youcans 的 OpenCV 例程200篇】151. 边缘检测中的平滑处理
【youcans 的 OpenCV 例程200篇】152. 边缘检测之 LoG 算子
【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
【youcans 的 OpenCV 例程200篇】154. 边缘检测之 Canny 算子
【youcans 的 OpenCV 例程200篇】155. 边缘连接的局部处理方法
【youcans 的 OpenCV 例程200篇】156. 边缘连接局部处理的简化算法
【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法
【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法
【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合

猜你喜欢

转载自blog.csdn.net/youcans/article/details/124866268