Функция bwlabel
из инструментария обработки изображений - идеальная функция, которую вы должны использовать для обозначения каждой непрерывной области ненулевых пикселей в двоичной маске. Однако вы хотите выполнить это на нулевых пикселях, которые обозначены «граничными» пикселями, которые установлены в 1. Поэтому просто используйте обратную сторону бинарной маски, чтобы вы работали на нулевых пикселях вместо ненулевые пиксели. Кроме того, из вашего определения области разделены с использованием 4-пиксельной связи. bwlabel
по умолчанию использует 8-пиксельную связность при поиске непрерывных областей, что означает, что он выглядит в направлениях N, NE, E, SE, S, SW, W и NW. Вы хотите, чтобы вручную указать 4 соединения пикселей, который смотрит только в направлениях N, E, S и W.
Предположим, ваша маска хранилась в переменной L
, просто сделать:
labels = bwlabel(~L, 4);
Результат labels
будет представлять собой карту, которая сообщает вам о членстве в каждом пикселе. Регионы того же членства говорят вам, что эти пиксели принадлежат к одной и той же группе.
Используя ваш пример, мы получим:
>> L = [0 0 0 1 0 0 0 1 0 0
0 0 1 0 0 0 0 1 0 0
1 1 0 1 0 0 0 1 0 0
0 0 0 0 1 0 1 0 0 0];
>> labels = bwlabel(~L, 4)
labels =
1 1 1 0 3 3 3 0 4 4
1 1 0 3 3 3 3 0 4 4
0 0 2 0 3 3 3 0 4 4
2 2 2 2 0 3 0 4 4 4
Каждого остров ноли имеет уникальный идентификатор, где пиксели, принадлежащие к тому же ID принадлежат одному и тому же острову или региону. Если вы не хотите использовать bwlabel
и сделайте это с первых принципов, вы можете обратиться к моему предыдущему сообщению, используя Depth First Search, чтобы найти области подключенных компонентов: How to find all connected components in a binary image in Matlab?. Имейте в виду, что это не эффективный код, поэтому вы должны использовать его только в образовательных и исследовательских целях. Рекомендуется использовать bwlabel
, так как это быстрая функция и хорошо протестирована. Вам также придется модифицировать код, чтобы он не выполнял поиск в 8-пиксельном подключении, и он должен смотреть только на 4 пикселя. Перед использованием кода убедитесь, что вы также инвертируете ввод.
Спасибо за ваш ответ! Хотя, мой вопрос состоит в том, чтобы маркировать связанные компоненты со значением 0, а не 1. Таким образом, в этом примере должно быть 4 метки для 4 областей. Я думаю, что я могу решить это, рекурсивным образом, но не уверен, как это выглядит. Есть ли у вас какие-либо идеи? – user3919259
Просто выполните ту же процедуру на обратном изображении. Поэтому вызовите функцию с '~ L'. Вам также необходимо указать 4-пиксельные возможности подключения. Таким образом, значения, равные 0, становятся представляющими интерес пикселями, а значения 1 разделяют эти ненулевые пиксели. Это то, что вы ищете? Я буду рад изменить свой ответ, если это так. На самом деле, я считаю, что это правильный ответ для вас, судя по тому, что есть 4 региона. – rayryeng
@ user3919259 Я отредактировал свое сообщение на основе ваших комментариев. Я считаю, что это то, что вы хотите. Удачи. – rayryeng