OpenCV 例程200篇 总目录-202205更新
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。
6.2 拉普拉斯金字塔(Laplacian pyramid)
在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。
用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像(或称复原图像),得到一系列的差值图像,即为拉普拉斯金字塔的分解图像。
对每一层图像先下采样再上采样后,计算与该图像的残差:
L(i)=G(i)−PyrUp[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篇】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更新】