2

Comment segmenter efficacement une image 2D en blobs de valeurs similaires? L'entrée donnée est un tableau n d'entier, qui inclut la teinte pour les pixels non gris et la luminosité des pixels gris. Je suis en train d'écrire un robot mobile virtuel utilisant Java, et j'utilise la segmentation pour analyser la carte et aussi l'image de la caméra. C'est un problème bien connu dans Computer Vision, mais quand il est sur une performance de robot est important, je voulais des entrées. L'algorithme est ce qui compte, donc vous pouvez poster du code dans n'importe quelle langue.Comment segmenter efficacement des images 2D en régions/blobs de valeurs similaires?

Répondre

3

Je sous-échantillonnerais, dans l'espace de couleurs et en nombre de pixels, utiliser une méthode de vision (probablement un shift de moyens) et augmenter le résultat.

Cela est utile car le sous-échantillonnage augmente également la robustesse au bruit et augmente la probabilité d'obtenir des segments significatifs.

Vous pouvez utiliser un remplissage pour lisser les bords par la suite si vous avez besoin de douceur.

D'autres réflexions (en réponse à votre commentaire).

1) Avez-vous mélangé pendant que vous étiez sous-échantillonné? y [i] = (x [2i] + x [2i + 1])/2 Ceci devrait éliminer le bruit.

2) À quelle vitesse voulez-vous que ce soit?

3) Avez-vous essayé écart des moyennes dynamiques (Google aussi dynamique x pour tous les algorithmes x)

+0

+1 pour l'idée. C'est en fait la première chose que j'ai essayée, mais 1. Mon image originale est petite (100x100) et je veux préserver la taille de blob et 2. Quand il ramasse le bruit il est amélioré. Dans des situations réelles avec beaucoup de dégradés, ce serait une bonne idée. –

+0

1. Je ne me suis pas mélangé pendant le down sampling, mais j'ai mis du flou gaussien sur l'ensemble de l'image pour réduire au minimum le petit bruit. 2. Je n'ai pas d'objectif spécifique, mais plus rapide signifie une mise à jour plus fréquente pour les robots. 3. Non, sonner beaucoup plus froid que l'inondation. –

0

Ce que j'ai maintenant:

  1. Créer un tampon de la même taille que l'entrée image, initialisée à .
  2. Pour chaque pixel de l'image où la valeur de tampon correspondante n'est pas UNSEGMENTED, inonder le tampon en utilisant la valeur de pixel.

    a. Le contrôle de la frontière de l'inondation est fait en vérifiant si pixel est dans EPSILON (actuellement mis à 10) de la valeur du pixel d'origine.

    b. Flood filling algorithm.

Problème possible:

des contrôles aux frontières de la 2.a. est appelée à plusieurs reprises dans l'algorithme de remplissage des inondations. Je pourrais en faire une recherche si je pouvais précalculer la bordure en utilisant la détection des contours, mais cela pourrait ajouter plus de temps que la vérification en cours.

private boolean isValuesCloseEnough(int a_lhs, int a_rhs) { 
    return Math.abs(a_lhs - a_rhs) <= EPSILON; 
} 

Amélioration possible:

Au lieu de vérifier chaque pixel pour UNSEGMENTED, je pourrais choisir au hasard quelques points. Si vous attendez environ 10 blobs, il peut suffire de choisir des points aléatoires dans cet ordre. L'inconvénient est que vous pourriez manquer un blob utile mais petit.

2

Je ne sais pas si elle est trop efficace, mais vous pouvez essayer d'utiliser un Kohonen neural network (ou, carte d'auto-organisation?; SOM) pour regrouper les valeurs similaires, où chaque pixel contient la couleur et la position d'origine et seule la couleur est utilisée pour le groupement Kohohen. Vous devriez lire avant de l'implémenter, car ma connaissance du réseau Kohonen va aussi loin que celle du regroupement des données - donc je ne sais pas quelles sont les options de performance/viabilité pour votre scénario.

Il existe également Hopfield Networks. Ils peuvent être mutilés dans le regroupement de ce que je lis.

+0

+1 pour une idée intéressante. –

0

Consultez Eyepatch (eyepatch.stanford.edu). Il devrait vous aider pendant la phase d'investigation en fournissant une variété de filtres possibles pour la segmentation.

Questions connexes