Как эффективно сегментировать 2D-изображения в области / объекты с похожими значениями?

Как эффективно разделить 2D-изображение на капли с похожими значениями? Данный вход является массивом целых чисел, который включает оттенок для не-серых пикселей и яркость серых пикселей.

Я пишу виртуального мобильного робота с использованием Java и использую сегментацию для анализа карты, а также изображения с камеры. Это хорошо известная проблема в Computer Vision, но когда речь идет о производительности робота, это важно, поэтому я хотел получить некоторые данные. Алгоритм имеет значение, поэтому вы можете размещать код на любом языке.

5 ответов

Решение

Я бы уменьшил выборку в цветовом пространстве и количестве пикселей, использовал метод зрения (вероятно, означает смещение) и увеличил результат.

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

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

Еще несколько мыслей (в ответ на ваш комментарий).

1) Вы сливались, когда урезали? y[i]=(x[2i]+x[2i+1])/2 Это должно устранить шум.

2) Как быстро вы хотите, чтобы это было?

3) Вы пробовали динамическое средство сдвига?(Также Google для динамического х для всех алгоритмов х)

Не уверен, что это слишком эффективно, но вы можете попробовать использовать нейронную сеть Кохонена (или самоорганизующуюся карту; SOM), чтобы сгруппировать аналогичные значения, где каждый пиксель содержит исходный цвет и положение, и только цвет используется для Кохохен, группировка.

Вы должны прочитать, прежде чем реализовать это, поскольку мои знания о сети Кохонена идут настолько далеко, насколько она используется для группировки данных, поэтому я не знаю, какие параметры производительности / жизнеспособности существуют для вашего сценария.

Есть также Сети Хопфилда. Их можно разбить на группы из того, что я прочитал.

Что у меня сейчас:

  1. Создайте буфер того же размера, что и входное изображение, инициализированный как UNSEGMENTED,
  2. Для каждого пикселя в изображении, где соответствующее значение буфера не UNSEGMENTEDзалейте буфер, используя значение в пикселях.

    а. Проверка границы затопления выполняется путем проверки, находится ли пиксель в пределах EPSILON (в настоящее время установлен на 10) от значения исходного пикселя.

    б. Алгоритм заливки.

Возможная проблема:

Проверка границы 2.a. вызывается много раз в алгоритме заполнения потока. Я мог бы превратить это в поиск, если бы я мог пересчитать границу, используя обнаружение краев, но это может добавить больше времени, чем текущая проверка.

private boolean isValuesCloseEnough(int a_lhs, int a_rhs) {
    return Math.abs(a_lhs - a_rhs) <= EPSILON;
}

Возможное улучшение:

Вместо проверки каждого пикселя на UNSEGMENTEDЯ мог бы случайно выбрать несколько пунктов. Если вы ожидаете около 10 BLOB-объектов, выбор случайных точек в этом порядке может быть достаточным. Недостатком является то, что вы можете пропустить полезный, но маленький шарик.

Проверьте Eyepatch (eyepatch.stanford.edu). Это должно помочь вам на этапе исследования, предоставляя различные возможные фильтры для сегментации.

Альтернативой заливке-заполнению является алгоритм связанных компонентов. Так,

  1. Дешево классифицируйте ваши пиксели. например, разделить пиксели в цветовом пространстве.
  2. Запустите cc, чтобы найти капли
  3. Сохраните капли значительного размера

Этот подход широко используется в подходах раннего видения. Например, в основной статье " Blobworld: система индексации и поиска изображений на региональной основе".

Другие вопросы по тегам