Les bases d'abord:
La segmentation Mean Shift est une technique d'homogénéisation locale très utile pour amortir les différences d'ombrage ou de tonalité dans des objets localisés. Un exemple vaut mieux que plusieurs mots:
Action: remplace chaque pixel par la moyenne des pixels dans un voisinage range-r et dont la valeur est à une distance d.
Le décalage moyen prend généralement 3 entrées:
- Une fonction de distance pour mesurer les distances entre les pixels. Habituellement, la distance euclidienne, mais toute autre fonction de distance bien définie peut être utilisée. La Manhattan Distance est parfois un autre choix utile.
- Un rayon. Tous les pixels dans ce rayon (mesurés selon la distance ci-dessus) seront pris en compte pour le calcul.
- Une différence de valeur. De tous les pixels à l'intérieur du rayon r, nous ne prendrons que ceux dont les valeurs sont comprises dans cette différence pour calculer la moyenne
Veuillez noter que l'algorithme n'est pas bien défini aux frontières, donc différentes implémentations vous donneront des résultats différents là-bas.
Je ne discuterai PAS des détails mathématiques sanglants ici, car ils sont impossibles à montrer sans une notation mathématique appropriée, non disponible dans StackOverflow, et aussi parce qu'ils peuvent être trouvés à partir de bonnes sources ailleurs .
Regardons le centre de votre matrice:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
Avec des choix raisonnables de rayon et de distance, les quatre pixels centraux auront la valeur 97 (leur moyenne) et seront différents des pixels adjacents.
Calculons-le dans Mathematica . Au lieu d'afficher les chiffres réels, nous afficherons un code couleur, il est donc plus facile de comprendre ce qui se passe:
Le code couleur de votre matrice est:
Ensuite, nous prenons un décalage moyen raisonnable:
MeanShiftFilter[a, 3, 3]
Et nous obtenons:
Où tous les éléments centraux sont égaux (à 97, BTW).
Vous pouvez itérer plusieurs fois avec Mean Shift, en essayant d'obtenir une coloration plus homogène. Après quelques itérations, vous arrivez à une configuration non isotrope stable:
À ce stade, il devrait être clair que vous ne pouvez pas sélectionner le nombre de «couleurs» que vous obtenez après l'application de Mean Shift. Alors, montrons comment faire, car c'est la deuxième partie de votre question.
Ce dont vous avez besoin pour pouvoir définir le nombre de clusters de sortie à l'avance est quelque chose comme le clustering Kmeans .
Il fonctionne de cette façon pour votre matrice:
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}}
Ou:
Ce qui est très similaire à notre résultat précédent, mais comme vous pouvez le voir, nous n'avons plus que trois niveaux de sortie.
HTH!