我试图理解用于模式匹配的互相关,所以我开发了一个简单的脚本来帮助我了解正在发生的事情。
我确实了解互相关的过程和匹配,但是对于归一化互相关来说,事情有点模糊,为什么它在我正在研究的问题上看起来更好,但是我确实了解其数学原理。
问题陈述:
对于长度为I
且具有随机元素的数组n
,我从一个随机位置m
开始,从I
中提取了一个k
个元素的块使用互相关的位置k
。一维等效于对图像进行模式匹配,但在一维中。同样,这只是一种练习。以下是我用于实现上述功能的完整代码:
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,并使用非标准化的版本,但是它仍然无法正常工作。为什么?
感谢您的帮助