Сначала основы:
Сегментация Среднее смещение - это метод локальной гомогенизации, который очень полезен для демпфирования затенения или различий в тональности локализованных объектов.Пример лучше многих слов:
Действие: заменяет каждый пиксель на среднее значение пикселей в окрестности range-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, кстати).
Вы можете повторять несколько раз с Mean Shift, пытаясь получить более однородную окраску.После нескольких итераций вы получите стабильную неизотропную конфигурацию:
В это время должно быть ясно, что вы не можете выбратьсколько «цветов» вы получите после применения Mean Shift.Итак, давайте покажем, как это сделать, потому что это вторая часть вашего вопроса.
То, что вам нужно, чтобы заранее настроить количество выходных кластеров, - это что-то вроде 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!