Simple reconnaissance de l'objet
===RÉSOLU===
Merci pour vos suggestions et commentaires. En travaillant sur la flood_fill algorithme donné dans Début Python Visualisation livre (Chapitre 9 - Traitement de l'Image) j'ai mis ce que j'ai voulu. Je peux compter les objets, obtenir des rectangles englobants pour chaque objet (donc de hauteur et de largeur), et enfin peut construire des tableaux NumPy ou des matrices pour chacun d'eux.
Bien que ce n'est pas une approche optimisée c'est ce que je veux. Le code source (à l'lab2.py) et le fichier png (lab2-particules.png) que j'utilise ont été mis sous http://code.google.com/p/ccnworks/source/browse/#svn/trunk/AtSc450.
Vous avez besoin de NumPy et PIL installé, et matplotlib pour voir l'histogramme. Core du code se trouve dans le objfind fonction où la principale récursive de l'objet de recherche action se produit.
Une nouvelle mise à jour:
SciPy est ndimage.label() fait exactement ce que je veux, aussi.
Bravo pour David-Warde Farley et Zachary Pincus de la NumPy et SciPy listes de diffusion pour pointer ce droit dans les yeux 🙂
=============
Bonjour,
J'ai une image qui contient les ombres de particules de glace mesurée par un spectromètre de particules. Je veux être en mesure d'identifier chaque objet, afin que je puisse ensuite les classer et de les utiliser plus loin dans mes calculs.
En substance, ce que je suis prête à faire est simplement de mettre en œuvre un flou outil de sélection où je peux il suffit de sélectionner chaque entité.
Comment ai-je pu facilement résoudre ce problème? (De préférence à l'aide de Python)
Grâce.
REMARQUE: Dans ma question, je me réfère à chaque connecté pixels comme des objets ou des entités. Mon intention est de les extraire et de créer un tableau NumPy représentations comme indiqué ci-dessous. (J'utilise ici l'objet en haut à gauche; si un pixel existent utilisation 1 si pas d'utilisation de 0. Cet objet de forme est de 3 par 3, ce qui en conséquence de 3 pixels de hauteur par 3 pixels de largeur. Ce sont des projections de la vraie glace-particules sur le domaine 2D, sous l'hypothèse de leur sphéricité et l'équivalent de rayon (hauteur+largeur)/2, et plus tard, la mise à l'échelle-à partir de pixels de taille réelle et le volume des calculs vont suivre)
import numpy as np
np.array([[1,1,1], [1,1,1], [0,0,1]])
array([[1, 1, 1],
[1, 1, 1],
[0, 0, 1]])
Ici est une section de l'image que je vais utiliser.
capture d'écran http://img43.imageshack.us/img43/2327/particles.png
- Simple reconnaissance d'objets sonne comme une contradiction dans les termes à moi.
- Que suggéreriez-vous sinon?
- S'il vous plaît ne dites pas "résolu" dans votre question. Soit accepter la meilleure réponse ou la réponse à votre propre question et d'accepter que.
Vous devez vous connecter pour publier un commentaire.
La numérisation de chaque carré (par exemple, à partir du haut à gauche, de gauche à droite, de haut en bas)
Quand vous frappez un carré bleu alors:
un. Enregistrer cette place que l'emplacement d'un nouvel objet
b. Trouver tous les autres contiguë carrés bleus (par exemple, en regardant les voisins de cette place, et les voisins des voisins de ceux des voisins, etc.) et de les marquer comme faisant partie d'un même objet
Continuer à numériser
Lorsque vous trouvez un autre carré bleu, un test pour voir si c'est une partie d'un objet connu avant de passer à l'étape 2; à l'inverse, dans l'étape 2b, effacer toute la place après que vous avez associé à un objet
J'ai utilisé pour faire ce type d'analyse sur les micrographies et finalement mis tout ce que j'ai besoin d'un traitement de l'image et de l'analyse du package écrit en C, par l'intermédiaire d'Tcl. (Il a travaillé avec 512 x 512 uniquement des images, ce qui explique pourquoi 512 cultures si souvent. Il y avait des images avec des pixels de différentes tailles alloué, mais la plupart du travail a été fait sur 8 bits pixels, ce qui explique pourquoi il n'y a que des affaires de 0xff et le maximum de sens comte de 254 sur une image.)
Brièvement, le " zz " au début de l'commandes Tcl envoie le reste de la ligne pour le paquet de l'analyseur qui appelle à la appropriée de routine C avec les arguments donnés. Juste après le " zz " est un argument qui indique l'entrée et la sortie de la commande. (Il peut y avoir plusieurs entrées, mais une seule sortie.) "r" indique une 512 x 512 x 8 bits de l'image. Le troisième mot est le nom de la commande pour être utilisé, les graphiques, les " marques d'une image comme décrit dans le texte ci-dessous. Donc, "zz rr graphiques "signifie" Appeler le ZZ de l'analyseur; l'entrée d'une de la r de l'image pour les graphiques de la commande et obtenir un r image". Le reste de la Tcl ligne de commande spécifie de la pré-alloué des images à utiliser. (Le " g " de l'image est un ROI, c'est à dire, de la région d'intérêt, de l'image; presque tous les ZZ, les op sont fait en vertu de ROI de contrôle.) Donc, 'r1 r1 g8 "signifie" Utiliser r1 entrée, utiliser r1 sortie (qui est, de marquer l'entrée de l'image elle-même), et de faire l'opération, où le pixel correspondant de l'image du g8 --- qui est, r8, utilisé comme un ROI - - - >0.
Je ne pense pas qu'il est disponible en ligne n'importe où, mais si vous voulez récupérer le code source ou même de compiler tout le toutim, je serai heureux pour vous l'envoyer. Voici un extrait du manuel (mais je pense que j'en vois quelques erreurs dans le manuel, à cette date tardive --- c'est embarrassant ...):
L'exemple 6. Le comptage des fonctionnalités.
Problème
De comptage est une tâche commune. Les éléments comptés sont appelées “fonctions”, et il est habituellement nécessaire pour préparer des images avec soin afin que les caractéristiques correspondent à une un-à-un avec les choses qui sont les objets réels pour être comptés. Ici, cependant, nous ignorons préparation de l'image et d'envisager, au lieu de cela, la mécanique de comptage. Le premier comptage de l'exercice est de découvrir comment de nombreuses fonctionnalités sont sur les images dans le répertoire ./les cellules?
Approche
Tout d'abord, laissez-nous définir la “fonctionnalité”. Une fonction est le plus grand groupe de “set” (non nulle) de pixels qui peut être atteint en voyageant d'un pixel à l'autre nord-sud-est-ouest (haut-bas-droite-gauche) routes, à partir d'un ensemble donné de pixels. Le zz commande qui détecte et les marques de ces caractéristiques sur une image est “zz rr graphiques R:src R:dest G:ROI”, ainsi appelé parce que le terme mathématique pour une telle fonction est un “graphe”. Si tous les pixels d'une image sont fixés, alors il n'existe qu'un seul graphique sur l'image, mais il contient 262144 pixels (512 * 512). Si les pixels sont définies et claires (égal à zéro) dans un motif en damier,
ensuite, il y aura 131072 (512 * 512 /2) les graphiques, mais chacun ne contenant qu'un seul pixel.
Brièvement expliqué, “zz rr graphiques” commence dans le coin supérieur gauche de l'image et analyse chaque
rangée de gauche à droite jusqu'à ce qu'il trouve un ensemble de pixels, puis trouve l'ensemble des pixels attachées à travers le nord, le sud, l'est ou à l'ouest des frontières (“4-connecté”). Il définit ensuite l'ensemble des pixels qui le graphique 1 (0x01). Après la découverte et le marquage graphique 1, il commence à numériser à nouveau au pixel après celui où il a d'abord découvert le graphique 1, cette fois en ignorant les pixels qui appartiennent déjà à un graphe. La première 254 graphiques qu'il trouve sera marqué de façon unique; tous les graphiques trouvé après cela, cependant, sera marqué avec la valeur 255 (0xff)
et ne peuvent donc pas être distingués les uns des autres. La clé pour être en mesure de compter le nombre de graphes avec précision est de traiter chaque image dans les stades, c'est trouver le nombre de graphes sur une image et, si le nombre est supérieur à 254, effacer les 254 graphiques viens de trouver, en répétant le processus jusqu'à 254 ou moins graphiques sont trouvés. Le langage Tcl fournit les moyens de faire le contrôle de cette opération.
Laissez-nous commencer à générer les commandes nécessaires à la lecture d'un ZZ fichier d'image dans une de la R de l'image et la détection et le marquage des graphiques. Avant la boucle de traitement, nous déclarons et zéro d'une variable qui contiendra le nombre total de caractéristiques dans l'image de la série. À l'intérieur de la boucle de traitement, nous commençons par la lecture du fichier d'image dans une de la R de l'image et la détection et le marquage des graphiques.
Ensuite, nous avons zéro des variables à garder la trace des comtes, puis utilisez le “ra max” commande pour savoir si plus de 254 graphiques ont été détectés.
Si nGraphs ne l'égalité 255, puis l'254 compté correctement graphiques doivent être ajoutés au total, les graphiques de 1 à 254 doivent être effacées, et le comte répété autant de fois qu'il le faudra à réduire le nombre de graphes ci-dessous 255.
Lorsque la boucle “while” les sorties, la variable nGraphs doit détenir un nombre inférieur à 255, qui est, un certain nombre de décompte précis des graphiques; il est ajouté à l'augmentation totale du nombre de fonctionnalités à l'image de la série.
Après la boucle de traitement, d'imprimer le nombre total de caractéristiques qui se retrouvent dans la série.
Après la boucle de traitement, d'imprimer le nombre total de caractéristiques qui se retrouvent dans la série.
En regardant l'image que vous avez fourni, tout ce que vous devez faire est d'appliquer une simple région de croissance de l'algorithme.
Si je ont été à l'aide de MATLAB, je voudrais utiliser bwlabel/bwboundaries fonctions. Je crois qu'il y a une fonction équivalente quelque part dans Numpy, ou de l'utilisation OpenCV avec python wrappers comme suggéré par @kwatford
OpenCV a un Python interface que vous pourriez trouver utiles.
Composante connexe de l'analyse peut-être ce que vous cherchez.