使用open获取拉普拉斯金字塔

2024-04-26 22:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用opencv函数获得拉普拉斯金字塔的一层:pyrUppyrDown

documentation和更详细的book中,我发现第I-th拉普拉斯层应通过以下表达式获得:

Li=Gi-吡咯烷酮(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 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

它很满意。

所以,我不知道发生了什么。


Tags: 函数pyramidlayerimgcv2downshapeup
3条回答

据我所见,在每次迭代中,您都在输入图像上使用pyrDownimg

down = cv2.pyrDown(img)

我建议你把那条线改成

down = cv2.pyrDown(currImg)

所以你要计算下一个金字塔层。

错误的原因是你的坏图像。与输入图像相比,它的形状是宽2 x高2

down = cv2.pyrDown(img)

然而,您尝试将其pyrUp结果(width*height)存储在一个更小的up图像中,其形状变小(width/2xheight/2),因为

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

即使我的答案太迟了,也许它会帮助其他人

下面是一个我认为正在发生的事情的例子:

在最后一次迭代之后,让我们假设gi-prev的大小是11x11,所以gi的大小是5x5(因为它不能是5.5x5.5)。那么pyrup将是10x10,而不是11x11。

我会把尺寸打印出来看看是不是这样。

However, this code also gives me an error when when executing the pyrUp >function. The message of the error is:

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_,

在这里聚会迟到了很多年,但我们走了。使用“dstsize”传递放大图像大小时:

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

shape方法返回高度x宽度。然而,pyrup函数要求这些尺寸为宽度x高度。因此,请尝试以下代码:

up = cv2.pyrUp(down, dstsize=(currImg.shape[1],currImg.shape[0])

相关问题 更多 >