这里有很多帖子,我浏览过这些帖子解释了 Python 中标准化互相关的实现。以下是经常引用的一种此类实现。
def normxcorr2(template, image, mode="full"):
template = template - np.mean(template)
image = image - np.mean(image)
a1 = np.ones(template.shape)
# Faster to flip up down and left right then use fftconvolve instead of scipy's correlate
ar = np.flipud(np.fliplr(template))
out = fftconvolve(image, ar.conj(), mode=mode)
image = fftconvolve(np.square(image), a1, mode=mode) - \
np.square(fftconvolve(image, a1, mode=mode)) / (np.prod(template.shape))
# Remove small machine precision errors after subtraction
image[np.where(image < 0)] = 0
template = np.sum(np.square(template))
out = out / np.sqrt(image * template)
# Remove any divisions by 0 or very close to 0
out[np.where(np.logical_not(np.isfinite(out)))] = 0
return out
https://github.com/Sabrewarrior/normxcorr2-python/blob/master/normxcorr2.py
我的理解是,归一化项是两个输入图像的自相关的平方根。
两张图片和分别。我很难理解这条线:
image = fftconvolve(np.square(image), a1, mode=mode) - \
np.square(fftconvolve(image, a1, mode=mode)) / (np.prod(template.shape))
这是计算其中一个输入图像的自相关的聪明方法吗?为什么不采用像“模板”图像那样的自相关呢?