Найдите, насколько похожи две матрицы numpy

#python #numpy #image-processing #scipy #scikit-image

#python #numpy #обработка изображений #scipy #scikit-изображение

Вопрос:

Я хочу знать, насколько сильно отличаются две матрицы numpy. Matrix1 и Matrix2 могут быть очень похожи, например, на 80% одинаковые значения, но просто сдвинуты… Я прилагаю изображения двух идентичных массивов, которые отличаются небольшой последовательностью значений в правом верхнем углу.

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

compare_images

Дает мне первое сравнение, но как насчет двух матриц numpy, одна из которых, например, сдвинута влево на пару столбцов?

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

Выводит корреляцию, и это кажется хорошим методом, но я не понимаю, как отображаются результаты, поскольку различия находятся в правом верхнем углу изображений.

correlate2d

В противном случае:

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

Возвращает значение в диапазоне 0-1 подобия; например, 0.9942.

Какой может быть хороший метод?

Комментарии:

1. Я думаю, что этот вопрос выходит за рамки SO, и это зависит от вашего приложения и того, что вы хотите сделать с этой мерой. Вы также можете предоставить исходное изображение, если кто-то хочет запустить код и показать результаты в ответных сообщениях.

Ответ №1:

Корреляция между двумя матрицами является законной мерой того, насколько похожи обе. Если обе содержат одинаковые значения, (нормализованная) корреляция будет равна 1, а ваше (максимальное?) значение 0.9942 уже очень близко к этому. Что касается трансляционной (in-) дисперсии вашего результата, более внимательно посмотрите на mode аргумент scipy.signal.correlate2d , который определяет, как обрабатывать разные размеры по обеим осям ваших матриц и как далеко сдвигать одну матрицу над другой при вычислении корреляции.