高斯金字塔與拉普拉斯金字塔的原理與python構建

子燕若水發表於2020-10-02

轉載自:https://zhuanlan.zhihu.com/p/94014493

高斯金字塔和拉普拉斯金字塔【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】,大部分其它論文都是直接對其進行應用的。所以,如果本文的介紹有誤,請幫我指出此錯誤。

相關文章