首页 > 解决方案 > 图像金字塔计算错误“输入参数的大小不匹配”

问题描述

我正在按照此处的官方 Python 教程学习图像金字塔。

我收到以下错误以及突出显示最后一个引用的警告cols

有人可以帮我了解错误的原因以及如何更改代码以解决警告real = np.hstack((A[:, :cols/2], B[:, cols/2:]))吗?

第 29 行,在 L = cv.subtract(gpA[i - 1], GE) cv2.error: OpenCV(4.4.0) /private/var/folders/9m/h_ts52xj0jdgs6w0m2lqv9wr0000gn/T/pycharm-packaging/opencv-python/ opencv/modules/core/src/arithm.cpp:669:错误:(-209:输入参数的大小不匹配)该操作既不是“数组操作数组”(其中数组具有相同的大小和相同的通道数),也不是函数'arithm_op'中的'array op scalar',也不是'scalar op array'

import cv2 as cv
import numpy as np

path1 = "resources/apple.jpg"
A = cv.imread(path1, 0)

path2 = "resources/orange.jpg"
B = cv.imread(path2, 0)

# Generate Gaussian pyramid for A.
G = A.copy()
gpA = [G]
for i in range(6):
    G = cv.pyrDown(G)
    gpA.append(G)

# Generate Gaussian pyramid for B.
G = B.copy()
gpB = [G]
for i in range(6):
    G = cv.pyrDown(G)
    gpB.append(G)

# Generate Laplacian Pyramid for A.
lpA = [gpA[5]]
for i in range(5, 0, -1):
    GE = cv.pyrUp(gpA[i])
    L = cv.subtract(gpA[i - 1], GE)
    lpA.append(L)

# Generate Laplacian Pyramid for B.
lpB = [gpB[5]]
for i in range(5, 0, -1):
    GE = cv.pyrUp(gpB[i])
    L = cv.subtract(gpB[i - 1], GE)
    lpB.append(L)

# Now, add left and right halves of images in each level.
LS = []
for la, lb in zip(lpA, lpB):
    rows, cols, dpt = la.shape
    ls = np.hstack((la[:, :cols/2], lb[:, cols/2:]))
    LS.append(ls)

# Now, re-construct.
ls_ = LS[0]
for i in range(1, 6):
    ls_ = cv.pyrUp(ls_)
    ls_ = cv.add(ls_, LS[i])

# Image with direct connecting each half.
real = np.hstack((A[:, :cols/2], B[:, cols/2:]))

cv.imwrite('Pyramid_blending.jpg', ls_)
cv.imwrite('Direct_blending.jpg', real)

这些是我正在使用的图像:

在此处输入图像描述 在此处输入图像描述

标签: pythonopencv

解决方案


当您使用cv.pyrUp.

默认情况下,上采样的图像尺寸使用以下方法计算:

|dstsize.width−src.cols∗2| ≤ (dstsize.widthmod2)
|dstsize.height−src.rows∗2| ≤ (dstsize.heightmod2)

因此,在您的情况下,当您到达gpA[4]具有奇数宽度尺寸并且上采样器使用默认值并为上采样提供偶数宽度尺寸时,这是一个问题gpA[5]

gpA[4].shape: (13, 16)

GE.shape: (14, 16)

您最终会得到不同维度的数组,因此无法将它们彼此相减。

为避免这种情况,您需要从上采样中明确定义所需的维度,例如,您可以找到gpA[i-1]并使用这些维度


推荐阅读