Question

Comment faire le segment I une image 2D en blobs de valeurs similaires efficacement? L'entrée donnée est une matrice de n des nombres entiers, qui comprend la teinte pour les pixels non-gris et la luminosité des pixels gris.

Je suis en train d'écrire un robot mobile virtuel en utilisant Java, et j'utilise la segmentation pour analyser la carte et aussi l'image de la caméra. Ce problème est bien connu dans Computer Vision , mais quand il est sur une performance du robot ne importe donc je voulais quelques entrées. L'algorithme est ce qui importe, vous pouvez poster le code dans toutes les langues.

Était-ce utile?

La solution

Je downsample, en colourspace et en nombre de pixels, utilisez une méthode de vision (probablement écart des moyennes) et haut de gamme le résultat.

Ceci est bien parce que le sous-échantillonnage augmente également la robustesse au bruit, et rend plus probable que vous obtenez des segments significatifs.

Vous pouvez utiliser floodfill pour lisser les bords après si vous avez besoin de douceur.

Quelques réflexions plus (en réponse à vos commentaires).

1) Est-ce que vous vous mélangez sous-échantillonnées? y [i] = (x [2i] + x [2i + 1]) / 2 Cela devrait éliminer le bruit.

2) À quelle vitesse voulez-vous qu'il soit?

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

Autres conseils

Je ne sais pas si elle est trop efficace, mais vous pouvez essayer d'utiliser un Kohonen réseau de neurones (ou la carte auto-organisatrice; SOM). grouper les valeurs similaires, où chaque pixel contient la couleur d'origine et de la position et que la couleur est utilisée pour le groupement Kohohen

Vous devriez lire avant de mettre en œuvre ce que, comme ma connaissance du réseau Kohonen va jusqu'à ce qu'il est utilisé pour le regroupement des données - donc je ne sais pas ce que les options de performance / viabilité sont pour votre scénario <. / p>

Il y a aussi Hopfield Networks . Ils peuvent être mutilées en groupe à partir de ce que je lis.

Ce que j'ai maintenant:

  1. Faire un tampon de la même taille que l'image d'entrée, initialisée à UNSEGMENTED.
  2. Pour chaque pixel de l'image lorsque la valeur de la mémoire tampon correspondante est pas EPSILON, inonder la mémoire tampon en utilisant la valeur de pixel.

    a. Le contrôle des frontières de l'inondation se fait en vérifiant si pixel est dans <=> (actuellement fixé à 10) de la valeur du pixel d'origine.

    b. algorithme de remplissage Flood .

Problème possible:

La vérification des frontières de l'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 frontière en utilisant la détection de bord, mais peut-être ajouter plus de temps que l'enregistrement 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 <=>, je pourrais choisir au hasard quelques points. Si vous attendez environ 10 blobs, la cueillette des points aléatoires dans cet ordre peut suffire. Inconvénient est que vous pourriez manquer un petit mais utile blob.

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

Une alternative à l'inondation de remplissage est -composants raccordé sur le raccordement algorithme. Ainsi,

  1. classer vos pixels à moindre coût. par exemple. diviser les pixels dans l'espace de couleur.
  2. Exécuter cc pour trouver les blobs
  3. Conserver les blobs de taille significative

Cette approche est largement utilisée dans les approches de vision précoce. Par exemple dans le document fondateur « Blobworld: un système d'image à base d'indexation et de recherche Région ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top