Matlab: сопоставление шаблонов с использованием векторизации - PullRequest
2 голосов
/ 27 ноября 2011

Я пытаюсь улучшить скорость этого кода, но я не могу понять, как использовать здесь векторизацию (вместо цикла 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;

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

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Вы захотите использовать функцию 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.

1 голос
/ 27 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...