Как нарисовать контур объектов в матрице меток - PullRequest
2 голосов
/ 10 октября 2011

У меня есть метка матрицы сегментированного изображения. Например,


1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4

Теперь я хотел бы нарисовать контур каждого объекта так, чтобы значение пикселя края каждого объекта составляло 1, а значение других пикселей - 0.

как то так


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

Я надеюсь, что есть функция, которая сделает это в Matlab, но я не знаю.

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Ответ от @ Laurent ' позволяет вам использовать 4-соединенную маркировку и работает до тех пор, пока все объекты на вашем изображении имеют ширину не менее трех пикселей.

Если ваш периметр должен быть 8-соединенным, или если ваши объекты могут быть узкими, вам следует рассмотреть повторное применение BWPERIM (при условии, опять же, что A - это ваше изображение):

conn = 8; %# select connectedness
nLbl = max(A(:)); %# note this works even if some labels are missing

out = false(size(A)); %# preassign the output

for lbl = 1:nLbl
    %# get the perimeter for each object
    out = out | bwperim(A==lbl,connn);
end
1 голос
/ 10 октября 2011

Пусть A будет вашей матрицей, я думаю, это то, что вы ищете:

(conv2(A,[1 -2 1],'same') ~=0)|(conv2(A,[1; -2; 1],'same') ~=0)

Вот результат с вашим примером:

 1     1     1     1     1     1     1     1     1     1     1     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     1     1     1     1     1     1     1     1     1     1     1
0 голосов
/ 10 октября 2011

Я не могу вспомнить синтаксис Matlab, но я бы предложил алгоритм по аналогии с функцией, которая определяет максимум значений от x-1, y-1 до x + 1, y + 1 и вычитаетминимум того же диапазона.Если это 0, то вам нужен вывод 0, в противном случае 1.

Возможно, вам придется слегка подправить его для края изображения, возможно, с любым кодом, получающим значение каждого пикселя, возвращающее -1 для координат, которыенаходятся вне диапазона или что-то в этом роде.

...