Я пытаюсь понять взаимную корреляцию для сопоставления с образцом, поэтому я разработал простой скрипт, который поможет мне понять, что происходит. Я понимаю процесс и сопоставление взаимной корреляции, однако некоторые вещи немного размыты для нормализованной взаимной корреляции и почему она, кажется, лучше работает над проблемой, над которой я работаю, однако я понимаю ее математику. Постановка задачи: для массива I
длины n
со случайными элементами я извлекаю блок m
элементов из I
, начиная со случайной позиции k
Я хочу найти позицию k
, используя крест корреляция. Это 1D эквивалент соответствия шаблону для изображения, но в 1D. Опять же, это всего лишь упражнение. Ниже приведен полный код, который я использую для реализации вышеупомянутого:
pattern_len = 4
img_len = 11
img = numpy.random.rand((img_len))*numpy.random.rand(1)*10
it = numpy.random.randint(0, (img_len-pattern_len))
pattern = img[it:it+pattern_len]
match = numpy.zeros(img_len)
for i in range(0, img_len):
a = 0
b = 0
c = 0
for j in range(0, pattern_len):
v = 0
if (not (i+j > (img_len - 1))):
v = img[i+j]
a += v*pattern[j]
b += v*v
c += pattern[j]*pattern[j]
#match[i] = a
match[i] = a/numpy.sqrt(b*c)
id = numpy.argmax(match)
if (id == it):
print("correct index found, it: {0}, index: {1}".format(it, id))
else:
print("INcorrect index found, it: {0}, index: {1}".format(it, id))
Мой вопрос: если я использую match[i] = a
(взаимная корреляция) вместо match[i] = a/numpy.sqrt(a*b)
(нормализованная взаимная корреляция), я получаю неправильное выводим большую часть времени, но если я использую нормализованную версию, вывод будет правильным каждый раз. Как я уже сказал, я понимаю математику или делаю нормализованную взаимную корреляцию, однако на фундаментальном уровне я не понимаю, почему это работает, когда ненормализованная версия не работает. Я также попытался нормализовать оба входа в диапазоне от -1 до 1 и использовать ненормализованную версию, но она все еще не работала. Почему?
Спасибо за помощь