Matlab: сопоставление шаблонов с использованием векторизации

Я пытаюсь улучшить скорость этого кода, но я не могу понять, как здесь использовать векторизацию (вместо цикла for). Эта функция взята из моего внедрения SAD с использованием соответствие шаблону.

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;

Для изображения 640х480 эта функция работает около 22-25 секунд.


person 108rom    schedule 27.11.2011    source источник
comment
Каков размер шаблона?   -  person Oli    schedule 27.11.2011
comment
Зависит от изображения. В моем случае это было 480x360.   -  person 108rom    schedule 27.11.2011


Ответы (2)


Вы захотите использовать функцию im2col для изображения и функцию repmat для исходного шаблона.

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

im_v будет хранить векторы-столбцы каждого hT x wT блока вашей матрицы. Теперь вы можете выполнять любую функцию между im_v и template_v.

person bjornsen    schedule 27.11.2011
comment
Я пробовал это, но это не удалось из-за нехватки памяти, даже когда шаблон был только 20x20... также вы можете избежать использования repmat, используя bsxfun - person Oli; 27.11.2011
comment
Хорошо знать. Я работал с очень маленькими изображениями, поэтому не пытался масштабировать свое решение. - person bjornsen; 28.11.2011

Если ваш шаблон имеет размер 480*360, а ваше изображение 640*480, всего вы хотите сделать 480*360*480*640=5.3084e+10 операций.

Так что я не думаю, что вы можете ехать намного быстрее, чем 22-25 секунд.

В вашем случае код внутри цикла довольно большой и векторизованный, поэтому вы не сильно выиграете от факторизации.

Если бы ваш шаблон был намного меньше, вы могли бы использовать функцию im2col для векторизации, но, поскольку ваш шаблон очень большой, он занял бы слишком много оперативной памяти.

person Oli    schedule 27.11.2011