Как ускорить этот вид петли? - PullRequest
4 голосов
/ 24 июня 2011

Я хотел бы вычислить максимум переведенных изображений вдоль направления данной оси.Я знаю о 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 ]

3 голосов
/ 24 июня 2011

Для чего стоит, вот векторизованное решение с использованием функции 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)

screenshot

Возможно, вы могли бы написать свою собственную версию IM2COL, поскольку она просто состоит из хорошо составленной индексации, или даже посмотреть, как Octave реализует it.

2 голосов
/ 25 июня 2011

Проверьте ответ на этот вопрос о выполнении скользящей медианы в c.Я успешно превратил это в mex-функцию, и это намного быстрее, чем даже ordfilt2.Для достижения максимума потребуется некоторая работа, но я уверен, что это возможно.

Скользящая медиана в реализации C - Turlach

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