Error with For loop and matrix multiplication in PYTHON

ValueErrorTraceback (most recent call last)
\<ipython-input-35-1ecd9c5afb6f\>in\<module\> 19print(right_temp.size) 20print(coordinates_left,coordinates_right)---\> 21same,h,w=if_same(left_temp,right_temp) 22#plt.figure(figsize=[h,w]) 23#plt.imshow(out1)\<ipython-input-33-27346e0a4cef\>inif\_same(left\_temp, right\_temp) 32image1=left_temp_np[0:h][0:w] 33image2=right_temp_np[j:h+j][i:w+i]---\> 34same=mse(image1,image2) 35print("loop 1 i: %s j: %s image1: %s image2: %s"%(i,j,image1.size,image2.size)) 36print(same)\<ipython-input-34-3ff65825a155\>inmse(image1, image2) 1defmse(image1,image2):----\> 2diff=(image1.astype(float)-image2.astype(float)) 3error=diff\*\*2 4[w,h]=image1.shape
 5den=w\*h

ValueError: operands could not be broadcast together with shapes (10,10) (10,11)

Above is the Error. 

The code employs if conditions and for loop to scans unequal images from two cameras and checks for matches. 

’if_same’ : This is the main function which scans and checks. 

‘mse’ calls another function which calculates squared error.

def mse(image1, image2):
    diff=(image1.astype(float)-image2.astype(float))
    error=diff**2
    [w,h]=image1.shape
    den=w*h
    mse=error/den

    return mse

def if_same(left_temp, right_temp):


    h_L, w_L = left_temp.size
    h_R, w_R = right_temp.size

    left_temp_np=np.asarray(left_temp)
    right_temp_np=np.asarray(right_temp)

    diff_w=abs(w_L-w_R)+1
    diff_h=abs(h_L-h_R)+1

    image1=[]
    image2=[]
    #same= np.zeros([h,w], np.uint8)
    same=0
    h=0
    w=0



    if w_L<=w_R:
        if h_L<=h_R:
            [w,h]=[w_L,h_L]
            #image1=np.zeros[h,w]
            #image2=np.zeros[h,w]
            i=0
            for i in range(0,diff_w):
                j=0
                for j in range(0,diff_h):
                    print(j, h, h+j, i, w, w+i)
                    image1=left_temp_np[0:h][0:w]
                    image2=right_temp_np[j:h+j][i:w+i]
                    same=mse(image1, image2)
                    print("loop 1 i: %s j: %s image1: %s image2: %s" % (i,j,image1.size,image2.size))
                    print(same)


        elif h_R<h_L:
            [w,h]=[w_L,h_R]
            i=0
            for i in range(0,diff_w):
                j=0
                for j in range(0,diff_h):
                    image1=left_temp_np[j:h+j][0:w]
                    image2=right_temp_np[0:h][i:w+i]
                    same=mse(image1, image2)
                    print("loop 2 i: %s j: %s image1: %s image2: %s" % (i,j,image1.size,image2.size))
                    print(same)
        return same, h, w

    elif w_R<w_L:
        if h_L<=h_R:
            i=0
            [w,h]=[w_R,h_L]
            for i in range(0,diff_w):
                j=0
                for j in range(0,diff_h):
                    image1=left_temp_np[0:h][i:w+i]
                    image2=right_temp_np[j:h+j][0:w]
                    same=mse(image1, image2)
                    print("loop 3 i: %s j: %s image1: %s image2: %s" % (i,j,image1.size,image2.size))
                    print(same)

        elif h_R<h_L:
            i=0
            [w,h]=[w_R,h_R]
            for i in range(0,diff_w):
                j=0
                for j in range(0,diff_h):
                    print(j)
                    image1=left_temp_np[j:(h+j)][i:(w+i)]
                    image2=right_temp_np[0:h][0:w]
                    print("loop 4 i: %s j: %s image1: %s image2: %s" % (i,j,image1.size,image2.size))
                    same=mse(image1, image2)
                    print(same)
        return same, h, w


    return same, h, w

I have actually tried printing the i,j,w,h  to see if there is the problem. 

0 10 10 0 13 13

The code should slice matrixes of dimensions 10x13 from both images. But I get 10x10 and 10x11. 

If the slice is [0:10][0:13] and [1:11][1:14], both will return [10x13]. Correct me, if I’m wrong

The shape of the image gets inversed when read as an array. 

I later found that out by printing the shapes of images and image arrays. 

@ramkarumugam wrote:

ValueErrorTraceback (most recent call last)
<ipython-input-35-1ecd9c5afb6f>in<module> 19print(right_temp.size) 20print(coordinates_left,coordinates_right)—> 21same,h,w=if_same(left_temp,right_temp) 22#plt.figure(figsize=[h,w]) 23#plt.imshow(out1)<ipython-input-33-27346e0a4cef>inif_same(left_temp, right_temp) 32image1=left_temp_np[0:h][0:w] 33image2=right_temp_np[j:h+j][i:w+i]—> 34same=mse(image1,image2) 35print(“loop 1 i: %s j: %s image1: %s image2: %s”%(i,j,image1.size,image2.size)) 36print(same)<ipython-input-34-3ff65825a155>inmse(image1, image2) 1defmse(image1,image2):----> 2diff=(image1.astype(float)-image2.astype(float)) 3error=diff**2 4[w,h]=image1.shape
5den=w*h

ValueError: operands could not be broadcast together with shapes (10,10) (10,11)

Above is the Error. 

 

The code employs if conditions and for loop to scans unequal images from two cameras and checks for matches. 

 

’if_same’ : This is the main function which scans and checks. 

‘mse’ calls another function which calculates squared error.

def mse(image1, image2):
diff=(image1.astype(float)-image2.astype(float))
error=diff**2
[w,h]=image1.shape
den=w*h
mse=error/den

return mse

 

 

def if_same(left_temp, right_temp):

h_L, w_L = left_temp.size
h_R, w_R = right_temp.size

left_temp_np=np.asarray(left_temp)
right_temp_np=np.asarray(right_temp)

diff_w=abs(w_L-w_R)+1
diff_h=abs(h_L-h_R)+1

image1=[]
image2=[]
#same= np.zeros([h,w], np.uint8)
same=0
h=0
w=0

if w_L<=w_R:
if h_L<=h_R:
[w,h]=[w_L,h_L]
#image1=np.zeros[h,w]
#image2=np.zeros[h,w]
i=0
for i in range(0,diff_w):
j=0
for j in range(0,diff_h):
print(j, h, h+j, i, w, w+i)
image1=left_temp_np[0:h][0:w]
image2=right_temp_np[j:h+j][i:w+i]
same=mse(image1, image2)
print(“loop 1 i: %s j: %s image1: %s image2: %s” % (i,j,image1.size,image2.size))
print(same)

elif h_R<h_L:
[w,h]=[w_L,h_R]
i=0
for i in range(0,diff_w):
j=0
for j in range(0,diff_h):
image1=left_temp_np[j:h+j][0:w]
image2=right_temp_np[0:h][i:w+i]
same=mse(image1, image2)
print(“loop 2 i: %s j: %s image1: %s image2: %s” % (i,j,image1.size,image2.size))
print(same)
return same, h, w

elif w_R<w_L:
if h_L<=h_R:
i=0
[w,h]=[w_R,h_L]
for i in range(0,diff_w):
j=0
for j in range(0,diff_h):
image1=left_temp_np[0:h][i:w+i]
image2=right_temp_np[j:h+j][0:w]
same=mse(image1, image2)
print(“loop 3 i: %s j: %s image1: %s image2: %s” % (i,j,image1.size,image2.size))
print(same)

elif h_R<h_L:
i=0
[w,h]=[w_R,h_R]
for i in range(0,diff_w):
j=0
for j in range(0,diff_h):
print(j)
image1=left_temp_np[j:(h+j)][i:(w+i)]
image2=right_temp_np[0:h][0:w]
print(“loop 4 i: %s j: %s image1: %s image2: %s” % (i,j,image1.size,image2.size))
same=mse(image1, image2)
print(same)
return same, h, w

return same, h, w

I have actually tried printing the i,j,w,h  to see if there is the problem. 

0 10 10 0 13 13

The code should slice matrixes of dimensions 10x13 from both images. But I get 10x10 and 10x11. 

 

If the slice is [0:10][0:13] and [1:11][1:14], both will return [10x13]. Correct me, if I’m wrong

 

1 Like

Thanks so much for sharing your solution with the community. Is your problem fully resolved now?

Yeah.It’s solved fully. Thanks for responding Mark. 

–Ram K

1 Like