2013-05-22 41 views
1

我試圖使用opencv函數pyrUppyrDown獲取一層拉普拉斯金字塔使用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 

,它被滿足。

所以,我不知道發生了什麼。

+1

可以pyrdown [2N + 1] - > N,但pyrup N - > 2N。所以要確保模糊在所有步驟中都是如此。 – Vaaksiainen

+0

你可以使用'爲我在範圍(n)'而不是'i = 0','而我 HelloGoodbye

回答

1

至於我可以看到你在每次迭代

down = cv2.pyrDown(img) 

使用pyrDown你的輸入圖像IMG上,我建議你把上面一行

down = cv2.pyrDown(currImg) 

所以你實際上計算的未來金字塔層。

錯誤的原因是你的形象不佳。其形狀是寬度相比於輸入圖像

down = cv2.pyrDown(img) 

尚未嘗試以更小的圖像存儲其pyrUp結果(寬×高),其形狀beeing較小(寬度/ 2/2×高度/ 2 x高/ 2)由於

up = cv2.pyrUp(down, dstsize=currImg.shape) 
... 
currImg = down 

即使我的回答是爲時已晚,也許這將幫助別人

1

這裏是什麼,我認爲正在發生的一個例子:

最後一次迭代後可以說gi_prev尺寸爲11×11,所以GI尺寸爲5x5的(因爲它不能5.5x5.5)。然後,pyrup將是10x10,而不是11x11。

我會打印出尺寸並檢查是否是這種情況。

+0

我試圖用你的評論解決問題後更新了我的問題,但我無法使其工作。 – synack