i m doing image blending using pyramid... m getting an opencv error.. i m following the official opencv tutorials. http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
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)
following is the error:-
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
It seems you are not generating your Gaussian pyramid properly here:
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
According to OpenCV documentation on cv2.pyrDown, if you don't specify the dstsize
, it will default to ((src.cols+1)/2, (src.rows+1)/2)
. BUT, you are always downsampling on the original G
copy.
If I undertand correctly, I think you have to apply it on the last downsampled image:
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(gpA[i])
gpA.append(G)
Obiously, the same applies to your B pyramid.
Now, your script will work if your images have an even shape but not with an odd shape because of how cv2.pyrDown
computes the default size. In this case, you have to give to cv2.pyrUp
the proper dstsize
paramater according to the image you use to do the cv2.substract
(or 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)
Then, this point applies to the reconstruction part too:
# 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])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With