我試圖使用opencv函數pyrUp
和pyrDown
獲取一層拉普拉斯金字塔。使用opencv獲取拉普拉斯金字塔
在documentation和在該book更詳細地,我發現第i拉普拉斯層應當由下面的表達式獲得:
李= GI - pyrDown(GI + 1)
其中Gi是高斯金字塔的第i層。
我已經試過是:
def get_laplacian_pyramid_layer(img, n):
gi = img
for i in range(n):
gi_prev = gi
gi = cv2.pyrDown(gi_prev)
pyrup = cv2.pyrUp(gi)
return cv2.addWeighted(gi_prev, 1.5, pyrup, -0.5, 0)
但我得到參與減法圖像的大小不同。我不理解它,因爲pyrUp
是爲了顛倒高斯金字塔的過程,即pyrDown(當然丟失了信息,但不應該影響大小,對嗎?)。
UPDATE
我重構我的代碼:
def get_laplacian_pyramid_layer(img, n):
'''Returns the n-th layer of the laplacian pyramid'''
currImg, i = img, 0
while i < n: # and currImg.size > max_level (83)
down, up = new_empty_img(img.shape), new_empty_img(img.shape)
down = cv2.pyrDown(img)
up = cv2.pyrUp(down, dstsize=currImg.shape)
lap = currImg - up
currImg = down
i += 1
return lap
正如你所看到的,我強制目標的圖像爲源同樣大小與pyrUp
的參數dstsize
功能。
但是,當執行pyrUp
函數時,此代碼也給我一個錯誤。錯誤的信息是:
OpenCV Error: Assertion failed (std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2) in pyrUp_,
在調試模式下我檢查斷言的表達:
up.shape[1]-down.shape[1]*2 == up.shape[1] %2 and up.shape[0]-down.shape[0]*2 == up.shape[0] %2
,它被滿足。
所以,我不知道發生了什麼。
可以pyrdown [2N + 1] - > N,但pyrup N - > 2N。所以要確保模糊在所有步驟中都是如此。 – Vaaksiainen
你可以使用'爲我在範圍(n)'而不是'i = 0','而我
HelloGoodbye