Объяснение сегментации изображений с использованием среднего сдвига

107

Может ли кто-нибудь помочь мне понять, как на самом деле работает сегментация среднего сдвига?

Вот матрица 8x8, которую я только что составил

  103  103  103  103  103  103  106  104   
  103  147  147  153  147  156  153  104   
  107  153  153  153  153  153  153  107   
  103  153  147  96   98   153  153  104   
  107  156  153  97   96   147  153  107   
  103  153  153  147  156  153  153  101   
  103  156  153  147  147  153  153  104   
  103  103  107  104  103  106  103  107

Используя приведенную выше матрицу, можно ли объяснить, как сегментация среднего сдвига разделит 3 разных уровня чисел?

Sharpie
источник
Три уровня? Я вижу числа около 100 и около 150.
Джон
2
Ну, что касается сегментации, я думал, что числа в середине будут слишком далеко от номеров краев, которые будут включены в этот раздел границы. Вот почему я сказал 3. Я могу ошибаться, так как не понимаю, как работает этот тип сегментации.
Sharpie
О ... может быть, мы понимаем, что уровни означают разные вещи. Все хорошо. :)
Джон
1
Мне нравится принятый ответ, но я не думаю, что он показал всю картину. IMO этот pdf-файл лучше объясняет сегментацию среднего сдвига (я думаю, что использование пространства более высокого измерения в качестве примера лучше, чем 2d). eecs.umich.edu/vision/teaching/EECS442_2012/lectures/…
Helin Wang

Ответы:

204

Сначала основы:

Сегментация среднего сдвига - это метод локальной гомогенизации, который очень полезен для ослабления затенения или различий тональности локализованных объектов. Пример лучше многих слов:

введите описание изображения здесь

Действие: заменяет каждый пиксель средним значением пикселей в окрестности диапазона r, значение которого находится в пределах расстояния d.

Среднее смещение обычно принимает 3 значения:

  1. Функция расстояния для измерения расстояний между пикселями. Обычно евклидово расстояние, но можно использовать любую другую четко определенную функцию расстояния. Manhattan Расстояние это еще один полезный выбор иногда.
  2. Радиус. Все пиксели в пределах этого радиуса (измеренного в соответствии с указанным выше расстоянием) будут учтены в расчетах.
  3. Разница в стоимости. Из всех пикселей внутри радиуса r мы возьмем только те, значения которых находятся в пределах этой разницы, для вычисления среднего

Обратите внимание, что алгоритм не четко определен на границах, поэтому разные реализации дадут вам разные результаты там.

Я НЕ буду обсуждать здесь кровавые математические детали, поскольку их невозможно показать без правильной математической записи, недоступной в StackOverflow, а также потому, что их можно найти в других источниках .

Посмотрим на центр вашей матрицы:

153  153  153  153 
147  96   98   153 
153  97   96   147   
153  153  147  156  

При разумном выборе радиуса и расстояния четыре центральных пикселя получат значение 97 (их среднее значение) и будут отличаться от соседних пикселей.

Давайте посчитаем это в Mathematica . Вместо того, чтобы показывать фактические числа, мы будем отображать цветовую кодировку, чтобы было легче понять, что происходит:

Цветовая кодировка вашей матрицы:

введите описание изображения здесь

Затем берем разумный средний сдвиг:

MeanShiftFilter[a, 3, 3]

И получаем:

введите описание изображения здесь

Где все центральные элементы равны (97, BTW).

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

введите описание изображения здесь

В это время должно быть ясно, что вы не можете выбрать, сколько «цветов» вы получите после применения среднего сдвига. Итак, давайте покажем, как это сделать, потому что это вторая часть вашего вопроса.

Что вам нужно, чтобы иметь возможность заранее установить количество выходных кластеров, так это что-то вроде кластеризации Kmeans .

Для вашей матрицы это работает так:

b = ClusteringComponents[a, 3]

{{1, 1, 1, 1, 1, 1, 1, 1}, 
 {1, 2, 2, 3, 2, 3, 3, 1}, 
 {1, 3, 3, 3, 3, 3, 3, 1}, 
 {1, 3, 2, 1, 1, 3, 3, 1}, 
 {1, 3, 3, 1, 1, 2, 3, 1}, 
 {1, 3, 3, 2, 3, 3, 3, 1}, 
 {1, 3, 3, 2, 2, 3, 3, 1}, 
 {1, 1, 1, 1, 1, 1, 1, 1}}  

Или:

введите описание изображения здесь

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

HTH!

Доктор велизарий
источник
Есть ли в Matlab реализация среднего сдвига для изображения?
Kaushik Acharya
2
@KaushikAcharya См. Shawnlankton.com/2007/11/mean-shift-segmentation-in-matlab
Доктор Велизариус
164

Сегментация среднего сдвига работает примерно так:

Данные изображения преобразуются в пространство функций пространство функций

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

Окна поиска распределены по пространству функций введите описание изображения здесь

Количество окон, размер окон и начальные местоположения в этом примере произвольны - это то, что можно точно настроить в зависимости от конкретных приложений.

Итерации среднего сдвига:

1.) Среднее значение выборок данных в каждом окне вычисляется. введите описание изображения здесь

2.) Окна СДВИГАЮТСЯ в положения, равные их ранее вычисленным средним. введите описание изображения здесь

Шаги 1.) и 2.) повторяются до тех пор, пока все окна не займут окончательные места. введите описание изображения здесь

Окна, которые оказываются в одних и тех же местах, объединяются. введите описание изображения здесь

Данные группируются в соответствии с обходами окон. введите описание изображения здесь

... например, все данные, через которые прошли окна, которые оказались, скажем, в позиции «2», будут формировать кластер, связанный с этим местом.

Таким образом, эта сегментация (по совпадению) даст три группы. Просмотр этих групп в исходном формате изображений может выглядеть примерно как последнее изображение в ответе Велизария . Выбор разных размеров окна и начального расположения может дать разные результаты.

млай
источник
не может ли пространство объектов быть трехмерным с учетом положения каждого пикселя?
Helin Wang
@HelinWang Да, может.
mlai 02
Я понимаю, как окно позиционируется в пространстве 1D функций, но я не понимаю, как ваше объяснение можно применить к алгоритмам среднего сдвига, которые включают, например, расстояние пространственного поиска (например, в пикселях) и спектральное расстояние (разность значений) как в ответе доктора Велизария. Не могли бы вы прояснить это?
Lennert
@Lennert Если я правильно понимаю ваш вопрос, то, по сути, вы должны добавить местоположения пикселей (x, y) в качестве функций или добавить другие функции, основанные на местоположении, в пространство кластеризации. Похоже, что ответ Велизария ссылается на конкретную реализацию в Mathematica, которая может делать что-то более сложное. Это помогает?
mlai 07
1
@Lennert Да, я думаю, ты понял. Я понимаю, почему мой ответ вас сбивает с толку. Я как бы рисовал свои «окна» как двумерные, но на самом деле я пытался изобразить кластеризацию только на одномерных спектральных значениях. Было бы довольно круто визуализировать кластер среднего сдвига в трехмерном пространстве функций с помощью рисунка или анимации (может быть, в один прекрасный день, если у меня будет время)
прекрасный mlai