2015-04-26 3 views
1

настоящее время я использую функцию bwperim следующим образом:Как найти периметр объектов в двоичном изображении?

BW2 = bwperim(BW); 

BW является входным бинарное изображение и BW2 еще один бинарное изображение, которое показывает периметр всех отдельных двоичных объектов в BW. Тем не менее, я не совсем уверен, как работает bwperim, поэтому я хотел бы реализовать алгоритм, который выполняет то, что делает bwperim без использования самой функции.

Как таковой, как bwperim найти периметр объектов в двоичном изображении? Есть ли известный алгоритм, который делает это?

+0

Вы спрашиваете, как реализовать 'bwperim'? Это просто находит периметр всех объектов в двоичном изображении. Самый простой способ сделать это - подорвать изображение с помощью элемента структуры 3 x 3 и вычесть этот результат с помощью исходного бинарного изображения. – rayryeng

+0

@rayryeng может у вас, пожалуйста, покажите мне пример кодирования ?? –

+0

Можно ли использовать 'imerode'? – rayryeng

ответ

2

Одним из простейших методов поиска периметра двоичных объектов в изображениях является выполнение morphological erosion с использованием очень небольшого структурирующего элемента .... обычно 3 x 3 квадрата. Как только вы обнаружите эрозию, вы просто выполняете вычитание изображения с исходным изображением и эродированным результатом.

При выполнении морфологической эрозии площади объектов уменьшаются незначительно, а их периметры также уменьшаются. Используя элемент структурирования 3 x 3, вы уменьшаете периметр пограничных пикселей на 1 пиксель, и поэтому вычитание этого результата с оригиналом даст вам периметр объектов.

Учитывая, что ваш бинарное изображение хранится в BW, вы бы просто сделать это:

se = strel('square', 3); 
BWerode = imerode(BW, se); 
BWper = logical(abs(imsubtract(BWerode, BW))); 

принять к сведению, что, когда мы вычитаем, может быть случай негативных различий. Мы этого не хотим, поэтому возьмем abs, затем вернемся к logical (a.k.a. true/false). BWper содержит изображение, которое находит периметр всех наших объектов. Имейте в виду, что если у вас есть объекты меньше, чем квадрат 3 x 3, то вы не получите никаких результатов периметра ... но я предполагаю, что вы не захотите найти периметр таких маленьких объектов в любом случае.

Вот пример изображения, что у меня есть, что состоит из связки квадратов:

enter image description here

Мы можем прочитать это, чтобы MATLAB, как это так, и это уже двоичная:

BW = imread('http://i.stack.imgur.com/Jk0o0.png'); 

Выполнение вышеуказанного кода поиска по периметру, это изображение, которое мы получаем:

enter image description here

Если вы сравните это с bwperim, вы увидите, что мы получаем более или менее те же результаты.

Смежные вопросы