<p>似乎您没有在此处正确生成高斯金字塔:</p>
<pre><code># generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
</code></pre>
<p>根据OpenCV关于<a href="http://docs.opencv.org/3.0-beta/modules/imgproc/doc/filtering.html#pyrdown" rel="noreferrer">cv2.pyrDown</a>的文档,如果您不指定<code>dstsize</code>,它将默认为<code>((src.cols+1)/2, (src.rows+1)/2)</code>。但是,您总是在原始<code>G</code>副本上进行下采样。
如果我倒立正确,我想你必须把它应用到最后一个下采样图像上:</p>
<pre><code># generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(gpA[i])
gpA.append(G)
</code></pre>
<p>显然,这同样适用于您的<em>B金字塔</em>。</p>
<p>现在,如果您的图像具有偶数形状,但由于<code>cv2.pyrDown</code>如何计算默认大小,因此不具有奇数形状,则脚本将工作。在这种情况下,必须根据用于执行<code>cv2.substract</code>(或<code>cv2.add</code>)的图像,给<code>cv2.pyrUp</code>适当的<code>dstsize</code>参数。</p>
<pre><code># generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
size = (gpA[i-1].shape[1], gpA[i-1].shape[0])
GE = cv2.pyrUp(gpA[i], dstsize = size)
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
size = (gpB[i-1].shape[1], gpB[i-1].shape[0])
GE = cv2.pyrUp(gpB[i], dstsize = size)
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)
</code></pre>
<p>然后,这一点也适用于重建部分:</p>
<pre><code># now reconstruct
ls_ = LS[0]
for i in xrange(1,6):
size = (LS[i].shape[1], LS[i].shape[0])
ls_ = cv2.pyrUp(ls_, dstsize = size)
ls_ = cv2.add(ls_, LS[i])
</code></pre>