Ответ 1
Сначала основы:
Сегментация среднего сдвига - это метод локальной гомогенизации, который очень полезен для демпфирования затенения или различий тональности в локализованных объектах. Пример лучше, чем многие слова:
Действие: заменяет каждый пиксель средним значением пикселей в окрестности диапазона-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}}
Или:
Что очень похоже на наш предыдущий результат, но, как вы можете видеть, теперь у нас есть только три выходных уровня.
НТН!