2011-11-27 108 views
2

我试图提高此代码的速度,但我无法理解如何在此处使用矢量化(而不是for-loop)。该功能来自我使用template matchingSAD的强制。Matlab:模板匹配使用矢量化

function [diffs,time] = search(template,image) 
[hT,wT] = size(template); 
[hI,wI] = size(image); 
h = hI-hT+1; 
w = wI-wT+1; 
diffs = zeros(h,w); 
tic; 
for i = 1:h 
    for j = 1:w 
     t = image(i:i+hT-1,j:j+wT-1)-template(:,:);  % ??? 
     diffs(i,j) = sum(sum(abs(t))); 
    end 
end 
time = toc; 

对于640x480的图像此功能大约22-25秒。

+0

模板的大小是多少? – Oli

+0

取决于图像。在我的情况下,它是480x360。 – 108rom

回答

1

您将要使用图像上的im2col函数和repmat以及您的初始模板。

im_v = im2col(image,[hT wT]); 
template_v = repmat(template(:),1,size(im_v,2)); 

im_v将存储您的矩阵的每个hT x wT块的列向量。现在,您可以执行im_vtemplate_v之间的任何功能。

+0

我尝试过了,但是它失败了,甚至当模板只有20x20的时候,它也失败了......也可以避免使用'repmat',通过使用'bsxfun' – Oli

+0

好知道。我一直在处理非常小的图像,所以我没有尝试缩放我的解决方案。 – bjornsen

1

如果您的模板尺寸为480 * 360,图片尺寸为640 * 480,则您总共需要480 * 360 * 480 * 640 = 5.3084e + 10个操作。

所以,我认为你不会比22-25秒快得多。

就你而言,循环内的代码是相当大和矢量化的,所以你不会因分解而获得太多收益。

如果你的模板要小得多,你可以使用函数im2col向量化,但因为你的模板是非常大的,它需要太多的RAM内存。

+0

好的,也许我会采取另一种尺寸,非常感谢! – 108rom