#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
(хотя и не намного меньше).