#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')
Дает мне первое сравнение, но как насчет двух матриц numpy, одна из которых, например, сдвинута влево на пару столбцов?
from scipy.signal import correlate2d
corr = correlate2d(matrix1, matrix2)
plt.figure(figsize=(10,10))
plt.imshow(corr)
plt.grid(False)
plt.show()
Выводит корреляцию, и это кажется хорошим методом, но я не понимаю, как отображаются результаты, поскольку различия находятся в правом верхнем углу изображений.
В противном случае:
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
, который определяет, как обрабатывать разные размеры по обеим осям ваших матриц и как далеко сдвигать одну матрицу над другой при вычислении корреляции.