Оптимизация DP в matlab

#matlab #image-processing #optimization #dynamic-programming

#matlab #обработка изображений #оптимизация #динамическое программирование

Вопрос:

У меня есть следующий DP, который я применяю к двоичному изображению (либо 0, либо 1) в Matlab

 [x, y] = size(img);
dp = zeros(x, y);
dp(1,:) = img(1,:);
dp(:,1) = img(:,1);
for i = 2:x
    for j = 2:y
        if img(i, j) == 0
            dp(i, j) = min([dp(i, j - 1), dp(i - 1, j), dp(i - 1, j - 1)])   1;
        end
    end
end
  

Код для больших x и y занимает много времени, возможно, из-за if условия и использования for циклов вместо написания векторизованного кода.

Может ли кто-нибудь оптимизировать это.? Или есть какой-либо подход, который оптимизирует приведенный выше код, используя тот факт, что матрица img содержит либо 0, либо 1 (меньше 1 секунд, чем 0 секунд). Также возможно ли как-то использовать параллельные циклы for для ускорения.?

Ответ №1:

Насколько мне известно, вы не можете реально ускорить это вычисление в целом. Но если вы знаете, что существует очень мало записей, где img(i,j)==0 следующий подход может сэкономить вам немного времени:

 [x, y] = size(img);
dp = zeros(x, y);
dp(1,:) = img(1,:);
dp(:,1) = img(:,1);
[i, j] = find(img(2:end, 2:end) == 0); % Extract only these pixels where we actually need to do something
i = i   1; %correct for removing the first row and column
j = j   1;
for k = 1:numel(i);
    dp(i(k), j(k)) = min([dp(i(k), j(k) - 1), dp(i(k) - 1, j(k)), dp(i(k) - 1, j(k) - 1)])   1;
end
  

Комментарии:

1. На самом деле там меньше записей, где img(i,j) == 1 (хотя и не намного меньше).