2015-10-06 100 views
2

我使用金字塔进行图像混合... m得到一个opencv错误.. 我遵循正式的opencv教程。 http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.htmlopencv错误:输入参数的大小不匹配

import cv2 
import numpy as np,sys 

A = cv2.imread('/home/grayhat/apple.jpg') 
B = cv2.imread('/home/grayhat/orange.jpg') 

# generate Gaussian pyramid for A 
G = A.copy() 
gpA = [G] 
for i in xrange(6): 
    G = cv2.pyrDown(G) 
    gpA.append(G) 

# generate Gaussian pyramid for B 
G = B.copy() 
gpB = [G] 
for i in xrange(6): 
    G = cv2.pyrDown(G) 
    gpB.append(G) 

# generate Laplacian Pyramid for A 
lpA = [gpA[5]] 
for i in xrange(5,0,-1): 
    GE = cv2.pyrUp(gpA[i]) 
    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): 
    GE = cv2.pyrUp(gpB[i]) 
    L = cv2.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[:,0:cols/2], lb[:,cols/2:])) 
    LS.append(ls) 

# now reconstruct 
ls_ = LS[0] 
for i in xrange(1,6): 
    ls_ = cv2.pyrUp(ls_) 
    ls_ = cv2.add(ls_, LS[i]) 

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

cv2.imwrite('Pyramid_blending2.jpg',ls_) 
cv2.imwrite('Direct_blending.jpg',real) 

以下错误: -

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array') in arithm_op, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/arithm.cpp, line 1287 
Traceback (most recent call last): 
    File "programs/test11.py", line 25, in <module> 
    L = cv2.subtract(gpA[i-1],GE) 
cv2.error: /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/arithm.cpp:1287: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function arithm_op 
+0

那么,什么是GPA [I-1]的'尺寸'和'GE'在该行/ – Divakar

回答

8

看来你是不产生你的高斯金字塔正确的位置:在cv2.pyrDown

# generate Gaussian pyramid for A 
G = A.copy() 
gpA = [G] 
for i in xrange(6): 
    G = cv2.pyrDown(G) 
    gpA.append(G) 

据OpenCV的文件,如果你不指定dstsize,它将默认为((src.cols+1)/2, (src.rows+1)/2)。但是,您总是在原始G副本上进行下采样。 如果我undertand正确的,我认为你必须运用它的最后一个采样图象上:

# generate Gaussian pyramid for A 
G = A.copy() 
gpA = [G] 
for i in xrange(6): 
    G = cv2.pyrDown(gpA[i]) 
    gpA.append(G) 

Obiously,同样也适用于您的乙金字塔

现在,如果由于cv2.pyrDown计算默认大小,您的图像具有均匀的形状但不具有奇怪的形状,那么您的脚本将起作用。在这种情况下,根据您用来做cv2.substract(或cv2.add)的图像,您必须给cv2.pyrUp正确dstsize参数。

# 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) 

然后,这一点也适用于重建单元也:

# 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]) 
+0

获得?完全相同的错误,这次也是 – Zeeshan

+0

@ user3394251好吧,我想你的图像有一个奇怪的形状。我编辑了我测试过的东西。 – Gall

+1

感谢它的工作.... – Zeeshan

相关问题