【问题标题】:Matlab: template matching using vectorizationMatlab:使用矢量化进行模板匹配
【发布时间】:2012-01-07 08:51:42
【问题描述】:

我正在尝试提高此代码的速度,但我不明白如何在此处使用矢量化(而不是 for 循环)。该功能来自我使用template matchingSAD 的实施。

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

【问题讨论】:

  • 模板的尺寸是多少?
  • 取决于图像。就我而言,它是 480x360。

标签: matlab for-loop vectorization


【解决方案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 之间执行任何您想要的功能。

【讨论】:

  • 我试过了,但由于“内存不足”而失败,即使模板只有 20x20... 你也可以避免使用repmat,使用bsxfun跨度>
  • 很高兴知道。我一直在处理非常小的图像,所以我没有尝试扩大我的解决方案。
【解决方案2】:

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

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

在您的情况下,循环内的代码非常大并且是矢量化的,因此您不会通过因式分解获得太多收益。

如果你的模板小很多,你可以使用函数im2col进行矢量化,但是由于你的模板很大,会占用太多的RAM内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多