我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔。

一幅图像在经过向下采样后,再对其向上采样,是无法恢复为原始状态的。

为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。

拉普拉斯金字塔的定义形式为:
$$
L_{i} = G_{i}-pyrUp(G_{i+1})
$$
拉普拉斯金字塔的第i层,等于“高斯金字塔的第i层”与“高斯金字塔中的第i+1层的向上采样结果”之差。

拉普拉斯金字塔关系示意


  • $$
    G_{0}、G_{1}、G_{2}、G_{3}分别是高斯金字塔的第0层、第1层、第2层、第3层
    $$

  • $$
    L_{0}、L_{1}、L_{2}分别是拉普拉斯金字塔的第0层、第1层、第2层
    $$

高斯金字塔和拉普拉斯金字塔的关系:

  • 向下取样(高斯金字塔的构成)

    G1 = cv2.pyrDown(G0)

    G2 = cv2.pyrDown(G1)

    G3 = cv2.pyrDown(G2)

  • 拉普拉斯金字塔

    L0 = G0 - cv2.pyrUp(G1)

    L1 = G1 - cv2.pyrUp(G2)

    L2 = G2 - cv2.pyrUp(G3)

  • 向上采样恢复高分辨率图像

    G0 = L0 + cv2.pyrUp(G1)

    G1 = L1 + cv2.pyrUp(G2)

    G2 = L2 + cv2.pyrUp(G3)


    例:编写程序,使用拉普拉斯金字塔及高斯金字塔恢复高斯金字塔内的多层图像。

    import cv2
    import numpy as np
    img = cv2.imread('mile.jpg')
    # ------生成高斯金字塔---------
    G0 = img
    G1 = cv2.pyrDown(G0)
    # G2 = cv2.pyrDown(G1)
    # G3 = cv2.pyrDown(G2)
    # ------生成拉普拉斯金字塔-----
    L0 = G0-cv2.pyrUp(G1)  #拉普拉斯第0层
    # L1 = G1-cv2.pyrUp(G2)  #拉普拉斯第1层
    # L2 = G2-cv2.pyrUp(G3)  #拉普拉斯第2层
    
    # ------复原G0-----------
    RG0 = L0 + cv2.pyrUp(G1) #通过拉普拉斯图像进行复原
    # -----将复原的RG0和原来的G0进行比较
    print('G0.shape = ',G0.shape)
    print('RG0.shape = ',RG0.shape)
    result = RG0 - G0        #将RG0与G0相减
    #计算result的绝对值,再求和
    result = abs(result)
    print('result求值为:',np.sum(result))
    
    # -----复原G1和G2类似,此处省略-----

运行结果:

  G0.shape =  (404, 376, 3)
  RG0.shape =  (404, 376, 3)
  result求值为: 0

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV33.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 28 日
如果觉得我的文章对你有用,请随意赞赏