【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

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


【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔


图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。

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

通过对原始图像进行多尺度像素采样,生成多个不同分辨率的图像。把高分辨率的原始图像放在底部,越往上的图像越小越模糊,最小的图像放在顶部,称为图像金字塔。

向下采样,分辨率逐级降低;向上采样,分辨率逐级升高。上采样和下采样是不可逆的,将下采样的图像还原回原来尺寸时会丢失高频信息,使图片变模糊。


6.2 拉普拉斯金字塔(Laplacian pyramid)

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

用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像(或称复原图像),得到一系列的差值图像,即为拉普拉斯金字塔的分解图像。

在这里插入图片描述

对每一层图像先下采样再上采样后,计算与该图像的残差:
L ( i ) = G ( i ) − P y r U p [ G ( i + 1 ) ] L(i) = G(i) - PyrUp[G(i+1)] L(i)=G(i)PyrUp[G(i+1)]
这表明拉普拉斯金字塔是就是记录高斯金字塔每一级下采样后再上采样得到的复原图像,与该级在下采样前的图像之间的差异。

拉普拉斯金字塔可以配合高斯金字塔使用。拉普拉斯金字塔是高斯金字塔的差分图像,保存了高斯金字塔丢失的高频信息,因此可以精确地还原图片信息。从最低分辨率图像上采样,然后逐次加上每个尺度的残差信息,就可以还原到原始的高分辨率图。

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔_第1张图片


例程:1.86 拉普拉斯图像金字塔

    # # 1.86:拉普拉斯金字塔 (Gaussian pyramid)
    img = cv2.imread("../images/Fig0515a.tif", flags=1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 图像向下取样, 构造高斯金字塔
    temp = gray.copy()
    gaussPyr = [temp]  # 原始图像为第 0 层
    levels = 4  # 高斯金字塔共 4 层: 0,1,2,3
    for i in range(1, levels):  # 计算第 i 层高斯金字塔
        temp = cv2.pyrDown(temp)
        gaussPyr.append(temp)
        print(i, temp.shape)

    # 图像向上取样, 构造拉普拉斯金字塔
    laplacePyr = [gaussPyr[-1]]  # 从最顶层开始恢复
    for i in range(levels-1, 0, -1):  # 拉普拉斯金字塔共 3 层: 2,1,0
        tempUp = cv2.pyrUp(gaussPyr[i])  # 上取样
        laplace = cv2.subtract(gaussPyr[i-1], tempUp)  # 残差
        laplacePyr.append(laplace)
        print(i, laplace.shape)

    plt.figure(figsize=(10, 6))
    plt.subplot(241), plt.axis('off'), plt.title("GaussPyramid "+str(gaussPyr[0].shape[:2]))
    plt.imshow(gaussPyr[0], 'gray')
    plt.subplot(242), plt.axis('off'), plt.title("->"+str(gaussPyr[1].shape[:2]))
    plt.imshow(gaussPyr[1], 'gray')
    # down1 = np.zeros_like(gray, dtype=np.uint8)
    # down1[:gaussPyr[1].shape[0],:gaussPyr[1].shape[1]] = gaussPyr[1]
    # plt.imshow(down1, 'gray')
    plt.subplot(243), plt.axis('off'), plt.title("->"+str(gaussPyr[2].shape[:2]))
    plt.imshow(gaussPyr[2], 'gray')
    # down2 = np.zeros_like(gray, dtype=np.uint8)
    # down2[:gaussPyr[2].shape[0],:gaussPyr[2].shape[1]] = gaussPyr[2]
    # plt.imshow(down2, 'gray')
    plt.subplot(244), plt.axis('off'), plt.title("->"+str(gaussPyr[3].shape[:2]))
    plt.imshow(gaussPyr[3], 'gray')
    # down3 = np.zeros_like(gray, dtype=np.uint8)
    # down3[:gaussPyr[3].shape[0],:gaussPyr[3].shape[1]] = gaussPyr[3]
    # plt.imshow(down3, 'gray')
    plt.subplot(248), plt.axis('off'), plt.title("<- LaplacePyramid")
    plt.imshow(laplacePyr[0], 'gray')
    # lPyr0 = np.zeros_like(gray, dtype=np.uint8)
    # lPyr0[:laplacePyr[0].shape[0],:laplacePyr[0].shape[1]] = laplacePyr[0]
    # plt.imshow(lPyr0, 'gray')
    plt.subplot(247), plt.axis('off'), plt.title("<-"+str(laplacePyr[1].shape[:2]))
    plt.imshow(laplacePyr[1], 'gray')
    # lPyr1 = np.zeros_like(gray, dtype=np.uint8)
    # lPyr1[:laplacePyr[1].shape[0],:laplacePyr[1].shape[1]] = laplacePyr[1]
    # _, binPyr1 = cv2.threshold(lPyr1, 20, 255, cv2.THRESH_BINARY)  # 二值化处理
    # plt.imshow(binPyr1, 'gray')  # 二值化处理是为了将拉普拉斯金字塔显示更清楚
    plt.subplot(246), plt.axis('off'), plt.title("<-"+str(laplacePyr[2].shape[:2]))
    plt.imshow(laplacePyr[2], 'gray')
    # lPyr2 = np.zeros_like(gray, dtype=np.uint8)
    # lPyr2[:laplacePyr[2].shape[0],:laplacePyr[2].shape[1]] = laplacePyr[2]
    # _, binPyr2 = cv2.threshold(lPyr2, 20, 255, cv2.THRESH_BINARY)
    # plt.imshow(lPyr2, 'gray')  # 二值化处理后的已经不是拉普拉斯残差图像
    plt.subplot(245), plt.axis('off'), plt.title("<-"+str(laplacePyr[3].shape[:2]))
    plt.imshow(laplacePyr[3], 'gray')
    # lPyr3 = np.zeros_like(gray, dtype=np.uint8)
    # lPyr3[:laplacePyr[3].shape[0],:laplacePyr[3].shape[1]] = laplacePyr[3]
    # _, binPyr3 = cv2.threshold(lPyr3, 20, 255, cv2.THRESH_BINARY)
    # plt.imshow(lPyr3, 'gray')
    plt.tight_layout()
    plt.show()

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔_第2张图片



(本节完)


版权声明:

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

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


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

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合
【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状
【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

你可能感兴趣的:(opencv,python,图像处理,计算机视觉,算法)