Quelqu'un pourrait-il m'aider à comprendre comment fonctionne réellement la segmentation Mean Shift?
Voici une matrice 8x8 que je viens de composer
103 103 103 103 103 103 106 104
103 147 147 153 147 156 153 104
107 153 153 153 153 153 153 107
103 153 147 96 98 153 153 104
107 156 153 97 96 147 153 107
103 153 153 147 156 153 153 101
103 156 153 147 147 153 153 104
103 103 107 104 103 106 103 107
En utilisant la matrice ci-dessus, est-il possible d'expliquer comment la segmentation du décalage moyen séparerait les 3 niveaux de nombres?
Les bases d'abord:
La segmentation du décalage moyen est une technique d'homogénéisation locale très utile pour atténuer les différences d'ombrage ou de tonalité dans les objets localisés. Un exemple vaut mieux que beaucoup de mots:
Action: remplace chaque pixel par la moyenne des pixels dans un voisinage de plage-r et dont la valeur est dans une distance d.
Le décalage moyen prend généralement 3 entrées:
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.
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 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 un choix raisonnable 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 allons afficher un code couleur, ce qui facilite la compréhension de 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 stable non isotrope:
À ce stade, il devrait être clair que vous ne pouvez pas sélectionner le nombre de "couleurs" que vous obtiendrez après l’application du décalage moyen. Alors, montrons comment le 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 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 constater, nous n’avons plus que trois niveaux de sortie.
HTH!
Une segmentation Mean-Shift fonctionne à peu près comme ceci:
Les données d'image sont converties en espace de fonctions
Dans votre cas, tout ce que vous avez sont des valeurs d'intensité, de sorte que l'espace d'entité ne sera qu'unidimensionnel. (Vous pouvez par exemple calculer certaines caractéristiques de texture, puis votre espace de fonctions sera bidimensionnel - et vous segmenterez en fonction de l'intensité et texture)
Les fenêtres de recherche sont réparties sur l'espace des fonctionnalités
Le nombre de fenêtres, la taille de la fenêtre et les emplacements initiaux sont arbitraires pour cet exemple. Vous pouvez les affiner en fonction d'applications spécifiques.
Itérations de décalage moyen:
1.) Les MEAN des échantillons de données dans chaque fenêtre sont calculés
2.) Les fenêtres sont DÉCALÉES aux emplacements égaux à leurs moyennes calculées précédemment
Les étapes 1.) et 2.) sont répétées jusqu'à la convergence, c'est-à-dire que toutes les fenêtres se sont installées aux emplacements finaux
Les fenêtres qui se retrouvent aux mêmes emplacements sont fusionnées
Les données sont regroupées en fonction des traversées de fenêtres
... par exemple. toutes les données traversées par des fenêtres qui se sont terminées à l'emplacement "2", par exemple, formeront un cluster associé à cet emplacement.
Ainsi, cette segmentation produira (comme par hasard) trois groupes. Afficher ces groupes dans le format d'image d'origine peut ressembler à quelque chose comme la dernière image dans la réponse de belisarius . Choisir différentes tailles de fenêtre et emplacements initiaux peut produire des résultats différents.