【发布时间】:2013-05-22 10:21:02
【问题描述】:
我正在尝试使用以下 opencv 函数获得 拉普拉斯金字塔 的一层:pyrUp 和 pyrDown。
在documentation和更详细的book中,我发现第i个拉普拉斯层应该通过以下表达式获得:
Li = 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(当然会丢失信息,但这不应该影响大小,对吧?)。
更新
我将代码重构为:
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 错误:断言失败 (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。因此,请确保所有步骤的暗淡都是均匀的。
-
你可以用
for i in range(n)代替i = 0、while i < n和i += 1
标签: python opencv image-processing computer-vision