【问题标题】:Get Laplacian pyramid using opencv使用opencv获取拉普拉斯金字塔
【发布时间】:2013-05-22 10:21:02
【问题描述】:

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

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 = 0while i &lt; ni += 1

标签: python opencv image-processing computer-vision


【解决方案1】:

据我所知,您在每次迭代中都在输入图像 img 上使用 pyrDown

down = cv2.pyrDown(img)

我建议你把那行改成

down = cv2.pyrDown(currImg)

所以你实际上计算了下一个金字塔层。

错误的原因是您的图像不佳。与输入图像相比,它的形状是宽/2 x 高/2

down = cv2.pyrDown(img)

但您尝试将其 pyrUp 结果(宽度 * 高度)存储在一个更小的向上图像中,其形状由于

而变得更小(宽度/2 x 高度/2)
up = cv2.pyrUp(down, dstsize=currImg.shape)
...
currImg = down 

即使我的回答为时已晚,也许它会帮助别人

【讨论】:

    【解决方案2】:

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

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

    我会打印出尺寸并检查是否是这种情况。

    【讨论】:

    • 我在尝试使用您的评论解决问题后更新了我的问题,但我还不能让它工作。
    【解决方案3】:

    但是,当执行 pyrUp > 函数时,这段代码也会给我一个错误。错误信息是:

    OpenCV 错误:断言失败 (std::abs(dsize.width - ssize.width*2) == >dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % >2) 在 pyrUp_,

    在这里聚会晚了很多年,但我们走了。使用 'dstsize:

    传递放大后的图像大小时
    up = cv2.pyrUp(down, dstsize=currImg.shape)
    

    .shape 方法返回高度 x 宽度。但是,pyrup 函数需要这些尺寸为宽度 x 高度。因此尝试以下代码:

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

    【讨论】:

      猜你喜欢
      • 2020-03-24
      • 2018-04-15
      • 2012-09-16
      • 2021-11-28
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多