- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 opencv 函数获取一层 拉普拉斯金字塔:pyrUp
和 pyrDown
。
在documentation并在此 book 中详细介绍,我发现第i-th个拉普拉斯算子层应该通过下面的表达式得到:
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 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_,
在 Debug模式下,我检查了断言的表达式:
up.shape[1]-down.shape[1]*2 == up.shape[1] %2 and up.shape[0]-down.shape[0]*2 == up.shape[0] %2
它很满意。
所以,我不知道发生了什么。
最佳答案
据我所知,您在每次迭代中都对输入图像 img 使用了 pyrDown
down = cv2.pyrDown(img)
我建议您将该行更改为
down = cv2.pyrDown(currImg)
所以你实际上计算了下一个金字塔层。
错误的原因是你的下图。它的形状与输入图像相比是 width/2 x height/2
down = cv2.pyrDown(img)
但是您尝试将其 pyrUp 结果(宽度 * 高度)存储在更小的向上图像中,由于
up = cv2.pyrUp(down, dstsize=currImg.shape)
...
currImg = down
即使我的回答为时已晚,也许它会对其他人有所帮助
关于python - 使用opencv获取拉普拉斯金字塔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689295/
我对Mikolajczyk等人介绍的Harris-Laplacian-Detector有疑问。使用哈里斯(Harris),您可以搜索每个特定刻度内的“拐角”最大值,然后使用拉普拉斯算子(Laplaci
我是一名优秀的程序员,十分优秀!