(三)OpenCV图像金字塔

2020-02-28  本文已影响0人  zqyadam

高斯金字塔

高斯金字塔

采样可逆性

无论是先下采样,然后再上采样,还是先上采样,在下采样,都是不能讲图像还原回去的。

如果想还原图像,需要采用下面的拉普拉斯金字塔

拉普拉斯金字塔

拉普拉斯金字塔

拉普拉斯金字塔中的第i层,等于“高斯金字塔中的第i层”与“高斯金字塔中的第i+1层的向上采样结果”之差。

Gi+1 = cv2.pyrDown(Gi) 拉普拉斯金字塔恢复图像
import cv2

def gaussin_yyramid(img, num_layers=3):
    G = [img]
    for i in range(num_layers):
        G.append(cv2.pyrDown(G[i]))
    return G


def laplace_pryramid(G):
    L = []
    for i in range(len(G) - 1):
        L.append(G[i] - cv2.pyrUp(G[i + 1]))
    return L


def reconstuct_image(G, L, layer):
    if layer > (len(L) - 1):
        assert "无法重建图像"
        return

    Li = L[layer]
    Gi = G[layer + 1]
    image = Li + cv2.pyrUp(Gi)
    return image


def main():
    img = cv2.imread("lena.tif")
    # 获取高斯金字塔
    G = gaussin_yyramid(img, 3)
    # 解构高斯金字塔每一层,第一个G0就是原图像img
    G0, G1, G2, G3 = G
    # 获取拉普拉斯金字塔
    L = laplace_pryramid(G)

    R1 = reconstuct_image(G, L, 1)
    # 显示原图像
    cv2.imshow('Original', img)
    # ============= 重建G1图像 =============
    # 显示G1图像
    cv2.imshow('G1', G1)
    # 显示重建后的图像
    cv2.imshow('r1', R1)
    # 显示两个图像的插值,全黑表示没有差别
    cv2.imshow('diff', G1 - R1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

上一篇 下一篇

猜你喜欢

热点阅读