高斯金字塔和拉普拉斯金字塔【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.