2016-06-08 3 views
2

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

Граница выглядит следующим образом:

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 

С приведенной выше схеме, было бы четыре области, которые будут определены.

ответ

4

Функция 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

Спасибо за ваш ответ! Хотя, мой вопрос состоит в том, чтобы маркировать связанные компоненты со значением 0, а не 1. Таким образом, в этом примере должно быть 4 метки для 4 областей. Я думаю, что я могу решить это, рекурсивным образом, но не уверен, как это выглядит. Есть ли у вас какие-либо идеи? – user3919259

+0

Просто выполните ту же процедуру на обратном изображении. Поэтому вызовите функцию с '~ L'. Вам также необходимо указать 4-пиксельные возможности подключения. Таким образом, значения, равные 0, становятся представляющими интерес пикселями, а значения 1 разделяют эти ненулевые пиксели. Это то, что вы ищете? Я буду рад изменить свой ответ, если это так. На самом деле, я считаю, что это правильный ответ для вас, судя по тому, что есть 4 региона. – rayryeng

+0

@ user3919259 Я отредактировал свое сообщение на основе ваших комментариев. Я считаю, что это то, что вы хотите. Удачи. – rayryeng

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