2016-01-13 5 views
1

Я хочу сравнить два фрагмента изображения таким образом, чтобы, если они были точно такими же, результат должен быть равен 1, а если они соответствуют 60 процентам, то ответ должен быть равен 0,6.процентное различие между двумя изображениями в python с использованием коэффициента корреляции

В Matlab я могу сделать это с помощью команды corr2, но в python я не смог найти способ. Я пробовал numpy.corrcoef, но он возвращает матрицу, и scipy.signal.correlate2d возвращает то же самое.

Это то, что я пробовал:

import numpy as np 
import matplotlib.pyplot as plt 
from skimage.filter import threshold_otsu 
import matplotlib.cm as cm 
import Image 
import scipy 
from PIL import Image as im 
fname = 'testi.jpg' 
image = Image.open(fname).convert("L") 
arr = np.asarray(image) 
global_thresh = threshold_otsu(arr) 

global_otsu = arr >= global_thresh 
global_otsu = np.invert(global_otsu).astype(int) 
a1 = global_otsu[80:150,1350:1350+160] 
fname1 = 'testi2.jpg' 
image1 = Image.open(fname1).convert("L") 
arr1 = np.asarray(image1) 
global_thresh1 = threshold_otsu(arr1) 

global_otsu1 = arr1 >= global_thresh1 
global_otsu1 = np.invert(global_otsu1).astype(int) 
a2 = global_otsu1[80:150,1350:1350+160] 

co = scipy.signal.correlate2d(a1,a2) 

plt.gray() 
plt.subplot(121) 
plt.imshow(a1) 
plt.subplot(122) 
plt.imshow(a2) 

plt.show() 

и результат:

[[0 0 0 ..., 0 0 0] 
[0 0 0 ..., 0 0 0] 
[0 0 0 ..., 0 0 0] 
..., 
[0 0 0 ..., 0 0 0] 
[0 0 0 ..., 0 0 0] 
[0 0 0 ..., 0 0 0]] 

Это образы, которые я хочу, чтобы сравнить:

images that i want to compare

+0

образа собирается быть таким же размером? – EvilTak

+0

да, они будут такого же размера. –

+0

Изображения @EvilTak будут одинакового размера –

ответ

1

С вы хотите сравнить пиксель за пикселем, вы можете выполнить корреляцию на сплющенном i маги,:

cm = np.corrcoef(a1.flat, a2.flat) 

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

r = cm[0, 1] 

Edit: Существует проблема с использованием корреляции для сравнения изображений. Если какой-либо из них полностью плоский (все пиксели одинакового значения), корреляция не определена.

Если изображение бинарное можно вместо просто вычислить процент отказов равных пикселей:

agreement = np.sum(a == b)/a.size 
+0

Удивительный брат, которого ты сделал в тот день, благодарит много. –

+0

Приятно слышать. Я добавил некоторую информацию в ответ, который вам может пригодиться. – kazemakase

Смежные вопросы