2015-10-06 4 views
2

i m делать смешивание изображений с помощью пирамиды ... m получение ошибки opencv. i m после официальных инструкций opencv. http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.htmlошибка opencv: размеры входных аргументов не совпадают

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

Кажется, вы не генерируете Gaussian пирамида правильно здесь:

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

Согласно OpenCV документации по cv2.pyrDown, если вы не указывайте 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, то же самое относится и к вашим B пирамидам.

Теперь ваш скрипт будет работать, если ваши изображения имеют четную форму, но не с нечетной формой из-за того, как cv2.pyrDown вычисляет размер по умолчанию. В этом случае вы должны указать cv2.pyrUp надлежащее dstsize paramater в соответствии с изображением, которое вы используете, чтобы сделать cv2.substract (или cv2.add).

# 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

Смежные вопросы