Как ускорить этот вид for-loop?
Я хотел бы вычислить максимум переведенных изображений вдоль направления данной оси. Я знаю об этом.ordfilt2, однако я хотел бы избежать использования инструментов обработки изображений.
Итак, вот код, который у меня есть до сих пор:
imInput = imread('tire.tif');
n = 10;
imMax = imInput(:, n:end);
for i = 1:(n-1)
imMax = max(imMax, imInput(:, i:end-(n-i)));
end
Можно ли избежать использования цикла for для ускорения вычислений, и если да, то как?
Первое редактирование : использование кода Октавы для im2col На самом деле на 50% медленнее.
Второе редактирование : Предварительное распределение, по-видимому, недостаточно улучшило результат.
sz = [size(imInput,1), size(imInput,2)-n+1];
range_j = 1:size(imInput, 2)-sz(2)+1;
range_i = 1:size(imInput, 1)-sz(1)+1;
B = zeros(prod(sz), length(range_j)*length(range_i));
counter = 0;
for j = range_j % left to right
for i = range_i % up to bottom
counter = counter + 1;
v = imInput(i:i+sz(1)-1, j:j+sz(2)-1);
B(:, counter) = v(:);
end
end
imMax = reshape(max(B, [], 2), sz);
Третье редактирование : я покажу тайминги.
2 ответов:
Проверьте ответ на этот вопрос о выполнении скользящей медианы в c. я успешно превратил ее в функцию mex, и это намного быстрее, чем даже ordfilt2. Это займет некоторое время, чтобы сделать максимум, но я уверен, что это возможно.
Для чего это стоит, вот векторизованное решение с использованием функции IM2COL из набора инструментов обработки изображений:
imInput = imread('tire.tif'); n = 10; sz = [size(imInput,1) size(imInput,2)-n+1]; imMax = reshape(max(im2col(imInput, sz, 'sliding'),[],2), sz); imshow(imMax)
Возможно, вы могли бы написать свою собственную версию IM2COL, поскольку она просто состоит из хорошо обработанной индексации, или даже посмотреть, как Октава реализует его.

Comments