首先看Matlab help 里normxcorr2函数中关于归一化二维互相关矩阵的定义:
核心就是模板template 二维矩阵使用 (u,v) 的位移和fixed 矩阵做点乘求和.
其中template 比 fixed 要小. 假设template矩阵是 m∗n 的, fixed矩阵是 M∗N 的.
下面的坐标系都是以matlab的矩阵坐标系来说明的.也就是左上角是坐标原点, 竖直方向往下是x正方向,
水平方向往右是y的正方向.
u=0,v=0 时, 两矩阵左上角 (1,1) 位置对齐.
显然,
1. 当 u>0,v>0 时, template 相对于fixed 是往右下角移动了. x轴移动了 u 单位, y轴移动了v单位.
2. 当 u>0,v<0 时, template 相对于fixed 是往左下角移动了. x轴移动了 u 单位, y轴移动了v单位.
3. 当 u<0,v<0 时, template 相对于fixed 是往左上角移动了. x轴移动了 u 单位, y轴移动了v单位.
4. 当 u<0,v>0 时, template 相对于fixed 是往右上角移动了. x轴移动了 u 单位, y轴移动了v单位.
当然, u,v的取值是有限的, 因为必须要保证template和fixed矩阵是有相交部分的.
否则相关系数都是0. 没有计算意义.
所以,
u的取值是 [−(m−1),M−1] , 共 M+m−1 点,
v的取值是 [−(n−1),N−1] , 共 N+n−1 点.
所以,
最后的相关系数矩阵是 (M+m−1)∗(N+n−1) 大小的.
因为matlab是从 (1,1) 索引开始存储数据的.
所以,
(1,1) 索引处, u=−(m−1)=1−m,v=−(n−1)=1−n .
所以,
已知相关系数矩阵索引(i, j), 对应公式中:
下面是matlab自带的example:
通过normxcorr2函数求template和fixed的偏移量.
这种方法在图像模板匹配中是常用的方法.
注意: imshow输出的figure坐标是图像坐标, 和mat坐标是不同的.
template = .2*ones(11); % Make light gray plus on dark gray background
template(6,3:9) = .6;
template(3:9,6) = .6;
BW = template > 0.5; % Make white plus on black background
figure, imshow(BW), figure, imshow(template)
% Make new image that offsets the template
offsetTemplate = .2*ones(21);
offset = [3 5]; % Shift by 3 rows, 5 columns
offsetTemplate( (1:size(template,1))+offset(1),...
(1:size(template,2))+offset(2) ) = template;
figure, imshow(offsetTemplate)
% Cross-correlate BW and offsetTemplate to recover offset
cc = normxcorr2(BW,offsetTemplate);
[max_cc, imax] = max(abs(cc(:)));
[ypeak, xpeak] = ind2sub(size(cc),imax(1));
corr_offset = [ (ypeak-size(template,1)) (xpeak-size(template,2)) ];
isequal(corr_offset,offset) % 1 means offset was recovered