Pleasant94
Pleasant94

Reputation: 511

Find how much similar are two numpy matrices

I want to know how much different are two numpy matrices. Matrix1 and Matrix2 could be much similar, like 80% same values but just shifted... I attach images of two identical arrays that differ in a little sequence of values in top right.

from skimage.util import compare_images
#matrix1 & matrix2 are numpy arrays
compare_images(matrix1, matrix2, method='diff')

compare_images

Gives me a first comparison, but what about two numpy matrices, one of which is, for example, left-shifted by a couple of columns?

from scipy.signal import correlate2d
corr = correlate2d(matrix1, matrix2)
plt.figure(figsize=(10,10))
plt.imshow(corr)
plt.grid(False)
plt.show()

Prints out correlation and it seems a nice method, but I do not understand how the results are displayed, since the differences are in top right of the images.

correlate2d

Otherwise:

picture1_norm = picture1/np.sqrt(np.sum(picture1**2))
picture2_norm = picture2/np.sqrt(np.sum(picture2**2))
print(np.sum(picture2_norm*picture1_norm))

Returns a value in range 0-1 of similarity; for example 0.9942.

What could be a good method?

Upvotes: 2

Views: 435

Answers (1)

grmmgrmm
grmmgrmm

Reputation: 1408

Correlation between two matrices is a legitimate measure of how similar both are. If both contain the same values the (normalized) correlation will be 1 and your (max?) value of 0.9942 is already very close to that. Regarding translational (in-)variance of your result have a closer look at the mode argument of scipy.signal.correlate2d which defines how to handle differing sizes along both axes of your matrices and how far to slide one matrix over the other when calculating the correlation.

Upvotes: 1

Related Questions