Одним из простейших методов поиска периметра двоичных объектов в изображениях является выполнение 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, то вы не получите никаких результатов периметра ... но я предполагаю, что вы не захотите найти периметр таких маленьких объектов в любом случае.
Вот пример изображения, что у меня есть, что состоит из связки квадратов:
Мы можем прочитать это, чтобы MATLAB, как это так, и это уже двоичная:
BW = imread('http://i.stack.imgur.com/Jk0o0.png');
Выполнение вышеуказанного кода поиска по периметру, это изображение, которое мы получаем:
Если вы сравните это с bwperim
, вы увидите, что мы получаем более или менее те же результаты.
Вы спрашиваете, как реализовать 'bwperim'? Это просто находит периметр всех объектов в двоичном изображении. Самый простой способ сделать это - подорвать изображение с помощью элемента структуры 3 x 3 и вычесть этот результат с помощью исходного бинарного изображения. – rayryeng
@rayryeng может у вас, пожалуйста, покажите мне пример кодирования ?? –
Можно ли использовать 'imerode'? – rayryeng