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

StackOverflow https://stackoverflow.com/questions/355398

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

Существуют также Сети Хопфилда.Они могут быть разбиты на группы из того, что я прочитал.

То, что у меня есть сейчас:

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

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

    b. Алгоритм заполнения флудом.

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

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

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

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

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

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

Альтернативой заливке потоком является подключенные компоненты алгоритм.Итак,

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top