Сначала основы:
Сегментация среднего сдвига - это метод локальной гомогенизации, который очень полезен для ослабления затенения или различий тональности локализованных объектов. Пример лучше многих слов:
Действие: заменяет каждый пиксель средним значением пикселей в окрестности диапазона r, значение которого находится в пределах расстояния d.
Среднее смещение обычно принимает 3 значения:
- Функция расстояния для измерения расстояний между пикселями. Обычно евклидово расстояние, но можно использовать любую другую четко определенную функцию расстояния. Manhattan Расстояние это еще один полезный выбор иногда.
- Радиус. Все пиксели в пределах этого радиуса (измеренного в соответствии с указанным выше расстоянием) будут учтены в расчетах.
- Разница в стоимости. Из всех пикселей внутри радиуса 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!