У меня есть следующий код matlab в моем проекте. image_working
- это логическое изображение, результат обнаружения края. Ниже петля расширяется каждой белой точкой, чтобы быть по существу крестом с шириной width
(это так позже вызов imfill()
найти более закрытые регионы. Четыре если заявления проверить, что каждая точка находится в пределах первоначальных границ.Матрица расширения краев векторизации
[edge_row, edge_col] = find(image_working);
for width = 1:width_edge_widen
for i = 1:length(edge_row)
if (edge_row(i) + width <= m)
image_working(edge_row(i) + width, edge_col(i)) = 1;
end
if (edge_row(i) - width >= 1)
image_working(edge_row(i) - width, edge_col(i)) = 1;
end
if (edge_col(i) + width <= n)
image_working(edge_row(i), edge_col(i) + width) = 1;
end
if (edge_col(i) - width >= 1)
image_working(edge_row(i), edge_col(i) - width) = 1;
end
end
end
Я подозреваю, что есть хороший способ его векторизации и избежать цикла верхнего уровня, но я не понимаю, как это сделать. Просто индексирование (например, image_working(edge_row, edge_col)
) не работает, так как это даст прямоугольная область, а не отдельные точки. Линейное индексирование (вызов inds = find(image_working)
) нежелательно, потому что трудно выполнять как вертикальные, так и горизонтальные сдвиги, хотя может быть и векторизованное преобразование по индексам, о которых я не думал. Любые советы?
Вы просто хотите размножать двоичные пиксели? Как насчет размытия всего изображения, например: imout = image_working; для width = 1: width_edge_widen; imout = imout | image_working (:, [ones (1, width), 1: end-width]) | image_working (:, [width + 1: end, ones (1, width)]) | image_working ([ones (1, width), 1: end-width], :) | image_working ([width + 1: end, ones (1, width)], :); конец . В зависимости от разреженности изображения это много операций, но оно векторизовано. – dpwe