Основи спочатку:
Сегментація середнього зсуву - це локальна техніка гомогенізації, яка дуже корисна для демпфування затінення або різниці тональності локалізованих об'єктів. Приклад кращий за багато слів:
Дія: замінює кожен піксель середнім значенням пікселів у межах діапазону 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).
Ви можете повторити кілька разів із "Середнім зсувом", намагаючись отримати більш однорідне забарвлення. Після кількох ітерацій ви досягаєте стабільної неізотропної конфігурації:
Наразі повинно бути зрозуміло, що ви не можете вибрати, скільки «кольорів» ви отримаєте після застосування 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!