Сегментация изображения с использованием Mean Shift

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

Вот матрица 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 разных уровня чисел?

Ответ 1

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

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

enter image description here

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

Среднее смещение обычно занимает 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}}  

Или:

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

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

НТН!

Ответ 2

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

Данные изображения преобразуются в пространство возможностей feature space

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

Окна поиска распределены по пространству функций enter image description here

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

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

1.) Средство выборки данных в каждом окне вычисляется enter image description here

2.) Окна SHIFTed в места, равные их ранее вычисленным средним значениям enter image description here

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

Окна, которые попадают в одно и то же место, объединяются enter image description here

Данные группируются в соответствии с обходами окна enter image description here

... например. все данные, которые были пройдены окнами, которые оказались, например, в местоположении "2", образуют кластер, связанный с этим местоположением.

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