与 imfilter 相比,xcorr2 的图像相关性最大值移动了 2 个像素
max of images correlation with xcorr2 shifted by 2 pixels compared to imfilter
准备实时定点实现的实验代码,我写了下面的函数
function res = imcorr(inIm,kernel)
% res=imfilter(inIm,kernel,'replicate'); %initial implementation
% res=imfilter(inIm,kernel); %same as we crop the result below
res=xcorr2(inIm,kernel); %faster, works with singles, but shifts result by 2 pixels
s=size(inIm);
rect=[fix((size(res,2)-s(2))/2), fix((size(res,1)-s(1))/2), s(2), s(1)];
res=imcrop(res,rect);
然后我使用 https://gist.github.com/goulu/ba70175f870fdb2c25e3 ( edited from http://www.mathworks.com/help/signal/ref/xcorr2.html 中的代码作为测试平台,并注意到 xcorr2 和 imfilter 获得的结果之间在两个方向上都有 2 个像素的偏移:
这是从哪里来的?
不知道为什么,但 imfilter 和 xcorr2 似乎对 odd/even 图像尺寸进行不同的舍入,所以最后我可以通过像这样裁剪来获得相同的结果:
rect=[(size(res,2)-s(2))/2+1.5 (size(res,1)-s(1))/2+1.5 s(2)-1-yoff s(1)-1-xoff];
res=imcrop(res,fix(rect));
准备实时定点实现的实验代码,我写了下面的函数
function res = imcorr(inIm,kernel)
% res=imfilter(inIm,kernel,'replicate'); %initial implementation
% res=imfilter(inIm,kernel); %same as we crop the result below
res=xcorr2(inIm,kernel); %faster, works with singles, but shifts result by 2 pixels
s=size(inIm);
rect=[fix((size(res,2)-s(2))/2), fix((size(res,1)-s(1))/2), s(2), s(1)];
res=imcrop(res,rect);
然后我使用 https://gist.github.com/goulu/ba70175f870fdb2c25e3 ( edited from http://www.mathworks.com/help/signal/ref/xcorr2.html 中的代码作为测试平台,并注意到 xcorr2 和 imfilter 获得的结果之间在两个方向上都有 2 个像素的偏移:
这是从哪里来的?
不知道为什么,但 imfilter 和 xcorr2 似乎对 odd/even 图像尺寸进行不同的舍入,所以最后我可以通过像这样裁剪来获得相同的结果:
rect=[(size(res,2)-s(2))/2+1.5 (size(res,1)-s(1))/2+1.5 s(2)-1-yoff s(1)-1-xoff];
res=imcrop(res,fix(rect));