Matlab:使用矢量化进行模板匹配

时间:2011-11-27 15:30:12

标签: matlab for-loop vectorization

我正在尝试提高此代码的速度,但我无法理解如何在这里使用矢量化(而不是for-loop)。该功能来自我使用SAD template matching的{{3}}。{/ p>

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秒。

2 个答案:

答案 0 :(得分:1)

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

所以,我认为你的速度不会超过22-25秒。

在你的情况下,循环中的代码非常大并且是矢量化的,所以你不会通过分解获得太多。

如果您的模板小得多,可以使用函数im2col进行矢量化,但由于模板非常大,因此需要太多RAM内存。

答案 1 :(得分: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之间的任何功能。