Эффективная маркировка границ сегмента после сегментации изображения - PullRequest
4 голосов
/ 28 января 2012

Границу двоичного изображения можно пометить функцией bwboundaries в MATLAB.

Что необходимо сделать для получения границ всех сегментов в виде двоичного изображения?

Я сегментировал изображение и хочу знать, есть ли способ отметить границы между каждым соседним сегментом без применения морфологических операций к каждому сегменту.

Я добавил изображения, чтобы проиллюстрировать, что я хочу сделать.На самом деле я хочу получить двоичное изображение, которое сохраняет розовые пиксели маркера границы между всеми сегментами.Таким образом, я могу наложить их на оригинальное изображение с помощью функции imoverlay Стива Эддина.

Случайно окрашенная маркировка результата сегментации:

enter image description here

Приблизительно отмеченные розовые границы между сегментами:

enter image description here

Ответы [ 3 ]

5 голосов
/ 29 января 2012

Вы можете найти границы региона, используя фильтр диапазона, который находит диапазон интенсивности в окрестности каждого пикселя. Это использует тот факт, что матрица меток имеет ненулевой диапазон только на границах региона.

im = imread('http://i.stack.imgur.com/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);

Эти края также имеют ширину два пикселя. На самом деле, я думаю, что края должны быть шириной в два пикселя; в противном случае регионы будут «терять» пиксели на границе неравномерно.

3 голосов
/ 28 января 2012

Поскольку эрозия и расширение работают и на недвоичных изображениях, вы можете написать

img = imread('http://i.stack.imgur.com/qPiA3.png');
ei = imerode(img,ones(3));
di = imdilate(img,ones(3));
boundaries = ei~=img | di~=img;

В результате получается черно-белое изображение, которое имеет границу на краю каждой цветной области (таким образом, ширина линии будет два пикселя в ширину).

enter image description here

Обратите внимание, что это не будет возвращать упорядоченный список пикселей как bwboundaries, а скорее логическую маску, такую ​​как bwperim, которая является то, что imoverlay необходимо для ввода.

1 голос
/ 29 января 2012

В качестве обходного пути я подумал об использовании функции edge в MATLAB. Во-первых, мне нужно применить что-то вроде label2gray . метки - это результат сегментации (первое изображение в вопросе) в приведенном ниже коде.

grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);
...