高斯金字塔和拉普拉斯金字塔【1】在图像相关领域应用广泛,尤其是图像融合和图像分割方面。本文从理论和opencv实现两个方面对两种金字塔进行了介绍,并给出了二者的视觉效果。
1、高斯金字塔
在计算机视觉与图像处理相关任务中,经常需要使用同一张图的不同尺寸的子图,我们可以使用高斯金字塔来获取这些子图。高斯金字塔是通过对一张图逐级下采样获得的,如下图所示:
上图中最下层是原始的图像,越靠上的层图像尺寸越小,这一组图像就被称为高斯金字塔(在某些资料中,下采样之前需要首先进行高斯滤波,本文为了简化过程省略了这一步骤)。假设G0表示原始图像,Gi表示第i次下采样得到的图像,那么高斯金字塔的计算过程可以表示如下:
其中Down表示下采样函数,下采样可以通过抛去图像中的偶数行和偶数列来实现,这样图像长宽各减少二分之一,面积减少四分之一。opencv提供了pyrDown()函数用于下采样,代码如下:
def gaussian(ori_image, down_times=5):
# 1:添加第一个图像为原始图像
temp_gau = ori_image.copy()
gaussian_pyramid = [temp_gau]
for i in range(down_times):
# 2:连续存储5次下采样,这样高斯金字塔就有6层
temp_gau = cv2.pyrDown(temp_gau)
gaussian_pyramid.append(temp_gau)
return gaussian_pyramid
进行5次下采样可以获得下面得6级高斯金字塔(第1级为原始高分辨率图像):
可以看出,随着下采样的进行,图像的分辨率不断降低,视觉效果也越来越模糊。
2、拉普拉斯金字塔
拉普拉斯金字塔可以认为是残差金字塔,用来存储下采样后图片与原始图片的差异。我们知道,如果高斯金字塔中任意一张图Gi(比如G0为最初的高分辨率图像)先进行下采样得到图Down(Gi),再进行上采样得到图Up(Down(Gi)),得到的Up(Down(Gi))与Gi是存在差异的,因为下采样过程丢失的信息不能通过上采样来完全恢复,也就是说下采样是不可逆的。下面展示了一张图先进行下采样,再进行上采样的过程:
可以看出,原始图片下采样后得到的小尺寸图片虽然保留了视觉效果,但是将该小尺寸图像再次上采样也不能完整的恢复出原始图像。为了能够从下采样图像Down(Gi)中还原原始图像Gi,我们需要记录再次上采样得到Up(Down(Gi))与原始图片Gi之间的差异,这就是拉普拉斯金字塔的核心思想,下面最右边的图展示了这种差异(为了效果明显我进行了伽马矫正):
拉普拉斯金字塔就是记录高斯金字塔每一级下采样后再上采样与下采样前的差异,目的是为了能够完整的恢复出每一层级的下采样前图像。下面的公式就是前面的差异记录过程:
对于前文得到的高斯金字塔,现在可以构建对应的拉普拉斯金字塔如下(第1级为高斯金字塔中最小尺寸的图,也就是高斯金字塔最后1级;为了下图看起来更明显我进行了伽马矫正):
opencv提供了pyrUp()函数用于上下采样过程,对应代码如下:
def laplacian(gaussian_pyramid, up_times=5):
laplacian_pyramid = [gaussian_pyramid[-1]]
for i in range(up_times, 0, -1):
# i的取值为5,4,3,2,1,0也就是拉普拉斯金字塔有6层
temp_pyrUp = cv2.pyrUp(gaussian_pyramid[i])
temp_lap = cv2.subtract(gaussian_pyramid[i-1], temp_pyrUp)
laplacian_pyramid.append(temp_lap)
return laplacian_pyramid
3、总结
高斯金字塔和拉普拉斯金字塔作为获取不同分辨率图像的方法,原理并不复杂,但是自己并没有找到中文论文专门介绍,仅仅找到了拉普拉斯金字塔论文【1】,大部分其它论文都是直接对其进行应用的。所以,如果本文的介绍有误,请帮我指出此错误。
参考文献:
【1】Burt P, Adelson E. The Laplacian pyramid as a compact image code[J]. IEEE Transactions on communications, 1983, 31(4): 532-540.