Вопрос о нормированной взаимной корреляции - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь понять взаимную корреляцию для сопоставления с образцом, поэтому я разработал простой скрипт, который поможет мне понять, что происходит. Я понимаю процесс и сопоставление взаимной корреляции, однако некоторые вещи немного размыты для нормализованной взаимной корреляции и почему она, кажется, лучше работает над проблемой, над которой я работаю, однако я понимаю ее математику. Постановка задачи: для массива 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 и использовать ненормализованную версию, но она все еще не работала. Почему?

Спасибо за помощь

...