【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像

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


【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像


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

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


例程:1.87 由拉普拉斯金字塔还原图像

    # 1.87:由拉普拉斯金字塔还原图像
    img = cv2.imread("../images/imgLena.tif", flags=1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    pyrD0 = gray.copy()

    # 图像向下取样,构造高斯金字塔
    pyrD1 = cv2.pyrDown(pyrD0)
    pyrD2 = cv2.pyrDown(pyrD1)
    pyrD3 = cv2.pyrDown(pyrD2)
    pyrD4 = cv2.pyrDown(pyrD3)
    print("pyrD:", pyrD0.shape, pyrD1.shape, pyrD2.shape, pyrD3.shape)

    # # 图像向上取样
    # pyrU3 = pyrD3.copy()
    # pyrU2 = cv2.pyrUp(pyrU3)
    # pyrU1 = cv2.pyrUp(pyrU2)
    # pyrU0 = cv2.pyrUp(pyrU1)
    # print("pyrU:", pyrU0.shape, pyrU1.shape, pyrU2.shape, pyrU3.shape)

    # # 构造拉普拉斯金字塔,高斯金字塔的每一层图像减去其上一层图像的上采样
    pyrL0 = pyrD0 - cv2.pyrUp(pyrD1)
    pyrL1 = pyrD1 - cv2.pyrUp(pyrD2)
    pyrL2 = pyrD2 - cv2.pyrUp(pyrD3)
    pyrL3 = pyrD3 - cv2.pyrUp(pyrD4)
    print("pyrL:", pyrL0.shape, pyrL1.shape, pyrL2.shape, pyrL3.shape)

    # 向上采样恢复高分辨率图像
    rebuildG3 = pyrL3 + cv2.pyrUp(pyrD4)
    rebuildG2 = pyrL2 + cv2.pyrUp(rebuildG3)
    rebuildG1 = pyrL1 + cv2.pyrUp(rebuildG2)
    rebuildG0 = pyrL0 + cv2.pyrUp(rebuildG1)
    print("rebuild:", rebuildG0.shape, rebuildG1.shape, rebuildG2.shape, rebuildG3.shape)
    print("diff of rebuild:", np.mean(abs(rebuildG0-img)))

    plt.figure(figsize=(10, 9))
    plt.subplot(341), plt.axis('off'), plt.title("GaussPyramid "+str(pyrD0.shape))
    plt.imshow(cv2.cvtColor(pyrD0, cv2.COLOR_BGR2RGB))
    plt.subplot(342), plt.axis('off'), plt.title(str(pyrD1.shape))
    plt.imshow(cv2.cvtColor(pyrD1, cv2.COLOR_BGR2RGB))
    plt.subplot(343), plt.axis('off'), plt.title(str(pyrD2.shape))
    plt.imshow(cv2.cvtColor(pyrD2, cv2.COLOR_BGR2RGB))
    plt.subplot(344), plt.axis('off'), plt.title(str(pyrD3.shape))
    plt.imshow(cv2.cvtColor(pyrD3, cv2.COLOR_BGR2RGB))
    plt.subplot(345), plt.axis('off'), plt.title("LaplacePyramid "+str(pyrL0.shape))
    plt.imshow(cv2.cvtColor(pyrL0, cv2.COLOR_BGR2RGB))
    plt.subplot(346), plt.axis('off'), plt.title(str(pyrL1.shape))
    plt.imshow(cv2.cvtColor(pyrL1, cv2.COLOR_BGR2RGB))
    plt.subplot(347), plt.axis('off'), plt.title(str(pyrL2.shape))
    plt.imshow(cv2.cvtColor(pyrL2, cv2.COLOR_BGR2RGB))
    plt.subplot(348), plt.axis('off'), plt.title(str(pyrL3.shape))
    plt.imshow(cv2.cvtColor(pyrL3, cv2.COLOR_BGR2RGB))
    plt.subplot(349), plt.axis('off'), plt.title("LaplaceRebuild "+str(rebuildG0.shape))
    plt.imshow(cv2.cvtColor(rebuildG0, cv2.COLOR_BGR2RGB))
    plt.subplot(3,4,10), plt.axis('off'), plt.title(str(rebuildG1.shape))
    plt.imshow(cv2.cvtColor(rebuildG1, cv2.COLOR_BGR2RGB))
    plt.subplot(3,4,11), plt.axis('off'), plt.title(str(rebuildG2.shape))
    plt.imshow(cv2.cvtColor(rebuildG2, cv2.COLOR_BGR2RGB))
    plt.subplot(3,4,12), plt.axis('off'), plt.title(str(rebuildG3.shape))
    plt.imshow(cv2.cvtColor(rebuildG3, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

运行结果:
pyrD: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
pyrL: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
rebuild: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
diff of rebuild: 0.0


在这里插入图片描述



(本节完)


版权声明:

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

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


欢迎关注 『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.由拉普拉斯金字塔还原图像

猜你喜欢

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