MATLAB: Создание матрицы, как в алгоритме Wavefront

У меня есть такая матрица (13 х 13):

0   0   0   0   0   0   0   0   0   0   0   0   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   0   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   0   0   0   0   0   0   0   0   0   0   0   0

Могу ли я как-то увеличить значения вокруг центрального нуля и нулей, образующих «стены», на единицу на каждой итерации и сделать так?

0   0   0   0   0   0   0   0   0   0   0   0   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   1   2   2   2   2   2   2   2   2   2   1   0
0   1   2   3   3   3   3   3   3   3   2   1   0
0   1   2   3   2   2   2   2   2   3   2   1   0
0   1   2   3   2   1   1   1   2   3   2   1   0
0   1   2   3   2   1   0   1   2   3   2   1   0
0   1   2   3   2   1   1   1   2   3   2   1   0
0   1   2   3   2   2   2   2   2   3   2   1   0
0   1   2   3   3   3   3   3   3   3   2   1   0
0   1   2   2   2   2   2   2   2   2   2   1   0
0   1   1   1   1   1   1   1   1   1   1   1   0
0   0   0   0   0   0   0   0   0   0   0   0   0

person Aidos    schedule 11.03.2015    source источник


Ответы (1)


Если у вас есть набор инструментов для обработки изображений, это однострочный:

%# assume your matrix is called A
result = bwdist(~A,'cityblock')

«результат» — это расстояние от каждого ненулевого пикселя в A до ближайшего нуля, если вы можете шагать только по горизонтали или вертикали.

person Jonas    schedule 11.03.2015
comment
Большое спасибо Йонас. Извините за беспокойство, но знаете ли вы, как я могу написать эту функцию (bwdist) самостоятельно? Вы знаете соответствующий алгоритм? - person Aidos; 12.03.2015
comment
@Fabi: Если у вас нет доступа к набору инструментов для обработки изображений, я предлагаю получить mexopencv и использовать их преобразование расстояния. Это намного быстрее, чем писать дистанционное преобразование самостоятельно. Если вы действительно хотите приготовить собственное преобразование расстояния, посмотрите на этот вопрос для реализации алгоритмов. - person Jonas; 13.03.2015
comment
Алгоритм довольно прост. Инициализируйте вывод 0 везде, где вы хотите, чтобы конечное значение было 0, и inf в противном случае. Затем для каждой строки выполните проход слева направо, при этом вы устанавливаете каждое значение на min(current value, previous value+1). Повторите для каждой строки, но двигаясь справа налево, затем сделайте то же самое для каждого столбца, сначала сверху вниз, а затем снизу вверх. В вашем конкретном примере вы могли бы, конечно, пропустить шаг инициализации, поскольку 0 находятся там, где вы хотите, а все остальное = 1. - person Nicu Stiurca; 15.05.2015