web-dev-qa-db-fra.com

Segmentation de l'image à l'aide du décalage moyen expliqué

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?

100
Sharpie

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:

enter image description here

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:

  1. 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. Le Manhattan Distance est un autre choix utile parfois.
  2. Un rayon. Tous les pixels compris dans ce rayon (mesurés en fonction de la distance ci-dessus) seront pris en compte pour le calcul.
  3. Une différence de valeur. Pour tous les pixels 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.

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:

enter image description here

Ensuite, nous prenons un décalage moyen raisonnable:

MeanShiftFilter[a, 3, 3]

Et nous obtenons:

enter image description here

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:

enter image description here

À 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:

enter image description here

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!

195
Dr. belisarius

Une segmentation Mean-Shift fonctionne à peu près comme ceci:

Les données d'image sont converties en espace de fonctions  feature space

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  enter image description here

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  enter image description here

2.) Les fenêtres sont DÉCALÉES aux emplacements égaux à leurs moyennes calculées précédemment  enter image description here

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  enter image description here

Les fenêtres qui se retrouvent aux mêmes emplacements sont fusionnées  enter image description here

Les données sont regroupées en fonction des traversées de fenêtres  enter image description here

... 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.

156
mlai